/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ #pragma ident "%Z%%M% %I% %E% SMI" #include /* EFT abs k16 */ #include "test.h" #undef BUFSIZ #include #include "wish.h" #include #define prs(a) putastr(a, out) #define failed(a, b) mess_temp(b) typedef struct io_struct { int flags; union { FILE *fp; struct { char *val; int count; int pos; } str; } mu; struct io_struct *next; } IOSTRUCT; int ap, ac; char **av; int cmd_test(argn, com, in, out, err) char *com[]; int argn; IOSTRUCT *in; IOSTRUCT *out; IOSTRUCT *err; { ac = argn; av = com; ap = 1; if (eq(com[0],"[")) { if (!eq(com[--ac], "]")) failed("test", "] missing"); } com[ac] = 0; if (ac <= 1) return(FAIL); return(exp() ? SUCCESS : FAIL); } /* * CF is a "strcmp" function referenced in test.h .... */ int cf(s1, s2) register char *s1, *s2; { while (*s1++ == *s2) if (*s2++ == 0) return(0); return(*--s1 - *s2); } char * nxtarg(mt) { if (ap >= ac) { if (mt) { ap++; return(0); } failed("test", "argument expected"); } return(av[ap++]); } 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, "]") && !eq(p2, ")")) failed("test", "test syntax error"); } ap--; return(p1); } int e1(void) { int p1; char *p2; p1 = e2(); p2 = nxtarg(1); if ((p2 != 0) && eq(p2, "-a")) return(p1 & e1()); ap--; return(p1); } int e2(void) { if (eq(nxtarg(0), "!")) return(!e3()); ap--; return(e3()); } int e3(void) { int p1; register char *a; char *p2; long atol(); long int1, int2; a = nxtarg(0); if (eq(a, "(")) { p1 = exp(); 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(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")) 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, "-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(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 = atol(a); int2 = atol(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); failed("test", "test - unknown operator"); /* NOTREACHED */ return (0); } int tio(a, f) char *a; int f; { if (access(a, f) == 0) return(1); else return(0); } int ftype(f, field) char *f; int field; { struct stat statb; if (stat(f, &statb) < 0) return(0); if ((statb.st_mode & field) == field) return(1); return(0); } int filtyp(f,field) char *f; int field; { struct stat statb; if (stat(f, &statb) < 0) return(0); if ((statb.st_mode & S_IFMT) == field) return(1); else return(0); } int fsizep(f) char *f; { struct stat statb; if (stat(f, &statb) < 0) return(0); return(statb.st_size > 0); }