1 /*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #if defined(LIBC_SCCS) && !defined(lint) 9 static char sccsid[] = "@(#)strmode.c 8.1 (Berkeley) 06/04/93"; 10 #endif /* LIBC_SCCS and not lint */ 11 12 #include <sys/types.h> 13 #include <sys/stat.h> 14 #include <string.h> 15 16 void 17 strmode(mode, p) 18 register mode_t mode; 19 register char *p; 20 { 21 /* print type */ 22 switch (mode & S_IFMT) { 23 case S_IFDIR: /* directory */ 24 *p++ = 'd'; 25 break; 26 case S_IFCHR: /* character special */ 27 *p++ = 'c'; 28 break; 29 case S_IFBLK: /* block special */ 30 *p++ = 'b'; 31 break; 32 case S_IFREG: /* regular */ 33 *p++ = '-'; 34 break; 35 case S_IFLNK: /* symbolic link */ 36 *p++ = 'l'; 37 break; 38 case S_IFSOCK: /* socket */ 39 *p++ = 's'; 40 break; 41 #ifdef S_IFIFO 42 case S_IFIFO: /* fifo */ 43 *p++ = 'p'; 44 break; 45 #endif 46 default: /* unknown */ 47 *p++ = '?'; 48 break; 49 } 50 /* usr */ 51 if (mode & S_IRUSR) 52 *p++ = 'r'; 53 else 54 *p++ = '-'; 55 if (mode & S_IWUSR) 56 *p++ = 'w'; 57 else 58 *p++ = '-'; 59 switch (mode & (S_IXUSR | S_ISUID)) { 60 case 0: 61 *p++ = '-'; 62 break; 63 case S_IXUSR: 64 *p++ = 'x'; 65 break; 66 case S_ISUID: 67 *p++ = 'S'; 68 break; 69 case S_IXUSR | S_ISUID: 70 *p++ = 's'; 71 break; 72 } 73 /* group */ 74 if (mode & S_IRGRP) 75 *p++ = 'r'; 76 else 77 *p++ = '-'; 78 if (mode & S_IWGRP) 79 *p++ = 'w'; 80 else 81 *p++ = '-'; 82 switch (mode & (S_IXGRP | S_ISGID)) { 83 case 0: 84 *p++ = '-'; 85 break; 86 case S_IXGRP: 87 *p++ = 'x'; 88 break; 89 case S_ISGID: 90 *p++ = 'S'; 91 break; 92 case S_IXGRP | S_ISGID: 93 *p++ = 's'; 94 break; 95 } 96 /* other */ 97 if (mode & S_IROTH) 98 *p++ = 'r'; 99 else 100 *p++ = '-'; 101 if (mode & S_IWOTH) 102 *p++ = 'w'; 103 else 104 *p++ = '-'; 105 switch (mode & (S_IXOTH | S_ISVTX)) { 106 case 0: 107 *p++ = '-'; 108 break; 109 case S_IXOTH: 110 *p++ = 'x'; 111 break; 112 case S_ISVTX: 113 *p++ = 'T'; 114 break; 115 case S_IXOTH | S_ISVTX: 116 *p++ = 't'; 117 break; 118 } 119 *p++ = ' '; /* will be a '+' if ACL's implemented */ 120 *p = '\0'; 121 } 122