Hi,

I have made a patch for fileutils that I thought would be useful integrating
in the official version.

The patch adds the --numeric-mode (-M) option to ls that makes it list octal
modes instead of symbolic modes. I use often the octal notation for file modes
and I find it practical to have an output option for ls to display them.
I also removed an unneeded added space in the output (after the symbolic mode)
for systems that do not support ACLs.

I have updated the documentation, but not the po files...

Cheers,
David
-- 
     _
  __| |___   David Schweikert <[EMAIL PROTECTED]>
 / _` / __|  IT Support Group, EE-Dept, ETH-Zurich
| (_| \__ \  Tel: +41(0)1-6327019  Room: ETL F24.1
 \__,_|___/  http://people.ee.ethz.ch/~dws/
diff -ur fileutils-4.1/doc/fileutils.texi fileutils-octal-mode/doc/fileutils.texi
--- fileutils-4.1/doc/fileutils.texi    Mon Apr 23 03:36:22 2001
+++ fileutils-octal-mode/doc/fileutils.texi     Fri Jun  8 20:45:01 2001
@@ -690,7 +690,8 @@
 
 @cindex permissions, output by @code{ls}
 The permissions listed are similar to symbolic mode specifications
-(@pxref{Symbolic Modes}).  But @code{ls} combines multiple bits into the
+(@pxref{Symbolic Modes}) (unless @option{-M} is used).
+But @code{ls} combines multiple bits into the
 third character of each set of permissions as follows:
 @table @samp
 @item s
@@ -988,6 +989,13 @@
 @opindex commas@r{, outputting between files}
 List files horizontally, with as many as will fit on each line,
 separated by @samp{, } (a comma and a space).
+
+@item -M
+@itemx --numeric-mode
+@opindex -M
+@opindex --numeric-mode
+@cindex numeric mode
+List the octal file mode instead of the symbolic mode.
 
 @item -n
 @itemx --numeric-uid-gid
diff -ur fileutils-4.1/lib/filemode.c fileutils-octal-mode/lib/filemode.c
--- fileutils-4.1/lib/filemode.c        Sat Apr 15 17:47:31 2000
+++ fileutils-octal-mode/lib/filemode.c Fri Jun  8 20:22:27 2001
@@ -171,7 +171,7 @@
    '-' for regular files
    '?' for any other file type.  */
 
-static char
+char
 ftypelet (mode_t bits)
 {
 #ifdef S_ISBLK
diff -ur fileutils-4.1/lib/filemode.h fileutils-octal-mode/lib/filemode.h
--- fileutils-4.1/lib/filemode.h        Mon Apr 26 08:16:14 1999
+++ fileutils-octal-mode/lib/filemode.h Fri Jun  8 20:21:51 2001
@@ -15,5 +15,6 @@
 # endif
 
 void mode_string PARAMS ((mode_t mode, char *str));
+char ftypelet PARAMS ((mode_t bits));
 
 #endif
diff -ur fileutils-4.1/src/ls.c fileutils-octal-mode/src/ls.c
--- fileutils-4.1/src/ls.c      Sun Apr 29 05:42:47 2001
+++ fileutils-octal-mode/src/ls.c       Sun Jun 10 20:46:36 2001
@@ -241,12 +241,6 @@
 #endif
   };
 
-#if USE_ACL
-# define FILE_HAS_ACL(F) ((F)->have_acl)
-#else
-# define FILE_HAS_ACL(F) 0
-#endif
-
 #define LEN_STR_PAIR(s) sizeof (s) - 1, s
 
 /* Null is a valid character in a color indicator (think about Epson
@@ -453,6 +447,11 @@
 
 static int numeric_ids;
 
+/* Nonzero means print the file modes as octal numbers rather
+   than as symbolic-mode strings.  -M  */
+
+static int numeric_mode;
+
 /* Nonzero means mention the size in blocks of each file.  -s  */
 
 static int print_block_size;
@@ -690,6 +689,7 @@
   {"ignore", required_argument, 0, 'I'},
   {"indicator-style", required_argument, 0, INDICATOR_STYLE_OPTION},
   {"dereference", no_argument, 0, 'L'},
+  {"numeric-mode", no_argument, 0, 'M'},
   {"literal", no_argument, 0, 'N'},
   {"quote-name", no_argument, 0, 'Q'},
   {"quoting-style", required_argument, 0, QUOTING_STYLE_OPTION},
@@ -1076,7 +1076,7 @@
     }
 
   while ((c = getopt_long (argc, argv,
-                          "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
+                          "abcdfghiklmnopqrstuvw:xABCDFGHI:LMNQRST:UX1",
                           long_options, NULL)) != -1)
     {
       switch (c)
@@ -1233,6 +1233,10 @@
          trace_links = 1;
          break;
 
+       case 'M':
+         numeric_mode = 1;
+         break;
+
        case 'N':
          set_quoting_style (NULL, literal_quoting_style);
          break;
@@ -2456,14 +2460,30 @@
   char *user_name;
 
 #if HAVE_ST_DM_MODE
-  /* Cray DMF: look at the file's migrated, not real, status */
-  mode_string (f->stat.st_dm_mode, modebuf);
+/* Cray DMF: look at the file's migrated, not real, status */
+#define ST_MODE st_dm_mode
 #else
-  mode_string (f->stat.st_mode, modebuf);
+#define ST_MODE st_mode
 #endif
-
-  modebuf[10] = (FILE_HAS_ACL (f) ? '+' : ' ');
-  modebuf[11] = '\0';
+  if (numeric_mode)
+    {
+      char ftype = ftypelet (f->stat.ST_MODE);
+      sprintf (modebuf, "%c %4o", (ftype == '-' ? ' ' : ftype), f->stat.ST_MODE & 
+07777);
+#if USE_ACL
+      modebuf[6] = (f->have_acl ? '+' : ' ');
+      modebuf[7] = '\0';
+#endif
+    }
+  else
+    {
+      mode_string (f->stat.ST_MODE, modebuf);
+#if USE_ACL
+      modebuf[10] = (f->have_acl ? '+' : ' ');
+      modebuf[11] = '\0';
+#else
+      modebuf[10] = '\0';
+#endif
+    }
 
   switch (time_type)
     {
@@ -3289,6 +3309,7 @@
   -l                         use a long listing format\n\
   -L, --dereference          list entries pointed to by symbolic links\n\
   -m                         fill width with a comma separated list of entries\n\
+  -M, --numeric-mode         list octal file mode instead of symbolic mode\n\
   -n, --numeric-uid-gid      list numeric UIDs and GIDs instead of names\n\
   -N, --literal              print raw entry names (don't treat e.g. control\n\
                                characters specially)\n\

Reply via email to