Index: xz/src/common/tuklib_open_stdxxx.c |
=================================================================== |
--- xz/src/common/tuklib_open_stdxxx.c (revision 0) |
+++ xz/src/common/tuklib_open_stdxxx.c (revision 0) |
@@ -0,0 +1,55 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \file tuklib_open_stdxxx.c |
+/// \brief Make sure that file descriptors 0, 1, and 2 are open |
+// |
+// Author: Lasse Collin |
+// |
+// This file has been put into the public domain. |
+// You can do whatever you want with this file. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "tuklib_open_stdxxx.h" |
+ |
+#ifndef TUKLIB_DOSLIKE |
+# include <stdlib.h> |
+# include <errno.h> |
+# include <fcntl.h> |
+# include <unistd.h> |
+#endif |
+ |
+ |
+extern void |
+tuklib_open_stdxxx(int err_status) |
+{ |
+#ifdef TUKLIB_DOSLIKE |
+ // Do nothing, just silence warnings. |
+ (void)err_status; |
+ |
+#else |
+ for (int i = 0; i <= 2; ++i) { |
+ // We use fcntl() to check if the file descriptor is open. |
+ if (fcntl(i, F_GETFD) == -1 && errno == EBADF) { |
+ // With stdin, we could use /dev/full so that |
+ // writing to stdin would fail. However, /dev/full |
+ // is Linux specific, and if the program tries to |
+ // write to stdin, there's already a problem anyway. |
+ const int fd = open("/dev/null", O_NOCTTY |
+ | (i == 0 ? O_WRONLY : O_RDONLY)); |
+ |
+ if (fd != i) { |
+ // Something went wrong. Exit with the |
+ // exit status we were given. Don't try |
+ // to print an error message, since stderr |
+ // may very well be non-existent. This |
+ // error should be extremely rare. |
+ (void)close(fd); |
+ exit(err_status); |
+ } |
+ } |
+ } |
+#endif |
+ |
+ return; |
+} |
Property changes on: xz/src/common/tuklib_open_stdxxx.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |