1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
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;
|