63 lines
969 B
C
63 lines
969 B
C
#include <u.h>
|
|
#include <libc.h>
|
|
|
|
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);
|
|
}
|