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