diff options
author | Richard M. Stallman <rms@gnu.org> | 1996-11-07 06:07:00 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1996-11-07 06:07:00 +0000 |
commit | 64393bf17c22b63972fba3d0cdaeb4649eff86e7 (patch) | |
tree | 9a4ec4e8cea68f7fad38e221fc21ea8201af05eb | |
parent | 74817ae41552e814a560bee4d8bfe957398ab666 (diff) | |
download | emacs-64393bf17c22b63972fba3d0cdaeb4649eff86e7.tar.gz |
(USG5 or BSD_SYSTEM or LINUX): Include fcntl.h.
(Ffile_readable_p): Return immediately if stat fails.
Call S_ISFIFO correctly.
-rw-r--r-- | src/fileio.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/fileio.c b/src/fileio.c index 7c08284728a..7e8dad19e8c 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -20,6 +20,10 @@ Boston, MA 02111-1307, USA. */ #include <config.h> +#if defined (USG5) || defined (BSD_SYSTEM) || defined (LINUX) +#include <fcntl.h> +#endif + #include <sys/types.h> #include <sys/stat.h> @@ -31,6 +35,10 @@ Boston, MA 02111-1307, USA. */ # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) #endif +#if !defined (S_ISFIFO) && defined (S_IFIFO) +# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#endif + #if !defined (S_ISREG) && defined (S_IFREG) # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif @@ -2616,6 +2624,8 @@ See also `file-exists-p' and `file-attributes'.") Lisp_Object absname; Lisp_Object handler; int desc; + int flags; + struct stat statbuf; CHECK_STRING (filename, 0); absname = Fexpand_file_name (filename, Qnil); @@ -2632,7 +2642,18 @@ See also `file-exists-p' and `file-attributes'.") return Qt; return Qnil; #else /* not DOS_NT */ - desc = open (XSTRING (absname)->data, O_RDONLY); + flags = O_RDONLY; +#if defined (S_ISFIFO) && defined (O_NONBLOCK) + /* Opening a fifo without O_NONBLOCK can wait. + We don't want to wait. But we don't want to mess wth O_NONBLOCK + except in the case of a fifo, on a system which handles it. */ + desc = stat (XSTRING (absname)->data, &statbuf); + if (desc < 0) + return Qnil; + if (S_ISFIFO (statbuf.st_mode)) + flags |= O_NONBLOCK; +#endif + desc = open (XSTRING (absname)->data, flags); if (desc < 0) return Qnil; close (desc); |