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 '?'; }
static char ftypelet (mode_t bits) { /* These are the most common, so test for them first. */ if (S_ISREG (bits)) return '-'; if (S_ISDIR (bits)) return 'd'; /* Other letters standardized by POSIX 1003.1-2004. */ if (S_ISBLK (bits)) return 'b'; if (S_ISCHR (bits)) return 'c'; if (S_ISLNK (bits)) return 'l'; if (S_ISFIFO (bits)) return 'p'; /* Other file types (though not letters) standardized by POSIX. */ if (S_ISSOCK (bits)) return 's'; /* Nonstandard file types. */ if (S_ISCTG (bits)) return 'C'; if (S_ISDOOR (bits)) return 'D'; if (S_ISMPB (bits) || S_ISMPC (bits) || S_ISMPX (bits)) return 'm'; if (S_ISNWK (bits)) return 'n'; if (S_ISPORT (bits)) return 'P'; if (S_ISWHT (bits)) return 'w'; return '?'; }
int modex(register int i) { #if _S_IDPERM && _S_IDTYPE return(i); #else register int x; register int c; x = 0; #if _S_IDPERM x |= (i & 07777); #else for (c = 0; c < PERMLEN; c++) if (i & permmap[c++]) x |= permmap[c]; #endif #if _S_IDTYPE x |= (i & X_IFMT); #else if (S_ISREG(i)) x |= X_IFREG; else if (S_ISDIR(i)) x |= X_IFDIR; #ifdef S_ISLNK else if (S_ISLNK(i)) x |= X_IFLNK; #endif else if (S_ISBLK(i)) x |= X_IFBLK; else if (S_ISCHR(i)) x |= X_IFCHR; #ifdef S_ISCTG else if (S_ISCTG(i)) x |= X_IFCTG; #endif else if (S_ISFIFO(i)) x |= X_IFIFO; #ifdef S_ISSOCK else if (S_ISSOCK(i)) x |= X_IFSOCK; #endif #endif return(x); #endif }
S_IRWXO, S_IROTH, S_IWOTH, S_IXOTH, S_ISUID, S_ISGID, S_ISVTX, 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));
main() { int n; int idperm; int idtype; idperm = idtype = 1; #ifndef S_ITYPE #ifdef S_IFMT printf("#define S_ITYPE(m) ((m)&S_IFMT)\n"); #else printf("#define S_ITYPE(m) ((m)&~S_IPERM)\n"); #endif #endif #ifdef S_ISBLK if (!S_ISBLK(X_IFBLK)) idtype = 0; #else #ifdef S_IFBLK printf("#define S_ISBLK(m) (S_ITYPE(m)==S_IFBLK)\n"); #else printf("#define S_ISBLK(m) 0\n"); #endif #endif #ifdef S_ISCHR if (!S_ISCHR(X_IFCHR)) idtype = 0; #else #ifdef S_IFCHR printf("#define S_ISCHR(m) (S_ITYPE(m)==S_IFCHR)\n"); #else printf("#define S_ISCHR(m) 0\n"); #endif #endif #ifdef S_ISCTG if (!S_ISCTG(X_IFCTG)) idtype = 0; #else #ifdef S_IFCTG printf("#define S_ISCTG(m) (S_ITYPE(m)==S_IFCTG)\n"); #endif #endif #ifdef S_ISDIR if (!S_ISDIR(X_IFDIR)) idtype = 0; #else #ifdef S_IFDIR printf("#define S_ISDIR(m) (S_ITYPE(m)==S_IFDIR)\n"); #else printf("#define S_ISDIR(m) 0\n"); #endif #endif #ifdef S_ISFIFO if (!S_ISFIFO(X_IFIFO)) idtype = 0; #else #ifdef S_IFIFO printf("#define S_ISFIFO(m) (S_ITYPE(m)==S_IFIFO)\n"); #else printf("#define S_ISFIFO(m) 0\n"); #endif #endif #ifdef S_ISLNK if (!S_ISLNK(X_IFLNK)) idtype = 0; #else #ifdef S_IFLNK printf("#define S_ISLNK(m) (S_ITYPE(m)==S_IFLNK)\n"); #else printf("#define S_ISLNK(m) 0\n"); #endif #endif #ifdef S_ISREG if (!S_ISREG(X_IFREG)) idtype = 0; #else #ifdef S_IFREG printf("#define S_ISREG(m) (S_ITYPE(m)==S_IFREG)\n"); #else printf("#define S_ISREG(m) 0\n"); #endif #endif #ifdef S_ISSOCK if (!S_ISSOCK(X_IFSOCK)) idtype = 0; #else #ifdef S_IFSOCK printf("#define S_ISSOCK(m) (S_ITYPE(m)==S_IFSOCK)\n"); #endif #endif printf("\n"); #ifndef S_IPERM printf("#define S_IPERM (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)\n"); #endif #ifndef S_ISUID printf("#define S_ISUID 0%04o\n", X_ISUID); #else if (S_ISUID != X_ISUID) idperm = 0; #endif #ifndef S_ISGID printf("#define S_ISGID 0%04o\n", X_ISGID); #else if (S_ISGID != X_ISGID) idperm = 0; #endif #ifndef S_ISVTX printf("#define S_ISVTX 0%04o\n", X_ISVTX); #else if (S_ISVTX != X_ISVTX) idperm = 0; #endif #ifndef S_IRUSR printf("#define S_IRUSR 0%04o\n", X_IRUSR); #else if (S_IRUSR != X_IRUSR) idperm = 0; #endif #ifndef S_IWUSR printf("#define S_IWUSR 0%04o\n", X_IWUSR); #else if (S_IWUSR != X_IWUSR) idperm = 0; #endif #ifndef S_IXUSR printf("#define S_IXUSR 0%04o\n", X_IXUSR); #else if (S_IXUSR != X_IXUSR) idperm = 0; #endif #ifndef S_IRGRP printf("#define S_IRGRP 0%04o\n", X_IRGRP); #else if (S_IRGRP != X_IRGRP) idperm = 0; #endif #ifndef S_IWGRP printf("#define S_IWGRP 0%04o\n", X_IWGRP); #else if (S_IWGRP != X_IWGRP) idperm = 0; #endif #ifndef S_IXGRP printf("#define S_IXGRP 0%04o\n", X_IXGRP); #else if (S_IXGRP != X_IXGRP) idperm = 0; #endif #ifndef S_IROTH printf("#define S_IROTH 0%04o\n", X_IROTH); #else if (S_IROTH != X_IROTH) idperm = 0; #endif #ifndef S_IWOTH printf("#define S_IWOTH 0%04o\n", X_IWOTH); #else if (S_IWOTH != X_IWOTH) idperm = 0; #endif #ifndef S_IXOTH printf("#define S_IXOTH 0%04o\n", X_IXOTH); #else if (S_IXOTH != X_IXOTH) idperm = 0; #endif #ifndef S_IRWXU printf("#define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)\n"); #endif #ifndef S_IRWXG printf("#define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)\n"); #endif #ifndef S_IRWXO printf("#define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)\n"); #endif printf("\n"); if (idperm) printf("#define _S_IDPERM 1\n"); if (idtype) printf("#define _S_IDTYPE 1\n"); printf("\n"); #ifdef BUFFERSIZE n = BUFFERSIZE; #else #ifdef MAXBSIZE n = MAXBSIZE; #else #ifdef SBUFSIZE n = SBUFSIZE; #else #ifdef BUFSIZ n = BUFSIZ; #else if (sizeof(char*) > 4) n = 8192; else if (sizeof(char*) < 4) n = 512; else n = 4096; #endif #endif #endif #endif printf("#define BUFFERSIZE %u\n", n); printf("\n"); return(0); }
int test_unop(Shell_t *shp,register int op,register const char *arg) { struct stat statb; int f; switch(op) { case 'r': return(permission(arg, R_OK)); case 'w': return(permission(arg, W_OK)); case 'x': return(permission(arg, X_OK)); case 'V': #if SHOPT_FS_3D { register int offset = staktell(); if(stat(arg,&statb)<0 || !S_ISREG(statb.st_mode)) return(0); /* add trailing / */ stakputs(arg); stakputc('/'); stakputc(0); arg = (const char*)stakptr(offset); stakseek(offset); /* FALL THRU */ } #else return(0); #endif /* SHOPT_FS_3D */ case 'd': return(test_stat(arg,&statb)>=0 && S_ISDIR(statb.st_mode)); case 'c': return(test_stat(arg,&statb)>=0 && S_ISCHR(statb.st_mode)); case 'b': return(test_stat(arg,&statb)>=0 && S_ISBLK(statb.st_mode)); case 'f': return(test_stat(arg,&statb)>=0 && S_ISREG(statb.st_mode)); case 'u': return(test_mode(arg)&S_ISUID); case 'g': return(test_mode(arg)&S_ISGID); case 'k': #ifdef S_ISVTX return(test_mode(arg)&S_ISVTX); #else return(0); #endif /* S_ISVTX */ #if SHOPT_TEST_L case 'l': #endif case 'L': case 'h': /* undocumented, and hopefully will disappear */ if(*arg==0 || arg[strlen(arg)-1]=='/' || lstat(arg,&statb)<0) return(0); return(S_ISLNK(statb.st_mode)); case 'C': #ifdef S_ISCTG return(test_stat(arg,&statb)>=0 && S_ISCTG(statb.st_mode)); #else return(0); #endif /* S_ISCTG */ case 'H': #ifdef S_ISCDF { register int offset = staktell(); if(test_stat(arg,&statb)>=0 && S_ISCDF(statb.st_mode)) return(1); stakputs(arg); stakputc('+'); stakputc(0); arg = (const char*)stakptr(offset); stakseek(offset); return(test_stat(arg,&statb)>=0 && S_ISCDF(statb.st_mode)); } #else return(0); #endif /* S_ISCDF */ case 'S': return(isasock(arg,&statb)); case 'N': return(test_stat(arg,&statb)>=0 && tmxgetmtime(&statb) > tmxgetatime(&statb)); case 'p': return(isapipe(arg,&statb)); case 'n': return(*arg != 0); case 'z': return(*arg == 0); case 's': sfsync(sfstdout); case 'O': case 'G': if(*arg==0 || test_stat(arg,&statb)<0) return(0); if(op=='s') return(statb.st_size>0); else if(op=='O') return(statb.st_uid==shp->gd->userid); return(statb.st_gid==shp->gd->groupid); case 'a': case 'e': if(memcmp(arg,"/dev/",5)==0 && sh_open(arg,O_NONBLOCK)) return(1); return(permission(arg, F_OK)); case 'o': f=1; if(*arg=='?') return(sh_lookopt(arg+1,&f)>0); op = sh_lookopt(arg,&f); return(op && (f==(sh_isoption(op)!=0))); case 't': { char *last; op = strtol(arg,&last, 10); return(*last?0:tty_check(op)); } case 'v': case 'R': { Namval_t *np; Namarr_t *ap; int isref; if(!(np = nv_open(arg,shp->var_tree,NV_VARNAME|NV_NOFAIL|NV_NOADD|NV_NOREF))) return(0); isref = nv_isref(np); if(op=='R') return(isref); if(isref) { if(np->nvalue.cp) np = nv_refnode(np); else return(0); } if(ap = nv_arrayptr(np)) return(nv_arrayisset(np,ap)); return(!nv_isnull(np) || nv_isattr(np,NV_INTEGER)); } default: { static char a[3] = "-?"; a[1]= op; errormsg(SH_DICT,ERROR_exit(2),e_badop,a); /* NOTREACHED */ return(0); } } }
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"); }