1 #include "byte.h"
2 #include "buffer.h"
3 #include "strerr.h"
4 #include "env.h"
5 #include "open.h"
6 #include "rules.h"
7 #include "exit.h"
8
found(char * data,unsigned int datalen)9 void found(char *data,unsigned int datalen)
10 {
11 unsigned int next0;
12
13 buffer_puts(buffer_1,"rule ");
14 buffer_put(buffer_1,rules_name.s,rules_name.len);
15 buffer_puts(buffer_1,":\n");
16 while ((next0 = byte_chr(data,datalen,0)) < datalen) {
17 switch(data[0]) {
18 case 'D':
19 buffer_puts(buffer_1,"deny connection\n");
20 buffer_flush(buffer_1);
21 _exit(0);
22 case '+':
23 buffer_puts(buffer_1,"set environment variable ");
24 buffer_puts(buffer_1,data + 1);
25 buffer_puts(buffer_1,"\n");
26 break;
27 }
28 ++next0;
29 data += next0; datalen -= next0;
30 }
31 buffer_puts(buffer_1,"allow connection\n");
32 buffer_flush(buffer_1);
33 _exit(0);
34 }
35
main(int argc,const char * const * argv)36 int main(int argc,const char * const *argv)
37 {
38 const char *fnrules;
39 int fd;
40 char *uid;
41 char *gid;
42
43 fnrules = argv[1];
44 if (!fnrules)
45 strerr_die1x(100,"ipcrulescheck: usage: ipcrulescheck rules.cdb");
46
47 uid = env_get("IPCREMOTEEUID");
48 gid = env_get("IPCREMOTEEGID");
49
50 fd = open_read(fnrules);
51 if ((fd == -1) || (rules(found,fd,uid,gid) == -1))
52 strerr_die3sys(111,"ipcrulescheck: fatal: unable to read ",fnrules,": ");
53
54 buffer_putsflush(buffer_1,"default:\nallow connection\n");
55 _exit(0);
56 }
57