/* * Filter parsing module for the "Etherfind" program * * @(#)parse.c 1.1 94/10/31 * * Copyright (c) 1988 by Sun Microsystems, Inc. */ #include #include #include #include "etherfind.h" char **Argv; int Argc, Ai; struct anode *exp(), *e1(), *e2(), *e3(), *mk(); char *nxtarg(); extern char *index(); extern char *strcpy(); extern char *malloc(); extern char *sprintf(); struct colon *strtocolon(); struct addrpair *stringtoaddrpair(); int Randlast; struct anode Node[100]; int Nn; /* number of nodes */ /* * Return true if the given string matches, modulo an optional "-" */ EQ(x, y) char *x, *y; { if (*x == '-') x++; return(strcmp(x, y)==0); } /* * convert a:b to a struct colon */ struct colon * strtocolon(str) char *str; { char *p, *ntoi(); struct colon *colonp; colonp = (struct colon *)malloc(sizeof(colon)); p = ntoi(str, &colonp->byte); colonp->op = *p++; (void) ntoi(p, (int *)&colonp->value); return (colonp); } char * ntoi(cp, valp) char *cp; int *valp; { register val, base, c; val = 0; base = 10; if (*cp == '0') base = 8, cp++; if (*cp == 'x' || *cp == 'X') base = 16, cp++; while (c = *cp) { if (isdigit(c)) { val = (val * base) + (c - '0'); cp++; continue; } if (base == 16 && isxdigit(c)) { val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); cp++; continue; } break; } *valp = val; return (cp); } /* * convert two strings to an addrpair */ struct addrpair * stringtoaddrpair(str1, str2) char *str1, *str2; { struct addrpair *p; p = (struct addrpair *)malloc(sizeof(struct addrpair)); p->addr1 = stringtoaddr(str1); p->addr2 = stringtoaddr(str2); return (p); } parseargs(argc, argv) char *argv[]; { Argc = argc; Argv = argv; Ai = 1; if (!(exlist[0] = exp())) { /* parse and compile the arguments */ fprintf(stderr, "etherfind: parsing error\n"); exit(1); } } /* compile time functions: priority is exp()\n", a); usage(); exit(1); /*NOTREACHED*/ } struct anode * mk(f, l, r) int (*f)(); struct anode *l, *r; { Node[Nn].F = f; Node[Nn].L = l; Node[Nn].R = r; return(&(Node[Nn++])); } char * nxtarg() /* get next arg from command line */ { static strikes = 0; if (strikes==3) { fprintf(stderr, "etherfind: incomplete statement\n"); usage(); exit(1); } if (Ai>=Argc) { strikes++; Ai = Argc + 1; return(""); } return(Argv[Ai++]); } usage() { fprintf(stderr, "Usage: etherfind [-d] [-n] [-p] [-r] [-t] [-u] [-v] [-x]\n"); fprintf(stderr, " [-i interface] [-c cnt] [-l length] expression\n"); fprintf(stderr, "expressions are:\n"); fprintf(stderr, " broadcast arp rarp ip decnet apple\n"); fprintf(stderr, " dst src dstnet srcnet less greater proto srcport dstport byte\n"); fprintf(stderr, " between host and or not\n"); }