Home | History | Annotate | Download | only in tests
      1 #include <errno.h>
      2 #include <fcntl.h>
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <sys/resource.h>
      6 #include <unistd.h>
      7 #include "fdleak.h"
      8 
      9 int main(int argc, char **argv)
     10 {
     11    struct rlimit oldrlim;
     12    struct rlimit newrlim;
     13    int fd;
     14 
     15    CLOSE_INHERITED_FDS;
     16 
     17    if (getrlimit(RLIMIT_NOFILE, &oldrlim) < 0)
     18    {
     19       perror("getrlimit");
     20       exit(1);
     21    }
     22 
     23    newrlim.rlim_cur = oldrlim.rlim_cur / 2;
     24    newrlim.rlim_max = oldrlim.rlim_max;
     25 
     26    if (setrlimit(RLIMIT_NOFILE, &newrlim) < 0)
     27    {
     28       perror("setrlimit");
     29       exit(1);
     30    }
     31 
     32    if (getrlimit(RLIMIT_NOFILE, &newrlim) < 0)
     33    {
     34       perror("getrlimit");
     35       exit(1);
     36    }
     37 
     38    if (newrlim.rlim_cur != oldrlim.rlim_cur / 2)
     39    {
     40       fprintf(stderr, "rlim_cur is %llu (should be %llu)\n",
     41               (unsigned long long)newrlim.rlim_cur,
     42               (unsigned long long)oldrlim.rlim_cur / 2);
     43    }
     44 
     45    if (newrlim.rlim_max != oldrlim.rlim_max)
     46    {
     47       fprintf(stderr, "rlim_max is %llu (should be %llu)\n",
     48               (unsigned long long)newrlim.rlim_max,
     49               (unsigned long long)oldrlim.rlim_max);
     50    }
     51 
     52    newrlim.rlim_cur -= 3; /* allow for stdin, stdout and stderr */
     53 
     54    while (newrlim.rlim_cur-- > 0)
     55    {
     56       if (open("/dev/null", O_RDONLY) < 0)
     57       {
     58          perror("open");
     59       }
     60    }
     61 
     62    if ((fd = open("/dev/null", O_RDONLY)) >= 0)
     63    {
     64       fprintf(stderr, "open succeeded with fd %d - it should have failed!\n", fd);
     65    }
     66    else if (errno != EMFILE)
     67    {
     68       perror("open");
     69    }
     70 
     71    exit(0);
     72 }
     73