diff lib/lib.c @ 885:beb32d780164

Add library function for the file permission formatting in ls and stat
author Felix Janda <felix.janda@posteo.de>
date Mon, 22 Apr 2013 22:29:43 +0200
parents aca8323e2690
children 270e5aab9998
line wrap: on
line diff
--- a/lib/lib.c	Sat Apr 27 00:57:11 2013 -0500
+++ b/lib/lib.c	Mon Apr 22 22:29:43 2013 +0200
@@ -1176,6 +1176,32 @@
   error_exit("bad mode '%s'", modestr);
 }
 
+// Format a mode for ls and stat
+void format_mode(char (*buf)[11], mode_t mode)
+{
+  char c, d;
+  int i, bit;
+
+  (*buf)[10]=0;
+  for (i=0; i<9; i++) {
+    bit = mode & (1<<i);
+    c = i%3;
+    if (!c && (mode & (1<<((d=i/3)+9)))) {
+      c = "tss"[d];
+      if (!bit) c &= ~0x20;
+    } else c = bit ? "xwr"[c] : '-';
+    (*buf)[9-i] = c;
+  }
+
+  if (S_ISDIR(mode)) c = 'd';
+  else if (S_ISBLK(mode)) c = 'b';
+  else if (S_ISCHR(mode)) c = 'c';
+  else if (S_ISLNK(mode)) c = 'l';
+  else if (S_ISFIFO(mode)) c = 'p';
+  else if (S_ISSOCK(mode)) c = 's';
+  else c = '-';
+  **buf = c;
+}
 
 char* make_human_readable(unsigned long long size, unsigned long unit)
 {