xref: /original-bsd/lib/libc/string/strmode.c (revision 4ba124f7)
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.2 (Berkeley) 07/28/94";
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 #ifdef S_IFWHT
47 	case S_IFWHT:			/* whiteout */
48 	case S_IFWHTD:
49 		*p++ = 'w';
50 		break;
51 #endif
52 	default:			/* unknown */
53 		*p++ = '?';
54 		break;
55 	}
56 	/* usr */
57 	if (mode & S_IRUSR)
58 		*p++ = 'r';
59 	else
60 		*p++ = '-';
61 	if (mode & S_IWUSR)
62 		*p++ = 'w';
63 	else
64 		*p++ = '-';
65 	switch (mode & (S_IXUSR | S_ISUID)) {
66 	case 0:
67 		*p++ = '-';
68 		break;
69 	case S_IXUSR:
70 		*p++ = 'x';
71 		break;
72 	case S_ISUID:
73 		*p++ = 'S';
74 		break;
75 	case S_IXUSR | S_ISUID:
76 		*p++ = 's';
77 		break;
78 	}
79 	/* group */
80 	if (mode & S_IRGRP)
81 		*p++ = 'r';
82 	else
83 		*p++ = '-';
84 	if (mode & S_IWGRP)
85 		*p++ = 'w';
86 	else
87 		*p++ = '-';
88 	switch (mode & (S_IXGRP | S_ISGID)) {
89 	case 0:
90 		*p++ = '-';
91 		break;
92 	case S_IXGRP:
93 		*p++ = 'x';
94 		break;
95 	case S_ISGID:
96 		*p++ = 'S';
97 		break;
98 	case S_IXGRP | S_ISGID:
99 		*p++ = 's';
100 		break;
101 	}
102 	/* other */
103 	if (mode & S_IROTH)
104 		*p++ = 'r';
105 	else
106 		*p++ = '-';
107 	if (mode & S_IWOTH)
108 		*p++ = 'w';
109 	else
110 		*p++ = '-';
111 	switch (mode & (S_IXOTH | S_ISVTX)) {
112 	case 0:
113 		*p++ = '-';
114 		break;
115 	case S_IXOTH:
116 		*p++ = 'x';
117 		break;
118 	case S_ISVTX:
119 		*p++ = 'T';
120 		break;
121 	case S_IXOTH | S_ISVTX:
122 		*p++ = 't';
123 		break;
124 	}
125 	*p++ = ' ';		/* will be a '+' if ACL's implemented */
126 	*p = '\0';
127 }
128