Mercurial > gnulib
comparison lib/filemode.c @ 5:41c9d08b09d7
Initial revision
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sat, 31 Oct 1992 20:42:48 +0000 |
parents | |
children | 82fc1441ad84 28d847a96824 |
comparison
equal
deleted
inserted
replaced
4:9087e62f9efd | 5:41c9d08b09d7 |
---|---|
1 /* filemode.c -- make a string describing file modes | |
2 Copyright (C) 1985, 1990 Free Software Foundation, Inc. | |
3 | |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software | |
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
17 | |
18 #include <sys/types.h> | |
19 #include <sys/stat.h> | |
20 #ifndef S_IREAD | |
21 #define S_IREAD S_IRUSR | |
22 #define S_IWRITE S_IWUSR | |
23 #define S_IEXEC S_IXUSR | |
24 #endif | |
25 #ifndef S_ISREG /* Doesn't have POSIX.1 stat stuff. */ | |
26 #define mode_t unsigned short | |
27 #endif | |
28 #if !defined(S_ISBLK) && defined(S_IFBLK) | |
29 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) | |
30 #endif | |
31 #if !defined(S_ISCHR) && defined(S_IFCHR) | |
32 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) | |
33 #endif | |
34 #if !defined(S_ISDIR) && defined(S_IFDIR) | |
35 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | |
36 #endif | |
37 #if !defined(S_ISREG) && defined(S_IFREG) | |
38 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | |
39 #endif | |
40 #if !defined(S_ISFIFO) && defined(S_IFIFO) | |
41 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) | |
42 #endif | |
43 #if !defined(S_ISLNK) && defined(S_IFLNK) | |
44 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) | |
45 #endif | |
46 #if !defined(S_ISSOCK) && defined(S_IFSOCK) | |
47 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) | |
48 #endif | |
49 #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */ | |
50 #define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) | |
51 #define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) | |
52 #endif | |
53 #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */ | |
54 #define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) | |
55 #endif | |
56 | |
57 void mode_string (); | |
58 static char ftypelet (); | |
59 static void rwx (); | |
60 static void setst (); | |
61 | |
62 /* filemodestring - fill in string STR with an ls-style ASCII | |
63 representation of the st_mode field of file stats block STATP. | |
64 10 characters are stored in STR; no terminating null is added. | |
65 The characters stored in STR are: | |
66 | |
67 0 File type. 'd' for directory, 'c' for character | |
68 special, 'b' for block special, 'm' for multiplex, | |
69 'l' for symbolic link, 's' for socket, 'p' for fifo, | |
70 '-' for regular, '?' for any other file type | |
71 | |
72 1 'r' if the owner may read, '-' otherwise. | |
73 | |
74 2 'w' if the owner may write, '-' otherwise. | |
75 | |
76 3 'x' if the owner may execute, 's' if the file is | |
77 set-user-id, '-' otherwise. | |
78 'S' if the file is set-user-id, but the execute | |
79 bit isn't set. | |
80 | |
81 4 'r' if group members may read, '-' otherwise. | |
82 | |
83 5 'w' if group members may write, '-' otherwise. | |
84 | |
85 6 'x' if group members may execute, 's' if the file is | |
86 set-group-id, '-' otherwise. | |
87 'S' if it is set-group-id but not executable. | |
88 | |
89 7 'r' if any user may read, '-' otherwise. | |
90 | |
91 8 'w' if any user may write, '-' otherwise. | |
92 | |
93 9 'x' if any user may execute, 't' if the file is "sticky" | |
94 (will be retained in swap space after execution), '-' | |
95 otherwise. | |
96 'T' if the file is sticky but not executable. */ | |
97 | |
98 void | |
99 filemodestring (statp, str) | |
100 struct stat *statp; | |
101 char *str; | |
102 { | |
103 mode_string (statp->st_mode, str); | |
104 } | |
105 | |
106 /* Like filemodestring, but only the relevant part of the `struct stat' | |
107 is given as an argument. */ | |
108 | |
109 void | |
110 mode_string (mode, str) | |
111 unsigned short mode; | |
112 char *str; | |
113 { | |
114 str[0] = ftypelet (mode); | |
115 rwx ((mode & 0700) << 0, &str[1]); | |
116 rwx ((mode & 0070) << 3, &str[4]); | |
117 rwx ((mode & 0007) << 6, &str[7]); | |
118 setst (mode, str); | |
119 } | |
120 | |
121 /* Return a character indicating the type of file described by | |
122 file mode BITS: | |
123 'd' for directories | |
124 'b' for block special files | |
125 'c' for character special files | |
126 'm' for multiplexor files | |
127 'l' for symbolic links | |
128 's' for sockets | |
129 'p' for fifos | |
130 '-' for regular files | |
131 '?' for any other file type. */ | |
132 | |
133 static char | |
134 ftypelet (bits) | |
135 mode_t bits; | |
136 { | |
137 #ifdef S_ISBLK | |
138 if (S_ISBLK (bits)) | |
139 return 'b'; | |
140 #endif | |
141 if (S_ISCHR (bits)) | |
142 return 'c'; | |
143 if (S_ISDIR (bits)) | |
144 return 'd'; | |
145 if (S_ISREG (bits)) | |
146 return '-'; | |
147 #ifdef S_ISFIFO | |
148 if (S_ISFIFO (bits)) | |
149 return 'p'; | |
150 #endif | |
151 #ifdef S_ISLNK | |
152 if (S_ISLNK (bits)) | |
153 return 'l'; | |
154 #endif | |
155 #ifdef S_ISSOCK | |
156 if (S_ISSOCK (bits)) | |
157 return 's'; | |
158 #endif | |
159 #ifdef S_ISMPC | |
160 if (S_ISMPC (bits)) | |
161 return 'm'; | |
162 #endif | |
163 #ifdef S_ISNWK | |
164 if (S_ISNWK (bits)) | |
165 return 'n'; | |
166 #endif | |
167 return '?'; | |
168 } | |
169 | |
170 /* Look at read, write, and execute bits in BITS and set | |
171 flags in CHARS accordingly. */ | |
172 | |
173 static void | |
174 rwx (bits, chars) | |
175 unsigned short bits; | |
176 char *chars; | |
177 { | |
178 chars[0] = (bits & S_IREAD) ? 'r' : '-'; | |
179 chars[1] = (bits & S_IWRITE) ? 'w' : '-'; | |
180 chars[2] = (bits & S_IEXEC) ? 'x' : '-'; | |
181 } | |
182 | |
183 /* Set the 's' and 't' flags in file attributes string CHARS, | |
184 according to the file mode BITS. */ | |
185 | |
186 static void | |
187 setst (bits, chars) | |
188 unsigned short bits; | |
189 char *chars; | |
190 { | |
191 #ifdef S_ISUID | |
192 if (bits & S_ISUID) | |
193 { | |
194 if (chars[3] != 'x') | |
195 /* Set-uid, but not executable by owner. */ | |
196 chars[3] = 'S'; | |
197 else | |
198 chars[3] = 's'; | |
199 } | |
200 #endif | |
201 #ifdef S_ISGID | |
202 if (bits & S_ISGID) | |
203 { | |
204 if (chars[6] != 'x') | |
205 /* Set-gid, but not executable by group. */ | |
206 chars[6] = 'S'; | |
207 else | |
208 chars[6] = 's'; | |
209 } | |
210 #endif | |
211 #ifdef S_ISVTX | |
212 if (bits & S_ISVTX) | |
213 { | |
214 if (chars[9] != 'x') | |
215 /* Sticky, but not executable by others. */ | |
216 chars[9] = 'T'; | |
217 else | |
218 chars[9] = 't'; | |
219 } | |
220 #endif | |
221 } |