1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD 2*3b35e7eeSXin LI 381ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 481ad8388SMartin Matuska // 581ad8388SMartin Matuska /// \file tuklib_open_stdxxx.c 681ad8388SMartin Matuska /// \brief Make sure that file descriptors 0, 1, and 2 are open 781ad8388SMartin Matuska // 881ad8388SMartin Matuska // Author: Lasse Collin 981ad8388SMartin Matuska // 1081ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 1181ad8388SMartin Matuska 1281ad8388SMartin Matuska #include "tuklib_open_stdxxx.h" 1381ad8388SMartin Matuska 1481ad8388SMartin Matuska #ifndef TUKLIB_DOSLIKE 1581ad8388SMartin Matuska # include <stdlib.h> 1681ad8388SMartin Matuska # include <errno.h> 1781ad8388SMartin Matuska # include <fcntl.h> 1881ad8388SMartin Matuska # include <unistd.h> 1981ad8388SMartin Matuska #endif 2081ad8388SMartin Matuska 2181ad8388SMartin Matuska 2281ad8388SMartin Matuska extern void 2381ad8388SMartin Matuska tuklib_open_stdxxx(int err_status) 2481ad8388SMartin Matuska { 2581ad8388SMartin Matuska #ifdef TUKLIB_DOSLIKE 2681ad8388SMartin Matuska // Do nothing, just silence warnings. 2781ad8388SMartin Matuska (void)err_status; 2881ad8388SMartin Matuska 2981ad8388SMartin Matuska #else 3081ad8388SMartin Matuska for (int i = 0; i <= 2; ++i) { 3181ad8388SMartin Matuska // We use fcntl() to check if the file descriptor is open. 3281ad8388SMartin Matuska if (fcntl(i, F_GETFD) == -1 && errno == EBADF) { 3381ad8388SMartin Matuska // With stdin, we could use /dev/full so that 3481ad8388SMartin Matuska // writing to stdin would fail. However, /dev/full 3581ad8388SMartin Matuska // is Linux specific, and if the program tries to 3681ad8388SMartin Matuska // write to stdin, there's already a problem anyway. 3781ad8388SMartin Matuska const int fd = open("/dev/null", O_NOCTTY 3881ad8388SMartin Matuska | (i == 0 ? O_WRONLY : O_RDONLY)); 3981ad8388SMartin Matuska 4081ad8388SMartin Matuska if (fd != i) { 41e24134bcSMartin Matuska if (fd != -1) 42e24134bcSMartin Matuska (void)close(fd); 43e24134bcSMartin Matuska 4481ad8388SMartin Matuska // Something went wrong. Exit with the 4581ad8388SMartin Matuska // exit status we were given. Don't try 4681ad8388SMartin Matuska // to print an error message, since stderr 4781ad8388SMartin Matuska // may very well be non-existent. This 4881ad8388SMartin Matuska // error should be extremely rare. 4981ad8388SMartin Matuska exit(err_status); 5081ad8388SMartin Matuska } 5181ad8388SMartin Matuska } 5281ad8388SMartin Matuska } 5381ad8388SMartin Matuska #endif 5481ad8388SMartin Matuska 5581ad8388SMartin Matuska return; 5681ad8388SMartin Matuska } 57