static int e2(void) { if (eq(nxtarg(0), "!")) return(!e3()); ap--; return(e3()); }
static bool e2(void) { if (equal(nxtarg(RETERR), "!")) return !e3(); ap--; return e3(); }
void getnams (void) { register COLLECTION *c; char buf[STRINGLENGTH]; register FILE *f; char *p,*q; for (c = firstC; c && c->Chtree != NULL; c = c->Cnext); if (c == NULL) return; (void) sprintf (buf,FILEHOSTS,DEFDIR); f = fopen (buf,"r"); if (f == NULL) logquit (1,"Can't open %s",buf); while ((p = fgets (buf,STRINGLENGTH,f)) != NULL) { if ((q = strchr (p,'\n'))) *q = '\0'; if (strchr ("#;:",*p)) continue; q = (char *)nxtarg (&p,"= \t"); p = (char *)skipover (p," \t"); if (*p == '=') p++; p = (char *)skipover (p," \t"); if (*p == '\0') goaway ("error in collection/host file"); do { if (strcmp (c->Cname, q) == 0) { do { q = (char *)nxtarg (&p,", \t"); p = (char *)skipover (p," \t"); if (*p == ',') p++; p = (char *)skipover (p," \t"); (void) Tinsert (&c->Chtree,q,FALSE); } while (*p != '\0'); } while ((c = c->Cnext) != NULL && c->Chtree != NULL); } while (c != NULL); for (c = firstC; c && c->Chtree != NULL; c = c->Cnext); if (c == NULL) break; } (void) fclose (f); if (c == NULL) return; do { logerr ("Host for collection %s not found",c->Cname); while ((c = c->Cnext) != NULL && c->Chtree != NULL); } while (c); logquit (1,"Hosts not found for all collections"); }
/* * Evaluate the expression. * Return true (1) or false (0). */ static bool expr(void) { bool re; re = e1(); if (equal(nxtarg(RETERR), "-o")) return re | expr(); ap--; return re; }
static bool e1(void) { bool re; re = e2(); if (equal(nxtarg(RETERR), "-a")) return re & e1(); ap--; return re; }
static int e1(void) { int p1; char *p2; p1 = e2(); p2 = nxtarg(1); if ((p2 != 0) && EQ(p2, "-a")) return (p1 & e1()); ap--; return (p1); }
static int exp(void) { int p1; char *p2; p1 = e1(); p2 = nxtarg(1); if (p2 != 0) { if (EQ(p2, "-o")) return (p1 | exp()); if (EQ(p2, "]")) synbad("syntax error", ""); } ap--; return (p1); }
int main(int argc, char *argv[]) { int status; ac = argc; av = argv; ap = 1; if (EQ(argv[0], "[")) { if (!EQ(argv[--ac], "]")) synbad("] missing", ""); } argv[ac] = 0; if (ac <= 1) exit(1); status = (exp() ? 0 : 1); if (nxtarg(1) != 0) synbad("too many arguments", ""); return (status); }
static int sexp(void) { int p1; unsigned char *p2; p1 = e1(); p2 = nxtarg(1); if (p2 != 0) { if (eq(p2, "-o")) return(p1 | sexp()); /* if (!eq(p2, ")")) failed("test", synmsg); */ } ap--; return(p1); }
static struct nexus * nexp1 (void) { register char *cp; register struct nexus *n, *o; if ((n = nexp2 ()) == NULL || (cp = nxtarg ()) == NULL) return n; if (*cp != '-') { padvise (NULL, "%s unexpected", cp); return NULL; } if (*++cp == '-') goto header; switch (smatch (cp, parswit)) { case AMBIGSW: ambigsw (cp, parswit); talked++; return NULL; case UNKWNSW: fprintf (stderr, "-%s unknown\n", cp); talked++; return NULL; case PRAND: o = newnexus (ANDaction); o->n_L_child = n; if ((o->n_R_child = nexp1 ())) return o; padvise (NULL, "missing conjunctive"); return NULL; header: ; default: prvarg (); return n; } }
int test(int argn, unsigned char *com[]) { ac = argn; av = com; ap = 1; if (eq(com[0],"[")) { if (!eq(com[--ac], "]")) failed("test", "] missing"); } com[ac] = 0; if (ac <= 1) return(1); #ifdef SUS if (ac == 2) return(eq(nxtarg(0), "")); if (ac == 3 || ac == 4) return(!e3()); #endif /* SUS */ return(sexp() ? 0 : 1); }
static struct nexus * nexp2 (void) { register char *cp; register struct nexus *n; if ((cp = nxtarg ()) == NULL) return NULL; if (*cp != '-') { prvarg (); return nexp3 (); } if (*++cp == '-') goto header; switch (smatch (cp, parswit)) { case AMBIGSW: ambigsw (cp, parswit); talked++; return NULL; case UNKWNSW: fprintf (stderr, "-%s unknown\n", cp); talked++; return NULL; case PRNOT: n = newnexus (NOTaction); if ((n->n_L_child = nexp3 ())) return n; padvise (NULL, "missing negation"); return NULL; header: ; default: prvarg (); return nexp3 (); } }
/* * evaluate a test expression. * flag is 0 on outer level * flag is 1 when in parenthesis * flag is 2 when evaluating -a */ static int expr(struct test *tp,register int flag) { register int r; register char *p; r = e3(tp); while(tp->ap < tp->ac) { p = nxtarg(tp,0); /* check for -o and -a */ if(flag && c_eq(p,')')) { tp->ap--; break; } if(*p=='-' && *(p+2)==0) { if(*++p == 'o') { if(flag==2) { tp->ap--; break; } r |= expr(tp,3); continue; } else if(*p == 'a') { r &= expr(tp,2); continue; } } if(flag==0) break; errormsg(SH_DICT,ERROR_exit(2),e_badsyntax); } return(r); }
static struct nexus * nexp3 (void) { int i; register char *cp, *dp; char buffer[BUFSIZ], temp[64]; register struct nexus *n; if ((cp = nxtarg ()) == NULL) return NULL; if (*cp != '-') { padvise (NULL, "%s unexpected", cp); return NULL; } if (*++cp == '-') { dp = ++cp; goto header; } switch (i = smatch (cp, parswit)) { case AMBIGSW: ambigsw (cp, parswit); talked++; return NULL; case UNKWNSW: fprintf (stderr, "-%s unknown\n", cp); talked++; return NULL; case PRLBR: if ((n = parse ()) == NULL) { padvise (NULL, "missing group"); return NULL; } if ((cp = nxtarg ()) == NULL) { padvise (NULL, "missing -rbrace"); return NULL; } if (*cp++ == '-' && smatch (cp, parswit) == PRRBR) return n; padvise (NULL, "%s unexpected", --cp); return NULL; default: prvarg (); return NULL; case PRCC: case PRDATE: case PRFROM: case PRTO: case PRSUBJ: strncpy(temp, parswit[i].sw, sizeof(temp)); temp[sizeof(temp) - 1] = '\0'; dp = *brkstring (temp, " ", NULL); header: ; if (!(cp = nxtarg ())) {/* allow -xyz arguments */ padvise (NULL, "missing argument to %s", argp[-2]); return NULL; } n = newnexus (GREPaction); n->n_header = 1; snprintf (buffer, sizeof(buffer), "^%s[ \t]*:.*%s", dp, cp); dp = buffer; goto pattern; case PRSRCH: n = newnexus (GREPaction); n->n_header = 0; if (!(cp = nxtarg ())) {/* allow -xyz arguments */ padvise (NULL, "missing argument to %s", argp[-2]); return NULL; } dp = cp; pattern: ; if (!gcompile (n, dp)) { padvise (NULL, "pattern error in %s %s", argp[-2], cp); return NULL; } n->n_patbuf = getcpy (dp); return n; case PROTHR: padvise (NULL, "internal error!"); return NULL; case PRDATF: if (!(datesw = nxtarg ()) || *datesw == '-') { padvise (NULL, "missing argument to %s", argp[-2]); return NULL; } return nexp3 (); case PRAFTR: case PRBEFR: if (!(cp = nxtarg ())) {/* allow -xyz arguments */ padvise (NULL, "missing argument to %s", argp[-2]); return NULL; } n = newnexus (TWSaction); n->n_datef = datesw; if (!tcompile (cp, &n->n_tws, n->n_after = i == PRAFTR)) { padvise (NULL, "unable to parse %s %s", argp[-2], cp); return NULL; } return n; } }
int init(int argc, char **argv) { char buf[STRINGLENGTH], fbuf[STRINGLENGTH], *p, *q; FILE *f; SCAN_COLLECTION **c; int fflag, sflag; char *filename = NULL; int errs = 0; quiet = FALSE; trace = FALSE; fflag = FALSE; sflag = FALSE; while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { case 'f': fflag = TRUE; if (argc == 2) usage(); --argc; argv++; filename = argv[1]; break; case 'q': quiet = TRUE; break; case 'v': trace = TRUE; break; case 's': sflag = TRUE; break; default: fprintf(stderr, "supscan: Invalid flag %s ignored\n", argv[1]); (void) fflush(stderr); } --argc; argv++; } if (!fflag) { (void) sprintf(fbuf, FILEDIRS, DEFDIR); filename = fbuf; } if (sflag) { if (argc != 1) usage(); firstC = NULL; c = &firstC; (void) sprintf(buf, FILEHOSTS, DEFDIR); if ((f = fopen(buf, "r")) == NULL) quit(1, "supscan: Unable to open %s\n", buf); while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; collname = nxtarg(&p, " \t="); p = skipover(p, " \t="); if (!localhost(p)) continue; *c = getscancoll(filename, estrdup(collname), NULL); if (*c) c = &((*c)->Cnext); else errs++; } (void) fclose(f); return errs; } if (argc < 2 && fflag) { firstC = NULL; c = &firstC; if ((f = fopen(filename, "r")) == NULL) quit(1, "supscan: Unable to open %s\n", filename); while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; q = nxtarg(&p, " \t="); p = skipover(p, " \t="); *c = getscancoll(filename, estrdup(q), estrdup(p)); if (*c) c = &((*c)->Cnext); else errs++; } (void) fclose(f); return errs; } if (argc < 2 || argc > 3) usage(); firstC = getscancoll(filename, estrdup(argv[1]), argc > 2 ? estrdup(argv[2]) : NULL); if (firstC == NULL) errs++; return errs; }
void check_config(void) { char buf[BUFSIZ]; char aclfile[MAXPATHLEN]; char *tools_dir=NULL; char *tree_owner=NULL; char *map_file=NULL; char *cmd; char *p; char *q=(char *)""; FILE *fp; int cmdfound; char *uniq_str_arg; struct stat st; struct passwd *pw; char * bufptr; BOOLEAN matched; int i; char * dummy; if (debug) diag("checking config"); if ( !batch ) { tree_base = *arglist++; tree_owner = *arglist++; } /* if */ cmd = *arglist; if (debug) diag("command: %s", cmd ); if ( strcmp ( cmd, "odexm_begin") == 0 ) { start_batch = 1; return; } /* if */ if ( strcmp ( cmd, "odexm_end") == 0 ) { end_batch = 1; return; } /* if */ if ( first ) { first = FALSE; if ((fp = fopen( conf_file, "r")) == NULL) efatal("fopen %s", conf_file); matched = FALSE; while ( fgets( buf, sizeof(buf), fp ) != NULL) { rm_newline ( buf ); bufptr = (char *) buf; uniq_str_arg = strdup ( nxtarg ( &bufptr, " \t" ) ); if ( strcmp ( uniq_str_arg, uniq_str ) != 0 ) continue; /* if */ matched = TRUE; if ( batch ) tree_base = strdup ( nxtarg ( &bufptr, " \t" ) ); else /* Skip over argument */ dummy = nxtarg ( &bufptr, " \t" ); /* if */ tools_dir = strdup ( nxtarg ( &bufptr, " \t" ) ); if ( batch ) tree_owner = strdup ( nxtarg ( &bufptr, " \t" ) ); else /* Skip over argument */ dummy = nxtarg ( &bufptr, " \t" ); /* if */ map_file = strdup ( nxtarg ( &bufptr, " \t" ) ); break; } /* while */ fclose ( fp ); if ( ! matched ) { sprintf (buf, "No match for unique string %s\nin configuration file %s.\n", uniq_str, conf_file ); fatal (buf); } if (debug) diag("map file %s", map_file ); if (lstat(map_file, &st) < 0 || (st.st_mode&S_IFMT) != S_IFREG) { sprintf(buf, "Invalid odexm map file: %s\n", map_file); fatal(buf); } if (debug) diag("map file mode ok"); if ((pw = getpwnam(tree_owner)) == NULL) fatal("Owner of directory not found"); if (pw -> pw_uid == 0) fatal("Cannot run as root"); if (setgid(pw->pw_gid) < 0) efatal("setgid"); if (setuid(pw->pw_uid) < 0) efatal("setuid"); if (chdir(tree_base) < 0) efatal("chdir"); if (debug) diag("setuid/chdir ok"); (void) concat ( exec_path, sizeof (exec_path), tools_dir, ":/bin:/usr/bin:/usr/ucb", NULL ); if ((fp = fopen(map_file, "r")) == NULL) efatal("map file fopen"); i = 0; while ((p = fgets(buf, sizeof(buf), fp)) != NULL) { if ((q = strrchr (p, '\n')) != NULL) *q = '\0'; q = nxtarg(&p, " \t"); strcpy ( map_data [i].cmd, q ); q = nxtarg(&p, " \t"); strcpy ( map_data [i].bin, q ); q = nxtarg(&p, " \t"); strcpy ( map_data [i].acl, q ); i++; } map_entries = i; (void) fclose(fp); } /* if */ if ( tempslot != 0 && !made_temp_dir ) { made_temp_dir = TRUE; concat ( tempdir, sizeof(tempdir), tree_base, "/#odexmXXXXXX", NULL); if ( opentemp(tempdir, tempdir ) < 0) { efatal("opentemp %s failed", tree_base); } } /* if */ cmdfound = FALSE; if ( strcmp ( cmd, "odexm_cp" ) != 0 ) { for ( i = 0; i < map_entries; i++ ) { if (strcmp( map_data [i].cmd, cmd) == 0) { cmdfound = TRUE; (void) strcpy(aclfile, q); strcpy ( cmdbuf, map_data [i].bin ); } /* if */ } /* for */ if (!cmdfound) { sprintf (buf, "No match for command %s in map file %s.\n", cmd, map_file ); fatal("%s", buf); } if (debug) diag("command %s acl %s temp %s", cmdbuf, aclfile, tempdir); /* if */ } /* if */ if ( !batch ) authenticate_client (); /* if */ }
static SCAN_COLLECTION * getscancoll(char *filename, char *collname, char *basedir) { char buf[STRINGLENGTH], *p, *q; FILE *f; SCAN_COLLECTION *c; if (basedir == NULL) { if ((f = fopen(filename, "r")) != NULL) { while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; q = nxtarg(&p, " \t="); if (strcmp(q, collname) == 0) { p = skipover(p, " \t="); basedir = estrdup(p); break; } } (void) fclose(f); } if (basedir == NULL) { (void) sprintf(buf, FILEBASEDEFAULT, collname); basedir = estrdup(buf); } } if (chdir(basedir) < 0) { fprintf(stderr, "supscan: Can't chdir to base directory %s " "for %s (%s)\n", basedir, collname, strerror(errno)); return (NULL); } prefix = NULL; (void) sprintf(buf, FILEPREFIX, collname); if ((f = fopen(buf, "r")) != NULL) { while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; prefix = estrdup(p); if (chdir(prefix) < 0) { fprintf(stderr, "supscan: can't chdir to %s " " from base directory %s for %s (%s)\n", prefix, basedir, collname, strerror(errno)); fclose(f); free(prefix); return (NULL); } break; } (void) fclose(f); } if ((c = malloc(sizeof(*c))) == NULL) quit(1, "supscan: can't malloc collection structure\n"); c->Cname = collname; c->Cbase = basedir; c->Cprefix = prefix; c->Cnext = NULL; return (c); }
static int e3(struct test *tp) { register char *arg, *cp; register int op; char *binop; arg=nxtarg(tp,0); if(arg && c_eq(arg, '!')) return(!e3(tp)); if(c_eq(arg, '(')) { op = expr(tp,1); cp = nxtarg(tp,0); if(!cp || !c_eq(cp, ')')) errormsg(SH_DICT,ERROR_exit(2),e_missing,"')'"); return(op); } cp = nxtarg(tp,1); if(cp!=0 && (c_eq(cp,'=') || c2_eq(cp,'!','='))) goto skip; if(c2_eq(arg,'-','t')) { if(cp) { op = strtol(cp,&binop, 10); return(*binop?0:tty_check(op)); } else { /* test -t with no arguments */ tp->ap--; return(tty_check(1)); } } if(*arg=='-' && arg[2]==0) { op = arg[1]; if(!cp) { /* for backward compatibility with new flags */ if(op==0 || !strchr(test_opchars+10,op)) return(1); errormsg(SH_DICT,ERROR_exit(2),e_argument); } if(strchr(test_opchars,op)) return(test_unop(tp->sh,op,cp)); } if(!cp) { tp->ap--; return(*arg!=0); } skip: op = sh_lookup(binop=cp,shtab_testops); if(!(op&TEST_BINOP)) cp = nxtarg(tp,0); if(!op) errormsg(SH_DICT,ERROR_exit(2),e_badop,binop); if(op==TEST_AND || op==TEST_OR) tp->ap--; return(test_binop(tp->sh,op,arg,cp)); }
static int e3(void) { int p1; register unsigned char *a; unsigned char *p2; long long ll_1, ll_2; a = nxtarg(0); if (eq(a, "(")) { p1 = sexp(); if (!eq(nxtarg(0), ")")) failed("test",") expected"); return(p1); } p2 = nxtarg(1); ap--; if ((p2 == 0) || (!eq(p2, "=") && !eq(p2, "!="))) { if (eq(a, "-r")) return(chk_access(nxtarg(0), S_IREAD, 0) == 0); if (eq(a, "-w")) return(chk_access(nxtarg(0), S_IWRITE, 0) == 0); if (eq(a, "-x")) return(chk_access(nxtarg(0), S_IEXEC, 0) == 0); #ifdef SUS if (eq(a, "-e")) return(access(nxtarg(0), F_OK) == 0); if (eq(a, "-S")) return(filtyp(nxtarg(0), S_IFSOCK)); if (eq(a, "!")) return(!e3()); #endif /* SUS */ if (eq(a, "-d")) return(filtyp(nxtarg(0), S_IFDIR)); if (eq(a, "-c")) return(filtyp(nxtarg(0), S_IFCHR)); if (eq(a, "-b")) return(filtyp(nxtarg(0), S_IFBLK)); if (eq(a, "-f")) if (ucb_builtins) { struct stat statb; return(stat((char *)nxtarg(0), &statb) >= 0 && (statb.st_mode & S_IFMT) != S_IFDIR); } else return(filtyp(nxtarg(0), S_IFREG)); if (eq(a, "-u")) return(ftype(nxtarg(0), S_ISUID)); if (eq(a, "-g")) return(ftype(nxtarg(0), S_ISGID)); if (eq(a, "-k")) return(ftype(nxtarg(0), S_ISVTX)); if (eq(a, "-p")) return(filtyp(nxtarg(0), S_IFIFO)); if (eq(a, "-h") || eq(a, "-L")) return(filtyp(nxtarg(0), S_IFLNK)); if (eq(a, "-s")) return(fsizep(nxtarg(0))); if (eq(a, "-t")) { if (ap >= ac) /* no args */ return(isatty(1)); else if (eq((a = nxtarg(0)), "-a") || eq(a, "-o")) { ap--; return(isatty(1)); } else return(isatty(atoi((char *)a))); } if (eq(a, "-n")) return(!eq(nxtarg(0), "")); if (eq(a, "-z")) return(eq(nxtarg(0), "")); } p2 = nxtarg(1); if (p2 == 0) return(!eq(a, "")); if (eq(p2, "-a") || eq(p2, "-o")) { ap--; return(!eq(a, "")); } if (eq(p2, "=")) return(eq(nxtarg(0), a)); if (eq(p2, "!=")) return(!eq(nxtarg(0), a)); ll_1 = stoifll(a); ll_2 = stoifll(nxtarg(0)); if (eq(p2, "-eq")) return (ll_1 == ll_2); if (eq(p2, "-ne")) return (ll_1 != ll_2); if (eq(p2, "-gt")) return (ll_1 > ll_2); if (eq(p2, "-lt")) return (ll_1 < ll_2); if (eq(p2, "-ge")) return (ll_1 >= ll_2); if (eq(p2, "-le")) return (ll_1 <= ll_2); bfailed(btest, badop, p2); /* NOTREACHED */ return 0; }
static bool e3(void) { bool re; pid_t cpid, tpid; int cstat, d; char *a, *b; if ((a = nxtarg(RETERR)) == NULL) err(FC_ERR, FMT3S, getmyname(), av[ap - 2], ERR_EXPR); /* * Deal w/ parentheses for grouping. */ if (equal(a, "(")) { re = expr(); if (!equal(nxtarg(RETERR), ")")) err(FC_ERR, FMT3S, getmyname(), a, ERR_PAREN); return re; } /* * Execute { command [arg ...] } to obtain its exit status. */ if (equal(a, "{")) { if ((cpid = fork()) == -1) err(FC_ERR, FMT2S, getmyname(), ERR_FORK); if (cpid == 0) /**** Child! ****/ doex(FORKED); else { /**** Parent! ****/ tpid = wait(&cstat); while ((a = nxtarg(RETERR)) != NULL && !equal(a, "}")) ; /* nothing */ if (a == NULL) ap--; return (tpid == cpid && cstat == 0) ? true : false; } } /* * file existence/permission tests */ if (equal(a, "-e")) return ifaccess(nxtarg(!RETERR), F_OK); if (equal(a, "-r")) return ifaccess(nxtarg(!RETERR), R_OK); if (equal(a, "-w")) return ifaccess(nxtarg(!RETERR), W_OK); if (equal(a, "-x")) return ifaccess(nxtarg(!RETERR), X_OK); /* * file existence/type tests */ if (equal(a, "-d")) return ifstat1(nxtarg(!RETERR), S_IFDIR); if (equal(a, "-f")) return ifstat1(nxtarg(!RETERR), S_IFREG); if (equal(a, "-h")) return ifstat1(nxtarg(!RETERR), S_IFLNK); if (equal(a, "-s")) return ifstat1(nxtarg(!RETERR), F_GZ); if (equal(a, "-t")) { /* Does the descriptor refer to a terminal device? */ b = nxtarg(RETERR); if (b == NULL || *b == EOS) err(FC_ERR, FMT3S, getmyname(), a, ERR_DIGIT); if (*b >= '0' && *b <= '9' && *(b + 1) == EOS) { d = *b - '0'; if (IS_DIGIT(d, *b)) return isatty(d) != 0; } err(FC_ERR, FMT3S, getmyname(), b, ERR_NOTDIGIT); } /* * binary comparisons */ if ((b = nxtarg(RETERR)) == NULL) err(FC_ERR, FMT3S, getmyname(), a, ERR_OPERATOR); if (equal(b, "=")) return equal(a, nxtarg(!RETERR)); if (equal(b, "!=")) return !equal(a, nxtarg(!RETERR)); if (equal(b, "-ot")) return ifstat2(a, nxtarg(!RETERR), F_OT); if (equal(b, "-nt")) return ifstat2(a, nxtarg(!RETERR), F_NT); if (equal(b, "-ef")) return ifstat2(a, nxtarg(!RETERR), F_EF); err(FC_ERR, FMT3S, getmyname(), b, ERR_OPUNKNOWN); /*NOTREACHED*/ return false; }
static int e3(void) { int p1; char *a; char *p2; int int1, int2; a = nxtarg(0); if (EQ(a, "(")) { p1 = exp(); if (!EQ(nxtarg(0), ")")) synbad(") expected", ""); return (p1); } p2 = nxtarg(1); ap--; if ((p2 == 0) || (!EQ(p2, "=") && !EQ(p2, "!="))) { if (EQ(a, "-r")) return (tio(nxtarg(0), 4)); if (EQ(a, "-w")) return (tio(nxtarg(0), 2)); if (EQ(a, "-x")) return (tio(nxtarg(0), 1)); if (EQ(a, "-d")) return (filtyp(nxtarg(0), S_IFDIR)); if (EQ(a, "-c")) return (filtyp(nxtarg(0), S_IFCHR)); if (EQ(a, "-b")) return (filtyp(nxtarg(0), S_IFBLK)); if (EQ(a, "-f")) { struct stat statb; return (stat(nxtarg(0), &statb) >= 0 && (statb.st_mode & S_IFMT) != S_IFDIR); } if (EQ(a, "-h")) return (filtyp(nxtarg(0), S_IFLNK)); if (EQ(a, "-u")) return (ftype(nxtarg(0), S_ISUID)); if (EQ(a, "-g")) return (ftype(nxtarg(0), S_ISGID)); if (EQ(a, "-k")) return (ftype(nxtarg(0), S_ISVTX)); if (EQ(a, "-p")) #ifdef S_IFIFO return (filtyp(nxtarg(0), S_IFIFO)); #else return (nxtarg(0), 0); #endif if (EQ(a, "-s")) return (fsizep(nxtarg(0))); if (EQ(a, "-t")) if (ap >= ac) return (isatty(1)); else if (EQ((a = nxtarg(0)), "-a") || EQ(a, "-o")) { ap--; return (isatty(1)); } else return (isatty(atoi(a))); if (EQ(a, "-n")) return (!EQ(nxtarg(0), "")); if (EQ(a, "-z")) return (EQ(nxtarg(0), "")); } p2 = nxtarg(1); if (p2 == 0) return (!EQ(a, "")); if (EQ(p2, "-a") || EQ(p2, "-o")) { ap--; return (!EQ(a, "")); } if (EQ(p2, "=")) return (EQ(nxtarg(0), a)); if (EQ(p2, "!=")) return (!EQ(nxtarg(0), a)); int1 = atoi(a); int2 = atoi(nxtarg(0)); if (EQ(p2, "-eq")) return (int1 == int2); if (EQ(p2, "-ne")) return (int1 != int2); if (EQ(p2, "-gt")) return (int1 > int2); if (EQ(p2, "-lt")) return (int1 < int2); if (EQ(p2, "-ge")) return (int1 >= int2); if (EQ(p2, "-le")) return (int1 <= int2); synbad("unknown operator ", p2); /* NOTREACHED */ return (0); }