|
|
1.1 ! root 1: /* ! 2: * test expression ! 3: * [ expression ] ! 4: */ ! 5: ! 6: #include <stdio.h> ! 7: #include <sys/types.h> ! 8: #include <sys/stat.h> ! 9: #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0)) ! 10: ! 11: int ap; ! 12: int ac; ! 13: char **av; ! 14: char *tmp; ! 15: ! 16: main(argc, argv) ! 17: char *argv[]; ! 18: { ! 19: ! 20: ac = argc; av = argv; ap = 1; ! 21: if(EQ(argv[0],"[")) { ! 22: if(!EQ(argv[--ac],"]")) ! 23: synbad("] missing",""); ! 24: } ! 25: argv[ac] = 0; ! 26: if (ac<=1) exit(1); ! 27: exit(exp()?0:1); ! 28: } ! 29: ! 30: char *nxtarg(mt) { ! 31: ! 32: if (ap>=ac) { ! 33: if(mt) { ! 34: ap++; ! 35: return(0); ! 36: } ! 37: synbad("argument expected",""); ! 38: } ! 39: return(av[ap++]); ! 40: } ! 41: ! 42: exp() { ! 43: int p1; ! 44: ! 45: p1 = e1(); ! 46: if (EQ(nxtarg(1), "-o")) return(p1 | exp()); ! 47: ap--; ! 48: return(p1); ! 49: } ! 50: ! 51: e1() { ! 52: int p1; ! 53: ! 54: p1 = e2(); ! 55: if (EQ(nxtarg(1), "-a")) return (p1 & e1()); ! 56: ap--; ! 57: return(p1); ! 58: } ! 59: ! 60: e2() { ! 61: if (EQ(nxtarg(0), "!")) ! 62: return(!e3()); ! 63: ap--; ! 64: return(e3()); ! 65: } ! 66: ! 67: e3() { ! 68: int p1; ! 69: register char *a; ! 70: char *p2; ! 71: int int1, int2; ! 72: ! 73: a=nxtarg(0); ! 74: if(EQ(a, "(")) { ! 75: p1 = exp(); ! 76: if(!EQ(nxtarg(0), ")")) synbad(") expected",""); ! 77: return(p1); ! 78: } ! 79: ! 80: if(EQ(a, "-r")) ! 81: return(tio(nxtarg(0), 4)); ! 82: ! 83: if(EQ(a, "-w")) ! 84: return(tio(nxtarg(0), 2)); ! 85: ! 86: if(EQ(a, "-x")) ! 87: return(tio(nxtarg(0), 1)); ! 88: ! 89: if(EQ(a, "-d")) ! 90: return(ftype(nxtarg(0),S_IFDIR)); ! 91: ! 92: if(EQ(a, "-c")) ! 93: return(ftype(nxtarg(0),S_IFCHR)); ! 94: ! 95: if(EQ(a, "-b")) ! 96: return(ftype(nxtarg(0),S_IFBLK)); ! 97: ! 98: if(EQ(a, "-L")) ! 99: return(islink(nxtarg(0))); ! 100: ! 101: if(EQ(a, "-f")) ! 102: return(ftype(nxtarg(0),S_IFREG)); ! 103: ! 104: if(EQ(a, "-e")) ! 105: return(access(nxtarg(0),0) >= 0); ! 106: ! 107: if(EQ(a, "-u")) ! 108: return(ftype(nxtarg(0),S_ISUID)); ! 109: ! 110: if(EQ(a, "-g")) ! 111: return(ftype(nxtarg(0),S_ISGID)); ! 112: ! 113: if(EQ(a, "-s")) ! 114: return(fsizep(nxtarg(0))); ! 115: ! 116: if(EQ(a, "-t")) ! 117: if(ap>=ac) ! 118: return(isatty(1)); ! 119: else ! 120: return(isatty(atoi(nxtarg(0)))); ! 121: ! 122: if(EQ(a, "-n")) ! 123: return(!EQ(nxtarg(0), "")); ! 124: if(EQ(a, "-z")) ! 125: return(EQ(nxtarg(0), "")); ! 126: if(EQ(a, "-S")) ! 127: return(geteuid() == 0); ! 128: ! 129: p2 = nxtarg(1); ! 130: if (p2==0) ! 131: return(!EQ(a,"")); ! 132: if(EQ(p2, "=")) ! 133: return(EQ(nxtarg(0), a)); ! 134: ! 135: if(EQ(p2, "!=")) ! 136: return(!EQ(nxtarg(0), a)); ! 137: ! 138: if(EQ(a, "-l")) { ! 139: int1=length(p2); ! 140: p2=nxtarg(0); ! 141: } else{ int1=atoi(a); ! 142: } ! 143: int2 = atoi(nxtarg(0)); ! 144: if(EQ(p2, "-eq")) ! 145: return(int1==int2); ! 146: if(EQ(p2, "-ne")) ! 147: return(int1!=int2); ! 148: if(EQ(p2, "-gt")) ! 149: return(int1>int2); ! 150: if(EQ(p2, "-lt")) ! 151: return(int1<int2); ! 152: if(EQ(p2, "-ge")) ! 153: return(int1>=int2); ! 154: if(EQ(p2, "-le")) ! 155: return(int1<=int2); ! 156: ! 157: synbad("unknown operator ",p2); ! 158: } ! 159: ! 160: tio(a, f) ! 161: char *a; ! 162: int f; ! 163: { ! 164: ! 165: return access (a, f) >= 0; ! 166: } ! 167: ! 168: ftype(f, field) ! 169: char *f; ! 170: int field; ! 171: { ! 172: struct stat statb; ! 173: ! 174: if(stat(f,&statb)<0) ! 175: return(0); ! 176: if((statb.st_mode&S_IFMT)==field) ! 177: return(1); ! 178: return(0); ! 179: } ! 180: ! 181: islink(f) ! 182: char *f; ! 183: { ! 184: struct stat statb; ! 185: if(lstat(f,&statb)<0) ! 186: return 0; ! 187: return((statb.st_mode&S_IFMT)==S_IFLNK); ! 188: } ! 189: ! 190: fsizep(f) ! 191: char *f; ! 192: { ! 193: struct stat statb; ! 194: if(stat(f,&statb)<0) ! 195: return(0); ! 196: return(statb.st_size>0); ! 197: } ! 198: ! 199: synbad(s1,s2) ! 200: char *s1, *s2; ! 201: { ! 202: int len; ! 203: ! 204: write(2, "test: ", 6); ! 205: if ((len = strlen(s1)) != 0) ! 206: write(2, s1, len); ! 207: if ((len = strlen(s2)) != 0) ! 208: write(2, s2, len); ! 209: write(2, "\n", 1); ! 210: exit(255); ! 211: } ! 212: ! 213: length(s) ! 214: char *s; ! 215: { ! 216: char *es=s; ! 217: while(*es++); ! 218: return(es-s-1); ! 219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.