00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifdef HAVE_CONFIG_H
00019 #include <config.h>
00020 #endif
00021
00022 #ifdef HAVE_SYS_TYPES_H
00023 #include <sys/types.h>
00024 #endif
00025 #include <sys/stat.h>
00026
00027 #if !S_IRUSR
00028 # if S_IREAD
00029 # define S_IRUSR S_IREAD
00030 # else
00031 # define S_IRUSR 00400
00032 # endif
00033 #endif
00034
00035 #if !S_IWUSR
00036 # if S_IWRITE
00037 # define S_IWUSR S_IWRITE
00038 # else
00039 # define S_IWUSR 00200
00040 # endif
00041 #endif
00042
00043 #if !S_IXUSR
00044 # if S_IEXEC
00045 # define S_IXUSR S_IEXEC
00046 # else
00047 # define S_IXUSR 00100
00048 # endif
00049 #endif
00050
00051 #ifdef STAT_MACROS_BROKEN
00052 #undef S_ISBLK
00053 #undef S_ISCHR
00054 #undef S_ISDIR
00055 #undef S_ISFIFO
00056 #undef S_ISLNK
00057 #undef S_ISMPB
00058 #undef S_ISMPC
00059 #undef S_ISNWK
00060 #undef S_ISREG
00061 #undef S_ISSOCK
00062 #endif
00063
00064 #if !defined(S_ISBLK) && defined(S_IFBLK)
00065 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
00066 #endif
00067 #if !defined(S_ISCHR) && defined(S_IFCHR)
00068 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
00069 #endif
00070 #if !defined(S_ISDIR) && defined(S_IFDIR)
00071 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
00072 #endif
00073 #if !defined(S_ISREG) && defined(S_IFREG)
00074 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
00075 #endif
00076 #if !defined(S_ISFIFO) && defined(S_IFIFO)
00077 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
00078 #endif
00079 #if !defined(S_ISLNK) && defined(S_IFLNK)
00080 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
00081 #endif
00082 #if !defined(S_ISSOCK) && defined(S_IFSOCK)
00083 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
00084 #endif
00085 #if !defined(S_ISMPB) && defined(S_IFMPB)
00086 #define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
00087 #define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
00088 #endif
00089 #if !defined(S_ISNWK) && defined(S_IFNWK)
00090 #define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
00091 #endif
00092
00093 void mode_string ();
00094 static char ftypelet ();
00095 static void rwx ();
00096 static void setst ();
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 void
00135 filemodestring (statp, str)
00136 struct stat *statp;
00137 char *str;
00138 {
00139 mode_string (statp->st_mode, str);
00140 }
00141
00142
00143
00144
00145 void
00146 mode_string (mode, str)
00147 unsigned short mode;
00148 char *str;
00149 {
00150 str[0] = ftypelet ((long) mode);
00151 rwx ((mode & 0700) << 0, &str[1]);
00152 rwx ((mode & 0070) << 3, &str[4]);
00153 rwx ((mode & 0007) << 6, &str[7]);
00154 setst (mode, str);
00155 }
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 static char
00170 ftypelet (bits)
00171 long bits;
00172 {
00173 #ifdef S_ISBLK
00174 if (S_ISBLK (bits))
00175 return 'b';
00176 #endif
00177 if (S_ISCHR (bits))
00178 return 'c';
00179 if (S_ISDIR (bits))
00180 return 'd';
00181 if (S_ISREG (bits))
00182 return '-';
00183 #ifdef S_ISFIFO
00184 if (S_ISFIFO (bits))
00185 return 'p';
00186 #endif
00187 #ifdef S_ISLNK
00188 if (S_ISLNK (bits))
00189 return 'l';
00190 #endif
00191 #ifdef S_ISSOCK
00192 if (S_ISSOCK (bits))
00193 return 's';
00194 #endif
00195 #ifdef S_ISMPC
00196 if (S_ISMPC (bits))
00197 return 'm';
00198 #endif
00199 #ifdef S_ISNWK
00200 if (S_ISNWK (bits))
00201 return 'n';
00202 #endif
00203 return '?';
00204 }
00205
00206
00207
00208
00209 static void
00210 rwx (bits, chars)
00211 unsigned short bits;
00212 char *chars;
00213 {
00214 chars[0] = (bits & S_IRUSR) ? 'r' : '-';
00215 chars[1] = (bits & S_IWUSR) ? 'w' : '-';
00216 chars[2] = (bits & S_IXUSR) ? 'x' : '-';
00217 }
00218
00219
00220
00221
00222 static void
00223 setst (bits, chars)
00224 unsigned short bits;
00225 char *chars;
00226 {
00227 #ifdef S_ISUID
00228 if (bits & S_ISUID)
00229 {
00230 if (chars[3] != 'x')
00231
00232 chars[3] = 'S';
00233 else
00234 chars[3] = 's';
00235 }
00236 #endif
00237 #ifdef S_ISGID
00238 if (bits & S_ISGID)
00239 {
00240 if (chars[6] != 'x')
00241
00242 chars[6] = 'S';
00243 else
00244 chars[6] = 's';
00245 }
00246 #endif
00247 #ifdef S_ISVTX
00248 if (bits & S_ISVTX)
00249 {
00250 if (chars[9] != 'x')
00251
00252 chars[9] = 'T';
00253 else
00254 chars[9] = 't';
00255 }
00256 #endif
00257 }