dirmodefmt.c 581 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <fcall.h>
  4. static char *modes[] =
  5. {
  6. "---",
  7. "--x",
  8. "-w-",
  9. "-wx",
  10. "r--",
  11. "r-x",
  12. "rw-",
  13. "rwx",
  14. };
  15. static void
  16. rwx(long m, char *s)
  17. {
  18. strncpy(s, modes[m], 3);
  19. }
  20. int
  21. dirmodefmt(Fmt *f)
  22. {
  23. static char buf[16];
  24. ulong m;
  25. m = va_arg(f->args, ulong);
  26. if(m & DMDIR)
  27. buf[0]='d';
  28. else if(m & DMAPPEND)
  29. buf[0]='a';
  30. else if(m & DMAUTH)
  31. buf[0]='A';
  32. else
  33. buf[0]='-';
  34. if(m & DMEXCL)
  35. buf[1]='l';
  36. else
  37. buf[1]='-';
  38. rwx((m>>6)&7, buf+2);
  39. rwx((m>>3)&7, buf+5);
  40. rwx((m>>0)&7, buf+8);
  41. buf[11] = 0;
  42. return fmtstrcpy(f, buf);
  43. }