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