typedef struct Exec Exec; typedef struct Rule Rule; typedef struct Ruleset Ruleset; /* * Object */ enum { OArg, OAttr, OData, ODst, OPlumb, OSrc, OType, OWdir, }; /* * Verbs */ enum { VAdd, /* apply to OAttr only */ VClient, VDelete, /* apply to OAttr only */ VIs, VIsdir, VIsfile, VMatches, VSet, VStart, VTo, }; struct Rule { int obj; int verb; char *arg; /* unparsed string of all arguments */ char *qarg; /* quote-processed arg string */ Reprog *regex; }; struct Ruleset { int npat; int nact; Rule **pat; Rule **act; char *port; }; struct Exec { Plumbmsg *msg; char *match[10]; int p0; /* begin and end of match */ int p1; int clearclick; /* click was expanded; remove attribute */ int setdata; /* data should be set to $0 */ int holdforclient; /* exec'ing client; keep message until port is opened */ /* values of $variables */ char *file; char *dir; }; void parseerror(char*, ...); void error(char*, ...); void* emalloc(long); void* erealloc(void*, long); char* estrdup(char*); Ruleset** readrules(char*, int); void startfsys(void); Exec* matchruleset(Plumbmsg*, Ruleset*); void freeexec(Exec*); char* startup(Ruleset*, Exec*); char* printrules(void); void addport(char*); char* writerules(char*, int); char* expand(Exec*, char*, char**); void makeports(Ruleset*[]); void printinputstack(void); int popinput(void); Ruleset **rules; char *user; char *home; jmp_buf parsejmp; char *lasterror; char **ports; int nports;