Пример #1
0
static int 
e2(void)
{
	if (eq(nxtarg(0), "!"))
		return(!e3());
	ap--;
	return(e3());
}
Пример #2
0
Файл: if.c Проект: quajo/v6shell
static bool
e2(void)
{

	if (equal(nxtarg(RETERR), "!"))
		return !e3();
	ap--;
	return e3();
}
Пример #3
0
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");
}
Пример #4
0
Файл: if.c Проект: quajo/v6shell
/*
 * 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;
}
Пример #5
0
Файл: if.c Проект: quajo/v6shell
static bool
e1(void)
{
	bool re;

	re = e2();
	if (equal(nxtarg(RETERR), "-a"))
		return re & e1();
	ap--;
	return re;
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
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);
}
Пример #9
0
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);
}
Пример #10
0
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;
    }
}
Пример #11
0
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);
}
Пример #12
0
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 ();
    }
}
Пример #13
0
/*
 * 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);
}
Пример #14
0
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;
    }
}
Пример #15
0
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;
}
Пример #16
0
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 */
}
Пример #17
0
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);
}
Пример #18
0
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));
}
Пример #19
0
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;
}
Пример #20
0
Файл: if.c Проект: quajo/v6shell
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;
}
Пример #21
0
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);
}