1: /*-
2: * Copyright (c) 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: */
33:
34: #if defined(LIBC_SCCS) && !defined(lint)
35: static char sccsid[] = "@(#)strmode.c 5.3.2 (2.11BSD GTE) 1996/1/27";
36: #endif /* LIBC_SCCS and not lint */
37:
38: #include <sys/types.h>
39: #include <sys/stat.h>
40:
41: void
42: strmode(mode, p)
43: register mode_t mode;
44: register char *p;
45: {
46: /* print type */
47: switch (mode & S_IFMT) {
48: case S_IFDIR: /* directory */
49: *p++ = 'd';
50: break;
51: case S_IFCHR: /* character special */
52: *p++ = 'c';
53: break;
54: case S_IFBLK: /* block special */
55: *p++ = 'b';
56: break;
57: case S_IFREG: /* regular */
58: *p++ = '-';
59: break;
60: case S_IFLNK: /* symbolic link */
61: *p++ = 'l';
62: break;
63: case S_IFSOCK: /* socket */
64: *p++ = 's';
65: break;
66: #ifdef S_IFIFO
67: case S_IFIFO: /* fifo */
68: *p++ = 'p';
69: break;
70: #endif
71: default: /* unknown */
72: *p++ = '?';
73: break;
74: }
75: /* usr */
76: if (mode & S_IRUSR)
77: *p++ = 'r';
78: else
79: *p++ = '-';
80: if (mode & S_IWUSR)
81: *p++ = 'w';
82: else
83: *p++ = '-';
84: switch (mode & (S_IXUSR | S_ISUID)) {
85: case 0:
86: *p++ = '-';
87: break;
88: case S_IXUSR:
89: *p++ = 'x';
90: break;
91: case S_ISUID:
92: *p++ = 'S';
93: break;
94: case S_IXUSR | S_ISUID:
95: *p++ = 's';
96: break;
97: }
98: /* group */
99: if (mode & S_IRGRP)
100: *p++ = 'r';
101: else
102: *p++ = '-';
103: if (mode & S_IWGRP)
104: *p++ = 'w';
105: else
106: *p++ = '-';
107: switch (mode & (S_IXGRP | S_ISGID)) {
108: case 0:
109: *p++ = '-';
110: break;
111: case S_IXGRP:
112: *p++ = 'x';
113: break;
114: case S_ISGID:
115: *p++ = 'S';
116: break;
117: case S_IXGRP | S_ISGID:
118: *p++ = 's';
119: break;
120: }
121: /* other */
122: if (mode & S_IROTH)
123: *p++ = 'r';
124: else
125: *p++ = '-';
126: if (mode & S_IWOTH)
127: *p++ = 'w';
128: else
129: *p++ = '-';
130: switch (mode & (S_IXOTH | S_ISVTX)) {
131: case 0:
132: *p++ = '-';
133: break;
134: case S_IXOTH:
135: *p++ = 'x';
136: break;
137: case S_ISVTX:
138: *p++ = 'T';
139: break;
140: case S_IXOTH | S_ISVTX:
141: *p++ = 't';
142: break;
143: }
144: *p++ = ' '; /* will be a '+' if ACL's implemented */
145: *p = '\0';
146: }
Defined functions
Defined variables