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