6 #include <sys/resource.h>
11 int main(int argc
, char **argv
)
13 struct rlimit oldrlim
;
14 struct rlimit newrlim
;
19 if (getrlimit(RLIMIT_NOFILE
, &oldrlim
) < 0)
26 #if defined(VGO_freebsd)
27 expected_errno
= EPERM
;
29 expected_errno
= EINVAL
;
31 newrlim
.rlim_cur
= oldrlim
.rlim_max
+1;
32 newrlim
.rlim_max
= oldrlim
.rlim_max
;
33 if (setrlimit(RLIMIT_NOFILE
, &newrlim
) == -1)
35 if (errno
!= expected_errno
) {
36 #if defined(VGO_freebsd)
37 fprintf(stderr
, "setrlimit exceeding hardlimit must set errno=EPERM\n");
39 fprintf(stderr
, "setrlimit exceeding hardlimit must set errno=EINVAL\n");
46 fprintf(stderr
, "setrlimit exceeding hardlimit must return -1\n");
50 newrlim
.rlim_cur
= oldrlim
.rlim_max
;
51 newrlim
.rlim_max
= oldrlim
.rlim_max
+1;
52 if (setrlimit(RLIMIT_NOFILE
, &newrlim
) == -1)
55 fprintf(stderr
, "setrlimit changing hardlimit must set errno=EPERM\n");
61 fprintf(stderr
, "setrlimit changing hardlimit must return -1\n");
65 newrlim
.rlim_cur
= oldrlim
.rlim_cur
/ 2;
66 newrlim
.rlim_max
= oldrlim
.rlim_max
;
68 if (setrlimit(RLIMIT_NOFILE
, &newrlim
) < 0)
74 if (getrlimit(RLIMIT_NOFILE
, &newrlim
) < 0)
80 if (newrlim
.rlim_cur
!= oldrlim
.rlim_cur
/ 2)
82 fprintf(stderr
, "rlim_cur is %llu (should be %llu)\n",
83 (unsigned long long)newrlim
.rlim_cur
,
84 (unsigned long long)oldrlim
.rlim_cur
/ 2);
87 if (newrlim
.rlim_max
!= oldrlim
.rlim_max
)
89 fprintf(stderr
, "rlim_max is %llu (should be %llu)\n",
90 (unsigned long long)newrlim
.rlim_max
,
91 (unsigned long long)oldrlim
.rlim_max
);
94 newrlim
.rlim_cur
-= 3; /* allow for stdin, stdout and stderr */
96 while (newrlim
.rlim_cur
-- > 0)
98 if (open("/dev/null", O_RDONLY
) < 0)
104 if ((fd
= open("/dev/null", O_RDONLY
)) >= 0)
106 fprintf(stderr
, "open succeeded with fd %d - it should have failed!\n", fd
);
108 else if (errno
!= EMFILE
)
113 /* We used to test setrlimit(RLIMIT_NOFILE, NULL) -1 || errno != EFAULT,
114 but glibc doesn't give any guarantees that won't just crash, in
115 newer versions it just silently succeeds... See bug #385912. */