Commit | Line | Data |
---|---|---|
252b5132 | 1 | /* filemode.c -- make a string describing file modes |
2da42df6 | 2 | Copyright 1985, 1990, 1991, 1994, 1995, 1997, 2003 |
8c2bc687 | 3 | Free Software Foundation, Inc. |
252b5132 RH |
4 | |
5 | This program is free software; you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation; either version 2, or (at your option) | |
8 | any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program; if not, write to the Free Software | |
17 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
18 | 02111-1307, USA. */ | |
19 | \f | |
20 | #include "bfd.h" | |
21 | #include "bucomm.h" | |
22 | ||
2da42df6 AJ |
23 | static char ftypelet (unsigned long); |
24 | static void setst (unsigned long, char *); | |
252b5132 RH |
25 | |
26 | /* filemodestring - fill in string STR with an ls-style ASCII | |
27 | representation of the st_mode field of file stats block STATP. | |
28 | 10 characters are stored in STR; no terminating null is added. | |
29 | The characters stored in STR are: | |
30 | ||
31 | 0 File type. 'd' for directory, 'c' for character | |
32 | special, 'b' for block special, 'm' for multiplex, | |
33 | 'l' for symbolic link, 's' for socket, 'p' for fifo, | |
34 | '-' for any other file type | |
35 | ||
36 | 1 'r' if the owner may read, '-' otherwise. | |
37 | ||
38 | 2 'w' if the owner may write, '-' otherwise. | |
39 | ||
40 | 3 'x' if the owner may execute, 's' if the file is | |
41 | set-user-id, '-' otherwise. | |
42 | 'S' if the file is set-user-id, but the execute | |
43 | bit isn't set. | |
44 | ||
45 | 4 'r' if group members may read, '-' otherwise. | |
46 | ||
47 | 5 'w' if group members may write, '-' otherwise. | |
48 | ||
49 | 6 'x' if group members may execute, 's' if the file is | |
50 | set-group-id, '-' otherwise. | |
51 | 'S' if it is set-group-id but not executable. | |
52 | ||
53 | 7 'r' if any user may read, '-' otherwise. | |
54 | ||
55 | 8 'w' if any user may write, '-' otherwise. | |
56 | ||
57 | 9 'x' if any user may execute, 't' if the file is "sticky" | |
58 | (will be retained in swap space after execution), '-' | |
59 | otherwise. | |
0af11b59 | 60 | 'T' if the file is sticky but not executable. */ |
252b5132 RH |
61 | |
62 | #if 0 | |
63 | ||
64 | /* This is not used; only mode_string is used. */ | |
65 | ||
66 | void | |
2da42df6 | 67 | filemodestring (struct stat *statp, char *str) |
252b5132 RH |
68 | { |
69 | mode_string ((unsigned long) statp->st_mode, str); | |
70 | } | |
71 | ||
72 | #endif | |
73 | ||
74 | /* Get definitions for the file permission bits. */ | |
75 | ||
76 | #ifndef S_IRWXU | |
77 | #define S_IRWXU 0700 | |
78 | #endif | |
79 | #ifndef S_IRUSR | |
80 | #define S_IRUSR 0400 | |
81 | #endif | |
82 | #ifndef S_IWUSR | |
83 | #define S_IWUSR 0200 | |
84 | #endif | |
85 | #ifndef S_IXUSR | |
86 | #define S_IXUSR 0100 | |
87 | #endif | |
88 | ||
89 | #ifndef S_IRWXG | |
90 | #define S_IRWXG 0070 | |
91 | #endif | |
92 | #ifndef S_IRGRP | |
93 | #define S_IRGRP 0040 | |
94 | #endif | |
95 | #ifndef S_IWGRP | |
96 | #define S_IWGRP 0020 | |
97 | #endif | |
98 | #ifndef S_IXGRP | |
99 | #define S_IXGRP 0010 | |
100 | #endif | |
101 | ||
102 | #ifndef S_IRWXO | |
103 | #define S_IRWXO 0007 | |
104 | #endif | |
105 | #ifndef S_IROTH | |
106 | #define S_IROTH 0004 | |
107 | #endif | |
108 | #ifndef S_IWOTH | |
109 | #define S_IWOTH 0002 | |
110 | #endif | |
111 | #ifndef S_IXOTH | |
112 | #define S_IXOTH 0001 | |
113 | #endif | |
114 | ||
115 | /* Like filemodestring, but only the relevant part of the `struct stat' | |
0af11b59 | 116 | is given as an argument. */ |
252b5132 RH |
117 | |
118 | void | |
2da42df6 | 119 | mode_string (unsigned long mode, char *str) |
252b5132 RH |
120 | { |
121 | str[0] = ftypelet ((unsigned long) mode); | |
122 | str[1] = (mode & S_IRUSR) != 0 ? 'r' : '-'; | |
123 | str[2] = (mode & S_IWUSR) != 0 ? 'w' : '-'; | |
124 | str[3] = (mode & S_IXUSR) != 0 ? 'x' : '-'; | |
125 | str[4] = (mode & S_IRGRP) != 0 ? 'r' : '-'; | |
126 | str[5] = (mode & S_IWGRP) != 0 ? 'w' : '-'; | |
127 | str[6] = (mode & S_IXGRP) != 0 ? 'x' : '-'; | |
128 | str[7] = (mode & S_IROTH) != 0 ? 'r' : '-'; | |
129 | str[8] = (mode & S_IWOTH) != 0 ? 'w' : '-'; | |
130 | str[9] = (mode & S_IXOTH) != 0 ? 'x' : '-'; | |
131 | setst ((unsigned long) mode, str); | |
132 | } | |
133 | ||
134 | /* Return a character indicating the type of file described by | |
135 | file mode BITS: | |
136 | 'd' for directories | |
137 | 'b' for block special files | |
138 | 'c' for character special files | |
aaad4cf3 | 139 | 'm' for multiplexer files |
252b5132 RH |
140 | 'l' for symbolic links |
141 | 's' for sockets | |
142 | 'p' for fifos | |
0af11b59 | 143 | '-' for any other file type. */ |
252b5132 RH |
144 | |
145 | #ifndef S_ISDIR | |
146 | #ifdef S_IFDIR | |
147 | #define S_ISDIR(i) (((i) & S_IFMT) == S_IFDIR) | |
148 | #else /* ! defined (S_IFDIR) */ | |
149 | #define S_ISDIR(i) (((i) & 0170000) == 040000) | |
150 | #endif /* ! defined (S_IFDIR) */ | |
151 | #endif /* ! defined (S_ISDIR) */ | |
152 | ||
153 | #ifndef S_ISBLK | |
154 | #ifdef S_IFBLK | |
155 | #define S_ISBLK(i) (((i) & S_IFMT) == S_IFBLK) | |
156 | #else /* ! defined (S_IFBLK) */ | |
157 | #define S_ISBLK(i) 0 | |
158 | #endif /* ! defined (S_IFBLK) */ | |
159 | #endif /* ! defined (S_ISBLK) */ | |
160 | ||
161 | #ifndef S_ISCHR | |
162 | #ifdef S_IFCHR | |
163 | #define S_ISCHR(i) (((i) & S_IFMT) == S_IFCHR) | |
164 | #else /* ! defined (S_IFCHR) */ | |
165 | #define S_ISCHR(i) 0 | |
166 | #endif /* ! defined (S_IFCHR) */ | |
167 | #endif /* ! defined (S_ISCHR) */ | |
168 | ||
169 | #ifndef S_ISFIFO | |
170 | #ifdef S_IFIFO | |
171 | #define S_ISFIFO(i) (((i) & S_IFMT) == S_IFIFO) | |
172 | #else /* ! defined (S_IFIFO) */ | |
173 | #define S_ISFIFO(i) 0 | |
174 | #endif /* ! defined (S_IFIFO) */ | |
175 | #endif /* ! defined (S_ISFIFO) */ | |
176 | ||
177 | #ifndef S_ISSOCK | |
178 | #ifdef S_IFSOCK | |
179 | #define S_ISSOCK(i) (((i) & S_IFMT) == S_IFSOCK) | |
180 | #else /* ! defined (S_IFSOCK) */ | |
181 | #define S_ISSOCK(i) 0 | |
182 | #endif /* ! defined (S_IFSOCK) */ | |
183 | #endif /* ! defined (S_ISSOCK) */ | |
184 | ||
185 | #ifndef S_ISLNK | |
186 | #ifdef S_IFLNK | |
187 | #define S_ISLNK(i) (((i) & S_IFMT) == S_IFLNK) | |
188 | #else /* ! defined (S_IFLNK) */ | |
189 | #define S_ISLNK(i) 0 | |
190 | #endif /* ! defined (S_IFLNK) */ | |
191 | #endif /* ! defined (S_ISLNK) */ | |
192 | ||
193 | static char | |
2da42df6 | 194 | ftypelet (unsigned long bits) |
252b5132 RH |
195 | { |
196 | if (S_ISDIR (bits)) | |
197 | return 'd'; | |
198 | if (S_ISLNK (bits)) | |
199 | return 'l'; | |
200 | if (S_ISBLK (bits)) | |
201 | return 'b'; | |
202 | if (S_ISCHR (bits)) | |
203 | return 'c'; | |
204 | if (S_ISSOCK (bits)) | |
205 | return 's'; | |
206 | if (S_ISFIFO (bits)) | |
207 | return 'p'; | |
208 | ||
209 | #ifdef S_IFMT | |
210 | #ifdef S_IFMPC | |
211 | if ((bits & S_IFMT) == S_IFMPC | |
212 | || (bits & S_IFMT) == S_IFMPB) | |
213 | return 'm'; | |
214 | #endif | |
215 | #ifdef S_IFNWK | |
216 | if ((bits & S_IFMT) == S_IFNWK) | |
217 | return 'n'; | |
218 | #endif | |
219 | #endif | |
220 | ||
221 | return '-'; | |
222 | } | |
223 | ||
224 | /* Set the 's' and 't' flags in file attributes string CHARS, | |
0af11b59 | 225 | according to the file mode BITS. */ |
252b5132 RH |
226 | |
227 | static void | |
2da42df6 | 228 | setst (unsigned long bits ATTRIBUTE_UNUSED, char *chars ATTRIBUTE_UNUSED) |
252b5132 RH |
229 | { |
230 | #ifdef S_ISUID | |
231 | if (bits & S_ISUID) | |
232 | { | |
233 | if (chars[3] != 'x') | |
0af11b59 | 234 | /* Set-uid, but not executable by owner. */ |
252b5132 RH |
235 | chars[3] = 'S'; |
236 | else | |
237 | chars[3] = 's'; | |
238 | } | |
239 | #endif | |
240 | #ifdef S_ISGID | |
241 | if (bits & S_ISGID) | |
242 | { | |
243 | if (chars[6] != 'x') | |
0af11b59 | 244 | /* Set-gid, but not executable by group. */ |
252b5132 RH |
245 | chars[6] = 'S'; |
246 | else | |
247 | chars[6] = 's'; | |
248 | } | |
249 | #endif | |
250 | #ifdef S_ISVTX | |
251 | if (bits & S_ISVTX) | |
252 | { | |
253 | if (chars[9] != 'x') | |
0af11b59 | 254 | /* Sticky, but not executable by others. */ |
252b5132 RH |
255 | chars[9] = 'T'; |
256 | else | |
257 | chars[9] = 't'; | |
258 | } | |
259 | #endif | |
260 | } |