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