# # setrlimit.t # use BSD::Resource; # use strict; my @LIM = sort keys %{ get_rlimits() }; print "1..", scalar @LIM, "\n";; my $test_no = 1; for my $lim (@LIM) { print "# lim = $lim\n"; if ($^O =~ /^netbsd/ && $lim eq 'RLIMIT_STACK') { print "ok $test_no # SKIP $^O $lim\n"; next; } my ($old_soft, $old_hard) = getrlimit($lim); print "# old_soft = $old_soft, old_hard = $old_hard\n"; my ($try_soft, $try_hard ) = map { ($_ == RLIM_INFINITY) ? RLIM_INFINITY : int(0.75 * $_) } ($old_soft, $old_hard); print "# try_soft = $try_soft, try_hard = $try_hard\n"; if ($try_soft == RLIM_INFINITY) { print "ok $test_no # SKIP soft_limit == RLIM_INFINITY\n"; } else { my $success = setrlimit($lim, $try_soft, $try_hard); if ($success) { print "# setrlimit($lim, $try_soft) = OK\n"; my $new_soft = getrlimit($lim); print "# getrlimit($lim) = $new_soft\n"; # ASSUMPTION: setrlimit() requests are rounded DOWN, not up. if (($new_soft > 0 || $old_soft == 0) && $new_soft <= $try_soft) { print "ok $test_no # $try_soft <= $new_soft\n"; } else { print "NOT ok $test_no # $try_soft > $new_soft\n"; } } else { print "NOT ok $test_no # setrlimit($lim, $try_soft, $try_hard) failed: $!\n"; } } $test_no++; } exit(0);