X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/d76bf86f438d4f5f9fe493ab76f02ffc78f3ae2e..067428c1717acd28f205c2cff93f0583eb347f4c:/src/sysdep.c diff --git a/src/sysdep.c b/src/sysdep.c index 1d3e646d35..faca7fae46 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -22,7 +22,7 @@ along with GNU Emacs. If not, see . */ #define SYSTIME_INLINE EXTERN_INLINE #include -#include +#include "sysstdio.h" #ifdef HAVE_PWD_H #include #include @@ -543,8 +543,6 @@ sys_subshell (void) #endif } - close_process_descs (); /* Close Emacs's pipes/ptys */ - #ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */ { char *epwd = getenv ("PWD"); @@ -1630,6 +1628,8 @@ deliver_thread_signal (int sig, signal_handler_t handler) # undef sys_siglist # ifdef _sys_siglist # define sys_siglist _sys_siglist +# elif HAVE_DECL___SYS_SIGLIST +# define sys_siglist __sys_siglist # else # define sys_siglist my_sys_siglist static char const *sys_siglist[NSIG]; @@ -2149,15 +2149,53 @@ emacs_abort (void) } #endif +/* Open FILE for Emacs use, using open flags OFLAG and mode MODE. + Arrange for subprograms to not inherit the file descriptor. + Prefer a method that is multithread-safe, if available. + Do not fail merely because the open was interrupted by a signal. + Allow the user to quit. */ + int -emacs_open (const char *path, int oflag, int mode) +emacs_open (const char *file, int oflags, int mode) { - register int rtnval; - - while ((rtnval = open (path, oflag, mode)) == -1 - && (errno == EINTR)) + int fd; + oflags |= O_CLOEXEC; + while ((fd = open (file, oflags, mode)) < 0 && errno == EINTR) QUIT; - return (rtnval); + if (! O_CLOEXEC && 0 <= fd) + fcntl (fd, F_SETFD, FD_CLOEXEC); + return fd; +} + +/* Open FILE as a stream for Emacs use, with mode MODE. + Act like emacs_open with respect to threads, signals, and quits. */ + +FILE * +emacs_fopen (char const *file, char const *mode) +{ + int fd, omode, oflags; + int bflag = 0; + char const *m = mode; + + switch (*m++) + { + case 'r': omode = O_RDONLY; oflags = 0; break; + case 'w': omode = O_WRONLY; oflags = O_CREAT | O_TRUNC; break; + case 'a': omode = O_WRONLY; oflags = O_CREAT | O_APPEND; break; + default: emacs_abort (); + } + + while (*m) + switch (*m++) + { + case '+': omode = O_RDWR; break; + case 'b': bflag = O_BINARY; break; + case 't': bflag = O_TEXT; break; + default: /* Ignore. */ break; + } + + fd = emacs_open (file, omode | oflags | bflag, 0666); + return fd < 0 ? 0 : fdopen (fd, mode); } int @@ -2635,7 +2673,7 @@ get_up_time (void) EMACS_TIME up = make_emacs_time (0, 0); block_input (); - fup = fopen ("/proc/uptime", "r"); + fup = emacs_fopen ("/proc/uptime", "r"); if (fup) { @@ -2680,7 +2718,7 @@ procfs_ttyname (int rdev) char name[PATH_MAX]; block_input (); - fdev = fopen ("/proc/tty/drivers", "r"); + fdev = emacs_fopen ("/proc/tty/drivers", "r"); if (fdev) { @@ -2722,7 +2760,7 @@ procfs_get_total_memory (void) unsigned long retval = 2 * 1024 * 1024; /* default: 2GB */ block_input (); - fmem = fopen ("/proc/meminfo", "r"); + fmem = emacs_fopen ("/proc/meminfo", "r"); if (fmem) {