dirmodefmt.c (969B)
1 #include <u.h> 2 #include <libc.h> 3 4 static char *modes[] = 5 { 6 "---", 7 "--x", 8 "-w-", 9 "-wx", 10 "r--", 11 "r-x", 12 "rw-", 13 "rwx", 14 }; 15 16 static void 17 rwx(long m, char *s) 18 { 19 strncpy(s, modes[m], 3); 20 } 21 22 int 23 dirmodefmt(Fmt *f) 24 { 25 static char buf[16]; 26 ulong m; 27 28 m = va_arg(f->args, ulong); 29 30 if(m & DMDIR) 31 buf[0]='d'; 32 else if(m & DMAPPEND) 33 buf[0]='a'; 34 else if(m & DMAUTH) 35 buf[0]='A'; 36 else if(m & DMDEVICE) 37 buf[0] = 'D'; 38 else if(m & DMSOCKET) 39 buf[0] = 'S'; 40 else if(m & DMNAMEDPIPE) 41 buf[0] = 'P'; 42 else 43 buf[0]='-'; 44 45 /* 46 * It's a little weird to have DMSYMLINK conflict with DMEXCL 47 * here, but since you can have symlinks to any of the above 48 * things, this is a better display. Especially since we don't do 49 * DMEXCL on any of the supported systems. 50 */ 51 if(m & DMEXCL) 52 buf[1]='l'; 53 else if(m & DMSYMLINK) 54 buf[1] = 'L'; 55 else 56 buf[1]='-'; 57 rwx((m>>6)&7, buf+2); 58 rwx((m>>3)&7, buf+5); 59 rwx((m>>0)&7, buf+8); 60 buf[11] = 0; 61 return fmtstrcpy(f, buf); 62 }