new copyright; att/bsd/shared
[unix-history] / usr / src / lib / libc / string / strmode.c
CommitLineData
9b659310
KB
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)
33c48b6f 9static char sccsid[] = "@(#)strmode.c 5.3 (Berkeley) %G%";
9b659310
KB
10#endif /* LIBC_SCCS and not lint */
11
12#include <sys/types.h>
13#include <sys/stat.h>
336401ac 14#include <string.h>
9b659310 15
336401ac 16void
9b659310
KB
17strmode(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++ = '?';
9b659310
KB
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';
9b659310 121}