chiark / gitweb /
Import release 0.08
[secnet.git] / util.c
diff --git a/util.c b/util.c
index 7e5a39a575e583344ef1b64338470b06b491b38b..053e81e4eac3112cfb6422f4e3fcf9597391bd16 100644 (file)
--- a/util.c
+++ b/util.c
@@ -8,17 +8,16 @@
  *
  */
 
-#include "config.h"
+#include "secnet.h"
 #include <stdio.h>
-#include <stdarg.h>
 #include <string.h>
 #include <errno.h>
-#include <syslog.h>
 #include <unistd.h>
-#include <values.h>
+#include <limits.h>
 #include <assert.h>
+#include <sys/wait.h>
 #include "util.h"
-#include "secnet.h"
+#include "unaligned.h"
 
 #define MIN_BUFFER_SIZE 64
 #define DEFAULT_BUFFER_SIZE 4096
@@ -283,6 +282,35 @@ string_t subnet_to_string(struct subnet *sn)
     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;
@@ -491,7 +519,7 @@ void buf_append_string(struct buffer_if *buf, string_t s)
     uint16_t len;
 
     len=strlen(s);
-    *(uint16_t *)buf_append(buf,2)=htons(len);
+    buf_append_uint16(buf,len);
     memcpy(buf_append(buf,len),s,len);
 }
 
@@ -515,19 +543,13 @@ static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context,
     item_t *item;
     dict_t *dict;
     bool_t lockdown=False;
+    uint32_t len=DEFAULT_BUFFER_SIZE;
     
     st=safe_malloc(sizeof(*st),"buffer_apply");
     st->cl.description="buffer";
     st->cl.type=CL_BUFFER;
     st->cl.apply=NULL;
     st->cl.interface=&st->ops;
-    st->ops.free=True;
-    st->ops.owner=NULL;
-    st->ops.flags=0;
-    st->ops.loc=loc;
-    st->ops.size=0;
-    st->ops.len=DEFAULT_BUFFER_SIZE;
-    st->ops.start=NULL;
 
     /* First argument, if present, is buffer length */
     item=list_elem(args,0);
@@ -536,11 +558,11 @@ static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context,
            cfgfatal(st->ops.loc,"buffer","first parameter must be a "
                     "number (buffer size)\n");
        }
-       st->ops.len=item->data.number;
-       if (st->ops.len<MIN_BUFFER_SIZE) {
+       len=item->data.number;
+       if (len<MIN_BUFFER_SIZE) {
            cfgfatal(st->ops.loc,"buffer","ludicrously small buffer size\n");
        }
-       if (st->ops.len>MAX_BUFFER_SIZE) {
+       if (len>MAX_BUFFER_SIZE) {
            cfgfatal(st->ops.loc,"buffer","ludicrously large buffer size\n");
        }
     }
@@ -556,7 +578,7 @@ static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context,
                                False);
     }
 
-    st->ops.base=safe_malloc(st->ops.len,"buffer");
+    buffer_new(&st->ops,len);
     if (lockdown) {
        Message(M_WARNING,"buffer: XXX lockdown\n");
     }