date and time created 90/05/15 14:01:13 by bostic
[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)
9static char sccsid[] = "@(#)strmode.c 5.1 (Berkeley) %G%";
10#endif /* LIBC_SCCS and not lint */
11
12#include <sys/types.h>
13#include <sys/stat.h>
14
15strmode(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}