static void mode_string (unsigned short mode, char *str) { str[0] = ftypelet (mode); rwx ((unsigned short) ((mode & 0700) << 0), &str[1]); rwx ((unsigned short) ((mode & 0070) << 3), &str[4]); rwx ((unsigned short) ((mode & 0007) << 6), &str[7]); setst (mode, str); }
/* %M */ static int print_sd_mode (FILE * stream, const struct printf_info *info, const void *const *args) { int len = 0; mode_t mode; mode = *(mode_t *)args[0]; len = fprintf (stream, "%c", ftypelet (mode)); len += rwx (stream, (mode & 0700) << 0); len += rwx (stream, (mode & 0070) << 3); len += rwx (stream, (mode & 0007) << 6); return len; }
/*------------------------------------------------------------------30/Jan/87-* * printit(sb, f, n) - print the field * * Inputs -> (struct stat*), (struct field*), (int) * * Results -> Displays the field, with special handling of weird fields like * mode and mtime. The mode field is dumped in octal, followed * by one or more of the S_IF<X> and/or S_I<X> values. *----------------------------------------------------------------larry mcvoy-*/ void printit(struct stat* sb, struct field* f, int n) { if (n > 1) printf("%s: ", f->f_name); if (equal(f->f_name, "mode")) { /* This lot changed to my personal liking. (kjb) */ char bit[11]; printf("%07lo, ", (u_long) sb->st_mode); strcpy(bit, "----------"); switch (sb->st_mode&S_IFMT) { case S_IFDIR: bit[0]='d'; break; # ifdef S_IFFIFO case S_IFFIFO: bit[0]='p'; break; # endif case S_IFCHR: bit[0]='c'; break; case S_IFBLK: bit[0]='b'; break; # ifdef S_IFSOCK case S_IFSOCK: bit[0]='S'; break; # endif # ifdef S_IFMPC case S_IFMPC: bit[0]='C'; break; # endif # ifdef S_IFMPB case S_IFMPB: bit[0]='B'; break; # endif # ifdef S_IFLNK case S_IFLNK: bit[0]='l'; break; # endif } rwx(sb->st_mode, bit+1); rwx(sb->st_mode<<3, bit+4); rwx(sb->st_mode<<6, bit+7); if (sb->st_mode&S_ISUID) bit[3]='s'; if (sb->st_mode&S_ISGID) bit[6]='s'; if (sb->st_mode&S_ISVTX) bit[9]='t'; printf("\"%s\"", bit); } /* times in human form, uppercase first letter */ else if (equal("Ctime", f->f_name)) { printf("%.24s (%lu)", ctime(&sb->st_ctime), (u_long) sb->st_ctime); f[1].f_print= 0; } else if (equal("Mtime", f->f_name)) { printf("%.24s (%lu)", ctime(&sb->st_mtime), (u_long) sb->st_mtime); f[1].f_print= 0; } else if (equal("Atime", f->f_name)) { printf("%.24s (%lu)", ctime(&sb->st_atime), (u_long) sb->st_atime); f[1].f_print= 0; } else if (equal("ctime", f->f_name)) { printf("%lu", (u_long) sb->st_ctime); } else if (equal("mtime", f->f_name)) { printf("%lu", (u_long) sb->st_mtime); } else if (equal("atime", f->f_name)) { printf("%lu", (u_long) sb->st_atime); } else { switch (f->f_size) { case sizeof(char): printf("%d", * (u_char *) f->f_addr); break; case sizeof(short): printf("%u", (u_int) * (u_short *) f->f_addr); break; #if INT_MAX != SHRT_MAX case sizeof(int): printf("%u", * (u_int *) f->f_addr); break; #endif #if LONG_MAX != INT_MAX && LONG_MAX != SHRT_MAX case sizeof(long): printf("%lu", * (u_long *) f->f_addr); break; #endif default: fprintf(stderr, "\nProgram error: bad '%s' field size %d\n", f->f_name, f->f_size); break; } } }