1 /* filemode.c -- make a string describing file modes
2
3 Copyright (C) 1985, 1990, 1993, 1998-2000, 2004, 2006 Free Software
4 Foundation, Inc.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software Foundation,
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19
20 #include "autoconf.h"
21
22 #include "filemode.h"
23 #include "stat_.h"
24
25 /* Return a character indicating the type of file described by
26 file mode BITS:
27 '-' regular file
28 'b' block special file
29 'c' character special file
30 'C' high performance ("contiguous data") file
31 'd' directory
32 'D' door
33 'l' symbolic link
34 'm' multiplexed file (7th edition Unix; obsolete)
35 'n' network special file (HP-UX)
36 'p' fifo (named pipe)
37 'P' port
38 's' socket
39 'w' whiteout (4.4BSD)
40 '?' some other file type */
41
42 static char
ftypelet(mode_t bits)43 ftypelet (mode_t bits)
44 {
45 /* These are the most common, so test for them first. */
46 if (S_ISREG (bits))
47 return '-';
48 if (S_ISDIR (bits))
49 return 'd';
50
51 /* Other letters standardized by POSIX 1003.1-2004. */
52 if (S_ISBLK (bits))
53 return 'b';
54 if (S_ISCHR (bits))
55 return 'c';
56 if (S_ISLNK (bits))
57 return 'l';
58 if (S_ISFIFO (bits))
59 return 'p';
60
61 /* Other file types (though not letters) standardized by POSIX. */
62 if (S_ISSOCK (bits))
63 return 's';
64
65 /* Nonstandard file types. */
66 if (S_ISCTG (bits))
67 return 'C';
68 if (S_ISDOOR (bits))
69 return 'D';
70 if (S_ISMPB (bits) || S_ISMPC (bits))
71 return 'm';
72 if (S_ISNWK (bits))
73 return 'n';
74 if (S_ISPORT (bits))
75 return 'P';
76 if (S_ISWHT (bits))
77 return 'w';
78
79 return '?';
80 }
81
82 /* Like filemodestring, but rely only on MODE. */
83
84 void
strmode_alt(mode_t mode,char * str)85 strmode_alt (mode_t mode, char *str)
86 {
87 str[0] = ftypelet (mode);
88 str[1] = mode & S_IRUSR ? 'r' : '-';
89 str[2] = mode & S_IWUSR ? 'w' : '-';
90 str[3] = (mode & S_ISUID
91 ? (mode & S_IXUSR ? 's' : 'S')
92 : (mode & S_IXUSR ? 'x' : '-'));
93 str[4] = mode & S_IRGRP ? 'r' : '-';
94 str[5] = mode & S_IWGRP ? 'w' : '-';
95 str[6] = (mode & S_ISGID
96 ? (mode & S_IXGRP ? 's' : 'S')
97 : (mode & S_IXGRP ? 'x' : '-'));
98 str[7] = mode & S_IROTH ? 'r' : '-';
99 str[8] = mode & S_IWOTH ? 'w' : '-';
100 str[9] = (mode & S_ISVTX
101 ? (mode & S_IXOTH ? 't' : 'T')
102 : (mode & S_IXOTH ? 'x' : '-'));
103 str[10] = ' ';
104 str[11] = '\0';
105 }
106
107 #if 0 /* Not used right now */
108
109 /* filemodestring - fill in string STR with an ls-style ASCII
110 representation of the st_mode field of file stats block STATP.
111 12 characters are stored in STR.
112 The characters stored in STR are:
113
114 0 File type, as in ftypelet above, except that other letters are used
115 for files whose type cannot be determined solely from st_mode:
116
117 'F' semaphore
118 'M' migrated file (Cray DMF)
119 'Q' message queue
120 'S' shared memory object
121 'T' typed memory object
122
123 1 'r' if the owner may read, '-' otherwise.
124
125 2 'w' if the owner may write, '-' otherwise.
126
127 3 'x' if the owner may execute, 's' if the file is
128 set-user-id, '-' otherwise.
129 'S' if the file is set-user-id, but the execute
130 bit isn't set.
131
132 4 'r' if group members may read, '-' otherwise.
133
134 5 'w' if group members may write, '-' otherwise.
135
136 6 'x' if group members may execute, 's' if the file is
137 set-group-id, '-' otherwise.
138 'S' if it is set-group-id but not executable.
139
140 7 'r' if any user may read, '-' otherwise.
141
142 8 'w' if any user may write, '-' otherwise.
143
144 9 'x' if any user may execute, 't' if the file is "sticky"
145 (will be retained in swap space after execution), '-'
146 otherwise.
147 'T' if the file is sticky but not executable.
148
149 10 ' ' for compatibility with 4.4BSD strmode,
150 since this interface does not support ACLs.
151
152 11 '\0'. */
153
154 void
155 filemodestring (struct stat const *statp, char *str)
156 {
157 strmode (statp->st_mode, str);
158
159 if (S_TYPEISSEM (statp))
160 str[0] = 'F';
161 else if (IS_MIGRATED_FILE (statp))
162 str[0] = 'M';
163 else if (S_TYPEISMQ (statp))
164 str[0] = 'Q';
165 else if (S_TYPEISSHM (statp))
166 str[0] = 'S';
167 else if (S_TYPEISTMO (statp))
168 str[0] = 'T';
169 }
170 #endif
171