#include #include static char *modes[] = { "---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx", }; static void rwx(long m, char *s) { strncpy(s, modes[m], 3); } int dirmodefmt(Fmt *f) { static char buf[16]; ulong m; m = va_arg(f->args, ulong); if(m & DMDIR) buf[0]='d'; else if(m & DMAPPEND) buf[0]='a'; else if(m & DMAUTH) buf[0]='A'; else if(m & DMDEVICE) buf[0] = 'D'; else if(m & DMSOCKET) buf[0] = 'S'; else if(m & DMNAMEDPIPE) buf[0] = 'P'; else buf[0]='-'; /* * It's a little weird to have DMSYMLINK conflict with DMEXCL * here, but since you can have symlinks to any of the above * things, this is a better display. Especially since we don't do * DMEXCL on any of the supported systems. */ if(m & DMEXCL) buf[1]='l'; else if(m & DMSYMLINK) buf[1] = 'L'; else buf[1]='-'; rwx((m>>6)&7, buf+2); rwx((m>>3)&7, buf+5); rwx((m>>0)&7, buf+8); buf[11] = 0; return fmtstrcpy(f, buf); }