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