Skip to content
  • Ulrich Drepper's avatar
    F_DUPFD_CLOEXEC implementation · 22d2b35b
    Ulrich Drepper authored
    
    
    One more small change to extend the availability of creation of file
    descriptors with FD_CLOEXEC set.  Adding a new command to fcntl() requires
    no new system call and the overall impact on code size if minimal.
    
    If this patch gets accepted we will also add this change to the next
    revision of the POSIX spec.
    
    To test the patch, use the following little program.  Adjust the value of
    F_DUPFD_CLOEXEC appropriately.
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #include <errno.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #ifndef F_DUPFD_CLOEXEC
    # define F_DUPFD_CLOEXEC 12
    #endif
    
    int
    main (int argc, char *argv[])
    {
      if  (argc > 1)
        {
          if (fcntl (3, F_GETFD) == 0)
    	{
    	  puts ("descriptor not closed");
    	  exit (1);
    	}
          if (errno != EBADF)
    	{
    	  puts ("error not EBADF");
    	  exit (1);
    	}
    
          exit (0);
        }
      int fd = fcntl (STDOUT_FILENO, F_DUPFD_CLOEXEC, 0);
      if (fd == -1 && errno == EINVAL)
        {
          puts ("F_DUPFD_CLOEXEC not supported");
          return 0;
        }
      if (fd != 3)
        {
          puts ("program called with descriptors other than 0,1,2");
          return 1;
        }
    
      execl ("/proc/self/exe", "/proc/self/exe", "1", NULL);
      puts ("execl failed");
      return 1;
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    Signed-off-by: default avatarUlrich Drepper <drepper@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: <linux-arch@vger.kernel.org>
    Cc: Kyle McMartin <kyle@mcmartin.ca>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    22d2b35b