-bool_t subnet_match(struct subnet *s, uint32_t address)
-{
- return (s->prefix==(address&s->mask));
-}
-
-bool_t subnet_matches_list(struct subnet_list *list, uint32_t address)
-{
- uint32_t i;
- for (i=0; i<list->entries; i++) {
- if (list->list[i].prefix == (address&list->list[i].mask)) return True;
- }
- return False;
-}
-
-bool_t subnets_intersect(struct subnet a, struct subnet b)
-{
- uint32_t mask=a.mask&b.mask;
- return ((a.prefix&mask)==(b.prefix&mask));
-}
-
-bool_t subnet_intersects_with_list(struct subnet a, struct subnet_list *b)
-{
- uint32_t i;
-
- for (i=0; i<b->entries; i++) {
- if (subnets_intersect(a,b->list[i])) return True;
- }
- return False;
-}
-
-bool_t subnet_lists_intersect(struct subnet_list *a, struct subnet_list *b)
-{
- uint32_t i;
- for (i=0; i<a->entries; i++) {
- if (subnet_intersects_with_list(a->list[i],b)) return True;
- }
- return False;
-}
-
-/* The string buffer must be at least 16 bytes long */
-string_t ipaddr_to_string(uint32_t addr)
-{
- uint8_t a,b,c,d;
- string_t s;
-
- s=safe_malloc(16,"ipaddr_to_string");
- a=addr>>24;
- b=addr>>16;
- c=addr>>8;
- d=addr;
- snprintf(s, 16, "%d.%d.%d.%d", a, b, c, d);
- return s;
-}
-
-string_t subnet_to_string(struct subnet *sn)
-{
- uint32_t mask=sn->mask, addr=sn->prefix;
- uint8_t a,b,c,d;
- string_t s;
- int i;
-
- s=safe_malloc(19,"subnet_to_string");
- a=addr>>24;
- b=addr>>16;
- c=addr>>8;
- d=addr;
- for (i=0; mask; i++) {
- mask=(mask<<1);
- }
- if (i!=sn->len) {
- fatal("subnet_to_string: invalid subnet structure!\n");
- }
- snprintf(s, 19, "%d.%d.%d.%d/%d", a, b, c, d, sn->len);
- return s;
-}
-
-int sys_cmd(const char *path, char *arg, ...)
-{
- va_list ap;
- int rv;
- pid_t c;
-
- va_start(ap,arg);
- c=fork();
- if (c) {
- /* Parent -> wait for child */
- waitpid(c,&rv,0);
- } else if (c==0) {
- char *args[100];
- int i;
- /* Child -> exec command */
- args[0]=arg;
- i=1;
- while ((args[i++]=va_arg(ap,char *)));
- execvp(path,args);
- exit(1);
- } else {
- /* Error */
- fatal_perror("sys_cmd(%s,%s,...)");
- }
-
- va_end(ap);
- return rv;
-}
-
-/* Take a list of log closures and merge them */
-struct loglist {
- struct log_if *l;
- struct loglist *next;
-};
-
-static void log_vmulti(void *state, int priority, char *message, va_list args)
-{
- struct loglist *st=state, *i;
-
- for (i=st; i; i=i->next) {
- i->l->vlog(i->l->st,priority,message,args);
- }
-}
-
-static void log_multi(void *st, int priority, char *message, ...)
-{
- va_list ap;
-
- va_start(ap,message);
-
- log_vmulti(st,priority,message,ap);
-
- va_end(ap);
-}
-
-struct log_if *init_log(list_t *ll)
-{
- int i=0;
- item_t *item;
- closure_t *cl;
- struct loglist *l=NULL, *n;
- struct log_if *r;
-
- while ((item=list_elem(ll,i++))) {
- if (item->type!=t_closure) {
- cfgfatal(item->loc,"init_log","item is not a closure");
- }
- cl=item->data.closure;
- if (cl->type!=CL_LOG) {
- cfgfatal(item->loc,"init_log","closure is not a logger");
- }
- n=safe_malloc(sizeof(*n),"init_log");
- n->l=cl->interface;
- n->next=l;
- l=n;
- }
- if (!l) {
- fatal("init_log: none of the items in the list are loggers");
- }
- r=safe_malloc(sizeof(*r), "init_log");
- r->st=l;
- r->log=log_multi;
- r->vlog=log_vmulti;
- return r;
-}
-
-struct logfile {
- closure_t cl;
- struct log_if ops;
- FILE *f;
-};
-
-static void logfile_vlog(void *state, int priority, char *message,
- va_list args)
-{
- struct logfile *st=state;
-
- vfprintf(st->f,message,args);
- fprintf(st->f,"\n");
-}
-
-static void logfile_log(void *state, int priority, char *message, ...)
-{
- va_list ap;
-
- va_start(ap,message);
- logfile_vlog(state,priority,message,ap);
- va_end(ap);
-}
-
-static list_t *logfile_apply(closure_t *self, struct cloc loc, dict_t *context,
- list_t *data)
-{
- struct logfile *st;
-
- st=safe_malloc(sizeof(*st),"logfile_apply");
- st->cl.description="logfile";
- st->cl.type=CL_LOG;
- st->cl.apply=NULL;
- st->cl.interface=&st->ops;
- st->ops.st=st;
- st->ops.log=logfile_log;
- st->ops.vlog=logfile_vlog;
- st->f=stderr; /* XXX ignore args */
-
- return new_closure(&st->cl);
-}
-