summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1996-11-07 06:07:00 +0000
committerRichard M. Stallman <rms@gnu.org>1996-11-07 06:07:00 +0000
commit64393bf17c22b63972fba3d0cdaeb4649eff86e7 (patch)
tree9a4ec4e8cea68f7fad38e221fc21ea8201af05eb
parent74817ae41552e814a560bee4d8bfe957398ab666 (diff)
downloademacs-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.c23
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);