static char ftypelet(unsigned mode) { if (S_ISREG(mode)) return '-'; if (S_ISDIR(mode)) return 'd'; #ifdef S_ISBLK if (S_ISBLK(mode)) return 'b'; #endif #ifdef S_ISCHR if (S_ISCHR(mode)) return 'c'; #endif #ifdef S_ISFIFO if (S_ISFIFO(mode)) return 'p'; #endif #ifdef S_ISLNK if (S_ISLNK(mode)) return 'l'; #endif #ifdef S_ISSOCK if (S_ISSOCK(mode)) return 's'; #endif #ifdef S_ISMPC if (S_ISMPC(mode)) return 'm'; #endif #ifdef S_ISNWK if (S_ISNWK(mode)) return 'n'; #endif #ifdef S_ISOFD if (S_ISOFD(mode)) return 'M'; /* Cray migrated dmf file. */ #endif #ifdef S_ISOFL if (S_ISOFL(mode)) return 'M'; /* Cray migrated dmf file. */ #endif return '?'; }
static char ftypelet (mode_t bits) { #ifdef S_ISBLK if (S_ISBLK (bits)) return 'b'; #endif if (S_ISCHR (bits)) return 'c'; if (S_ISDIR (bits)) return 'd'; if (S_ISREG (bits)) return '-'; #ifdef S_ISFIFO if (S_ISFIFO (bits)) return 'p'; #endif #ifdef S_ISLNK if (S_ISLNK (bits)) return 'l'; #endif #ifdef S_ISSOCK if (S_ISSOCK (bits)) return 's'; #endif #ifdef S_ISMPC if (S_ISMPC (bits)) return 'm'; #endif #ifdef S_ISNWK if (S_ISNWK (bits)) return 'n'; #endif #ifdef S_ISDOOR if (S_ISDOOR (bits)) return 'D'; #endif #ifdef S_ISCTG if (S_ISCTG (bits)) return 'C'; #endif /* The following two tests are for Cray DMF (Data Migration Facility), which is a HSM file system. A migrated file has a `st_dm_mode' that is different from the normal `st_mode', so any tests for migrated files should use the former. */ #ifdef S_ISOFD if (S_ISOFD (bits)) /* off line, with data */ return 'M'; #endif #ifdef S_ISOFL /* off line, with no data */ if (S_ISOFL (bits)) return 'M'; #endif return '?'; }
static char ftypelet (mode_t bits) { if (S_ISBLK (bits)) return 'b'; if (S_ISCHR (bits)) return 'c'; if (S_ISDIR (bits)) return 'd'; if (S_ISREG (bits)) return '-'; if (S_ISFIFO (bits)) return 'p'; if (S_ISLNK (bits)) return 'l'; if (S_ISSOCK (bits)) return 's'; if (S_ISMPC (bits)) return 'm'; if (S_ISNWK (bits)) return 'n'; if (S_ISDOOR (bits)) return 'D'; if (S_ISCTG (bits)) return 'C'; /* Added by Alexander Lamaison for Swish project */ if (S_ISWHT (bits)) return 'w'; if (S_ISMPB (bits)) return 'B'; if (S_ISNAM (bits)) return 'x'; /* Added 2006.08.20 */ /* The following two tests are for Cray DMF (Data Migration Facility), which is a HSM file system. A migrated file has a `st_dm_mode' that is different from the normal `st_mode', so any tests for migrated files should use the former. */ if (S_ISOFD (bits)) /* off line, with data */ return 'M'; /* off line, with no data */ if (S_ISOFL (bits)) return 'M'; return '?'; }
S_ISBLK (S_IFREG), S_ISCHR (S_IFREG), S_ISDIR (S_IFREG), S_ISFIFO (S_IFREG), S_ISREG (S_IFREG), S_ISLNK (S_IFREG), S_ISSOCK (S_IFREG), S_ISDOOR (S_IFREG), S_ISMPB (S_IFREG), S_ISMPX (S_IFREG), S_ISNAM (S_IFREG), S_ISNWK (S_IFREG), S_ISPORT (S_IFREG), S_ISCTG (S_IFREG), S_ISOFD (S_IFREG), S_ISOFL (S_IFREG), S_ISWHT (S_IFREG) }; /* Sanity checks. */ verify (S_IRWXU == (S_IRUSR | S_IWUSR | S_IXUSR)); verify (S_IRWXG == (S_IRGRP | S_IWGRP | S_IXGRP)); verify (S_IRWXO == (S_IROTH | S_IWOTH | S_IXOTH)); #ifdef S_IFBLK verify (S_ISBLK (S_IFBLK)); #endif verify (!S_ISBLK (S_IFCHR)); verify (!S_ISBLK (S_IFDIR)); verify (!S_ISBLK (S_IFIFO));
char const * file_type (struct stat const *st) { /* See POSIX 1003.1-2001 XCU Table 4-8 lines 17093-17107 for some of these formats. To keep diagnostics grammatical in English, the returned string must start with a consonant. */ /* Do these three first, as they're the most common. */ if (S_ISREG (st->st_mode)) return st->st_size == 0 ? _("regular empty file") : _("regular file"); if (S_ISDIR (st->st_mode)) return _("directory"); if (S_ISLNK (st->st_mode)) return _("symbolic link"); /* Do the S_TYPEIS* macros next, as they may be implemented in terms of S_ISNAM, and we want the more-specialized interpretation. */ if (S_TYPEISMQ (st)) return _("message queue"); if (S_TYPEISSEM (st)) return _("semaphore"); if (S_TYPEISSHM (st)) return _("shared memory object"); if (S_TYPEISTMO (st)) return _("typed memory object"); /* The remaining are in alphabetical order. */ if (S_ISBLK (st->st_mode)) return _("block special file"); if (S_ISCHR (st->st_mode)) return _("character special file"); if (S_ISCTG (st->st_mode)) return _("contiguous data"); if (S_ISFIFO (st->st_mode)) return _("fifo"); if (S_ISDOOR (st->st_mode)) return _("door"); if (S_ISMPB (st->st_mode)) return _("multiplexed block special file"); if (S_ISMPC (st->st_mode)) return _("multiplexed character special file"); if (S_ISMPX (st->st_mode)) return _("multiplexed file"); if (S_ISNAM (st->st_mode)) return _("named file"); if (S_ISNWK (st->st_mode)) return _("network special file"); if (S_ISOFD (st->st_mode)) return _("migrated file with data"); if (S_ISOFL (st->st_mode)) return _("migrated file without data"); if (S_ISPORT (st->st_mode)) return _("port"); if (S_ISSOCK (st->st_mode)) return _("socket"); if (S_ISWHT (st->st_mode)) return _("whiteout"); return _("weird file"); }
static void statmodeprint(mode_t mode, char *outbuf, int flags) { if (flags & STF_RAW) { sprintf(outbuf, (flags & STF_OCTAL) ? "0%lo" : "%lu", (unsigned long)mode); if (flags & STF_STRING) strcat(outbuf, " ("); } if (flags & STF_STRING) { static const char *modes = "?rwxrwxrwx"; #ifdef __CYGWIN__ static mode_t mflags[9] = { 0 }; #else static const mode_t mflags[9] = { S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH }; #endif const mode_t *mfp = mflags; char pm[11]; int i; #ifdef __CYGWIN__ if (mflags[0] == 0) { mflags[0] = S_IRUSR; mflags[1] = S_IWUSR; mflags[2] = S_IXUSR; mflags[3] = S_IRGRP; mflags[4] = S_IWGRP; mflags[5] = S_IXGRP; mflags[6] = S_IROTH; mflags[7] = S_IWOTH; mflags[8] = S_IXOTH; } #endif if (S_ISBLK(mode)) *pm = 'b'; else if (S_ISCHR(mode)) *pm = 'c'; else if (S_ISDIR(mode)) *pm = 'd'; else if (S_ISDOOR(mode)) *pm = 'D'; else if (S_ISFIFO(mode)) *pm = 'p'; else if (S_ISLNK(mode)) *pm = 'l'; else if (S_ISMPC(mode)) *pm = 'm'; else if (S_ISNWK(mode)) *pm = 'n'; else if (S_ISOFD(mode)) *pm = 'M'; else if (S_ISOFL(mode)) *pm = 'M'; else if (S_ISREG(mode)) *pm = '-'; else if (S_ISSOCK(mode)) *pm = 's'; else *pm = '?'; for (i = 1; i <= 9; i++) pm[i] = (mode & *mfp++) ? modes[i] : '-'; pm[10] = '\0'; if (mode & S_ISUID) pm[3] = (mode & S_IXUSR) ? 's' : 'S'; if (mode & S_ISGID) pm[6] = (mode & S_IXGRP) ? 's' : 'S'; if (mode & S_ISVTX) pm[9] = (mode & S_IXOTH) ? 't' : 'T'; pm[10] = 0; strcat(outbuf, pm); if (flags & STF_RAW) strcat(outbuf, ")"); } }