(root)/
xz-5.4.5/
src/
common/
tuklib_open_stdxxx.c
       1  ///////////////////////////////////////////////////////////////////////////////
       2  //
       3  /// \file       tuklib_open_stdxxx.c
       4  /// \brief      Make sure that file descriptors 0, 1, and 2 are open
       5  //
       6  //  Author:     Lasse Collin
       7  //
       8  //  This file has been put into the public domain.
       9  //  You can do whatever you want with this file.
      10  //
      11  ///////////////////////////////////////////////////////////////////////////////
      12  
      13  #include "tuklib_open_stdxxx.h"
      14  
      15  #ifndef TUKLIB_DOSLIKE
      16  #	include <stdlib.h>
      17  #	include <errno.h>
      18  #	include <fcntl.h>
      19  #	include <unistd.h>
      20  #endif
      21  
      22  
      23  extern void
      24  tuklib_open_stdxxx(int err_status)
      25  {
      26  #ifdef TUKLIB_DOSLIKE
      27  	// Do nothing, just silence warnings.
      28  	(void)err_status;
      29  
      30  #else
      31  	for (int i = 0; i <= 2; ++i) {
      32  		// We use fcntl() to check if the file descriptor is open.
      33  		if (fcntl(i, F_GETFD) == -1 && errno == EBADF) {
      34  			// With stdin, we could use /dev/full so that
      35  			// writing to stdin would fail. However, /dev/full
      36  			// is Linux specific, and if the program tries to
      37  			// write to stdin, there's already a problem anyway.
      38  			const int fd = open("/dev/null", O_NOCTTY
      39  					| (i == 0 ? O_WRONLY : O_RDONLY));
      40  
      41  			if (fd != i) {
      42  				if (fd != -1)
      43  					(void)close(fd);
      44  
      45  				// Something went wrong. Exit with the
      46  				// exit status we were given. Don't try
      47  				// to print an error message, since stderr
      48  				// may very well be non-existent. This
      49  				// error should be extremely rare.
      50  				exit(err_status);
      51  			}
      52  		}
      53  	}
      54  #endif
      55  
      56  	return;
      57  }