changeset 17618:69fa068eff4e

file-type: add support for doors and other less-common file types Problem with S_ISDOOR reported by Rich Burridge. * lib/file-type.c (file_type): Do S_ISLNK early too. Do S_TYPEIS* macros before the rest. Add S_ISCTG, S_ISDOOR, S_ISMPB, S_ISMPC, S_ISMPX, S_ISNAM, S_ISNWK, S_ISOFD, S_ISOFL, S_ISPORT, S_ISWHT.
author Paul Eggert <eggert@cs.ucla.edu>
date Wed, 05 Feb 2014 11:09:15 -0800
parents e52ef9f51681
children 7f22fb221397
files ChangeLog lib/file-type.c
diffstat 2 files changed, 59 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-02-05  Paul Eggert  <eggert@cs.ucla.edu>
+
+	file-type: add support for doors and other less-common file types
+	Problem with S_ISDOOR reported by Rich Burridge.
+	* lib/file-type.c (file_type): Do S_ISLNK early too.  Do S_TYPEIS*
+	macros before the rest.  Add S_ISCTG, S_ISDOOR, S_ISMPB, S_ISMPC,
+	S_ISMPX, S_ISNAM, S_ISNWK, S_ISOFD, S_ISOFL, S_ISPORT, S_ISWHT.
+
 2014-01-23  Eric Blake  <eblake@redhat.com>
 
 	pthread: work around winpthread header pollution on mingw
--- a/lib/file-type.c
+++ b/lib/file-type.c
@@ -34,26 +34,19 @@
      To keep diagnostics grammatical in English, the returned string
      must start with a consonant.  */
 
+  /* Do these three first, as they're the most common.  */
+
   if (S_ISREG (st->st_mode))
     return st->st_size == 0 ? _("regular empty file") : _("regular file");
 
   if (S_ISDIR (st->st_mode))
     return _("directory");
 
-  if (S_ISBLK (st->st_mode))
-    return _("block special file");
-
-  if (S_ISCHR (st->st_mode))
-    return _("character special file");
-
-  if (S_ISFIFO (st->st_mode))
-    return _("fifo");
-
   if (S_ISLNK (st->st_mode))
     return _("symbolic link");
 
-  if (S_ISSOCK (st->st_mode))
-    return _("socket");
+  /* Do the S_TYPEIS* macros next, as they may be implemented in terms
+     of S_ISNAM, and we want the more-specialized interpretation.  */
 
   if (S_TYPEISMQ (st))
     return _("message queue");
@@ -67,5 +60,52 @@
   if (S_TYPEISTMO (st))
     return _("typed memory object");
 
+  /* The remaining are in alphabetical order.  */
+
+  if (S_ISBLK (st->st_mode))
+    return _("block special file");
+
+  if (S_ISCHR (st->st_mode))
+    return _("character special file");
+
+  if (S_ISCTG (st->st_mode))
+    return _("contiguous data");
+
+  if (S_ISFIFO (st->st_mode))
+    return _("fifo");
+
+  if (S_ISDOOR (st->st_mode))
+    return _("door");
+
+  if (S_ISMPB (st->st_mode))
+    return _("multiplexed block special file");
+
+  if (S_ISMPC (st->st_mode))
+    return _("multiplexed character special file");
+
+  if (S_ISMPX (st->st_mode))
+    return _("multiplexed file");
+
+  if (S_ISNAM (st->st_mode))
+    return _("named file");
+
+  if (S_ISNWK (st->st_mode))
+    return _("network special file");
+
+  if (S_ISOFD (st->st_mode))
+    return _("migrated file with data");
+
+  if (S_ISOFL (st->st_mode))
+    return _("migrated file without data");
+
+  if (S_ISPORT (st->st_mode))
+    return _("port");
+
+  if (S_ISSOCK (st->st_mode))
+    return _("socket");
+
+  if (S_ISWHT (st->st_mode))
+    return _("whiteout");
+
   return _("weird file");
 }