#include "byte.h"
#include "buffer.h"
#include "strerr.h"
#include "env.h"
#include "rules.h"
#include "stralloc.h"
#include "open.h"
#include "exit.h"
stralloc prog = {0};
#define FATAL "ipcexecrulescheck: fatal: "
void nomem(void)
{
strerr_die2x(111,FATAL,"out of memory");
}
void found(char *data,unsigned int datalen)
{
unsigned int next0;
buffer_puts(buffer_1,"rule ");
buffer_put(buffer_1,rules_name.s,rules_name.len);
buffer_puts(buffer_1,":\n");
while ((next0 = byte_chr(data,datalen,0)) < datalen) {
switch(data[0]) {
case 'D':
buffer_puts(buffer_1,"deny connection\n");
buffer_flush(buffer_1);
_exit(0);
case '+':
buffer_puts(buffer_1,"set environment variable ");
buffer_puts(buffer_1,data + 1);
buffer_puts(buffer_1,"\n");
break;
case '=':
buffer_puts(buffer_1,"execute ");
buffer_puts(buffer_1,data + 1);
buffer_puts(buffer_1,"\n");
break;
}
++next0;
data += next0; datalen -= next0;
}
buffer_puts(buffer_1,"allow connection\n");
buffer_flush(buffer_1);
_exit(0);
}
int main(int argc,const char * const *argv)
{
const char *fnrules;
int fd;
char *ruid;
char *rgid;
char *uid;
char *command;
fnrules = argv[1];
if (!fnrules)
strerr_die1x(100,"ipcexecrulescheck: usage: ipcexecrulescheck rules.cdb");
ruid = env_get("IPCREMOTEEUID");
rgid = env_get("IPCREMOTEEGID");
uid = env_get("IPCUID");
command = env_get("IPCCOMMAND");
if (!command)
strerr_die2x(111,FATAL,"IPCCOMMAND not set");
if (!stralloc_copys(&prog,uid ? uid : "0")) nomem();
if (!stralloc_cats(&prog,".")) nomem();
if (!stralloc_cats(&prog,command)) nomem();
if (!stralloc_0(&prog)) nomem();
fd = open_read(fnrules);
if ((fd == -1) || (rules_exec(found,fd,ruid,rgid,prog.s) == -1))
strerr_die4sys(111,FATAL,"unable to read ",fnrules,": ");
buffer_putsflush(buffer_1,"default:\nallow connection\n");
_exit(0);
}
syntax highlighted by Code2HTML, v. 0.9.1