#include "byte.h"
#include "buffer.h"
#include "strerr.h"
#include "env.h"
#include "open.h"
#include "rules.h"
#include "exit.h"

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;
    }
    ++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 *uid;
  char *gid;

  fnrules = argv[1];
  if (!fnrules)
    strerr_die1x(100,"ipcrulescheck: usage: ipcrulescheck rules.cdb");

  uid = env_get("IPCREMOTEEUID");
  gid = env_get("IPCREMOTEEGID");

  fd = open_read(fnrules);
  if ((fd == -1) || (rules(found,fd,uid,gid) == -1))
    strerr_die3sys(111,"ipcrulescheck: fatal: unable to read ",fnrules,": ");

  buffer_putsflush(buffer_1,"default:\nallow connection\n");
  _exit(0);
}


syntax highlighted by Code2HTML, v. 0.9.1