vgdb: Handle EAGAIN in read_buf
[valgrind.git] / none / tests / rlimit_nofile.c
blob4410c3e489bca433fc6702bf748e54315d2b09e1
1 #include <errno.h>
2 #include <fcntl.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sys/time.h>
6 #include <sys/resource.h>
7 #include <unistd.h>
8 #include "fdleak.h"
9 #include "config.h"
11 int main(int argc, char **argv)
13 struct rlimit oldrlim;
14 struct rlimit newrlim;
15 int fd;
17 CLOSE_INHERITED_FDS;
19 if (getrlimit(RLIMIT_NOFILE, &oldrlim) < 0)
21 perror("getrlimit");
22 exit(1);
25 int expected_errno;
26 #if defined(VGO_freebsd)
27 expected_errno = EPERM;
28 #else
29 expected_errno = EINVAL;
30 #endif
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");
38 #else
39 fprintf(stderr, "setrlimit exceeding hardlimit must set errno=EINVAL\n");
40 #endif
41 exit(1);
44 else
46 fprintf(stderr, "setrlimit exceeding hardlimit must return -1\n");
47 exit(1);
50 newrlim.rlim_cur = oldrlim.rlim_max;
51 newrlim.rlim_max = oldrlim.rlim_max+1;
52 if (setrlimit(RLIMIT_NOFILE, &newrlim) == -1)
54 if (errno != EPERM) {
55 fprintf(stderr, "setrlimit changing hardlimit must set errno=EPERM\n");
56 exit(1);
59 else
61 fprintf(stderr, "setrlimit changing hardlimit must return -1\n");
62 exit(1);
65 newrlim.rlim_cur = oldrlim.rlim_cur / 2;
66 newrlim.rlim_max = oldrlim.rlim_max;
68 if (setrlimit(RLIMIT_NOFILE, &newrlim) < 0)
70 perror("setrlimit");
71 exit(1);
74 if (getrlimit(RLIMIT_NOFILE, &newrlim) < 0)
76 perror("getrlimit");
77 exit(1);
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)
100 perror("open");
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)
110 perror("open");
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. */
117 exit(0);