chiark / gitweb /
Bugfixes - works now.
[userv-utils.git] / ipif / service.c
index 5ed6014893495b65ecae6459bcaf24e144d14e11..18322d4cc71c4c98218aa7b0e6516cdaf7be7afb 100644 (file)
@@ -15,7 +15,7 @@
  *      <peer-addr> is the address of the point-to-point peer.
  *  <prefix>/<mask>,<prefix>/<mask>,...
  *      List of additional routes to add for this interface.
- *      May be the empty argument.
+ *      May be the empty argument, or `-' if this is problematic.
  *
  * <config> is either
  *    <gid>,<prefix>/<len>[,<junk>]
@@ -202,13 +202,13 @@ static unsigned long eat_number(const char **argp, const char *what,
   char *ep;
   int endchar;
 
-  if (!*argp) { badusage("missing number %s\n",what); }
+  if (!*argp) { badusage("missing number %s",what); }
   rv= strtoul(*argp,&ep,0);
   if ((endchar= *ep)) {
-    if (!endchars) badusage("junk after number %s\n",what);
+    if (!endchars) badusage("junk after number %s",what);
     if (!strchr(endchars,endchar))
       badusage("invalid character or delimiter `%c' in or after number, %s:"
-              " expected %s (or none?)\n", endchar,what,endchars);
+              " expected %s (or none?)", endchar,what,endchars);
     *argp= ep+1;
   } else {
     *argp= 0;
@@ -259,7 +259,7 @@ static void eat_prefixmask(const char **argp, const char *what,
   len= eat_number(argp,whatbuf, 0,32, endchars,endchar_r);
 
   mask= (~0UL << (32-len));
-  if (prefix & ~mask) badusage("%s prefix %08lx not fully contained in mask %08lx\n",
+  if (prefix & ~mask) badusage("%s prefix %08lx not fully contained in mask %08lx",
                               what,prefix,mask);
   *prefix_r= prefix;
   if (mask_r) *mask_r= mask;
@@ -276,6 +276,7 @@ static void permit(unsigned long pprefix, unsigned long pmask) {
   int i, any;
   
   assert(!(pprefix & ~pmask));
+  any= 0;
 
   if (!proto) fputs("permits",stdout);
   if (addrnet_isin(localaddr,~0UL, pprefix,pmask)) {
@@ -431,29 +432,32 @@ static void parseargs(int argc, const char *const *argv) {
   addrnet_mustdiffer("local-addr",localaddr,~0UL, "peer-addr",peeraddr,~0UL);
   
   carg= *++argv;
-  for (nexroutes=0;
-       carg;
-       nexroutes++) {
-    if (nexroutes == MAXEXROUTES)
-      fatal("too many extra routes (only %d allowed)",MAXEXROUTES);
-    sprintf(erwhatbuf,"route#%d",nexroutes);
+  if (strcmp(carg,"-")) {
+    for (nexroutes=0;
+        carg && *carg;
+        nexroutes++) {
+      if (nexroutes == MAXEXROUTES)
+       fatal("too many extra routes (only %d allowed)",MAXEXROUTES);
+      sprintf(erwhatbuf,"route#%d",nexroutes);
     
-    eat_prefixmask(&carg,erwhatbuf, ",",0, &routeaddr,&routemask,0);
-    if (routemask == ~0UL) {
-      addrnet_mustdiffer(erwhatbuf,routeaddr,routemask, "local-addr",localaddr,~0UL);
-      addrnet_mustdiffer(erwhatbuf,routeaddr,routemask, "peer-addr",peeraddr,~0UL);
-    }
-    for (i=0; i<nexroutes; i++) {
-      sprintf(erwhatbuf2,"route#%d",i);
-      addrnet_mustdiffer(erwhatbuf,routeaddr,routemask,
-                        erwhatbuf2,exroutes[i].prefix,exroutes[i].mask);
+      eat_prefixmask(&carg,erwhatbuf, ",",0, &routeaddr,&routemask,0);
+      if (routemask == ~0UL) {
+       addrnet_mustdiffer(erwhatbuf,routeaddr,routemask, "local-addr",localaddr,~0UL);
+       addrnet_mustdiffer(erwhatbuf,routeaddr,routemask, "peer-addr",peeraddr,~0UL);
+      }
+      for (i=0; i<nexroutes; i++) {
+       sprintf(erwhatbuf2,"route#%d",i);
+       addrnet_mustdiffer(erwhatbuf,routeaddr,routemask,
+                          erwhatbuf2,exroutes[i].prefix,exroutes[i].mask);
+      }
+      exroutes[nexroutes].prefix= routeaddr;
+      exroutes[nexroutes].mask= routemask;
+      exroutes[nexroutes].allow= 0;
+      ip2txt(routeaddr,exroutes[nexroutes].prefixtxt);
+      ip2txt(routemask,exroutes[nexroutes].masktxt);
     }
-    exroutes[nexroutes].prefix= routeaddr;
-    exroutes[nexroutes].mask= routemask;
-    exroutes[nexroutes].allow= 0;
-    ip2txt(routeaddr,exroutes[nexroutes].prefixtxt);
-    ip2txt(routemask,exroutes[nexroutes].masktxt);
   }
+
   ip2txt(localaddr,localtxt);
   ip2txt(peeraddr,peertxt);
 }
@@ -676,7 +680,7 @@ static void startslattach(void) {
   }
   setsigmask(&fullset);
   l= strlen(ifnbuf);
-  if (l<0 || ifnbuf[l-1] != '\n') fatal("slattach gave strange output `%s'",ifnbuf);
+  if (l<=0 || ifnbuf[l-1] != '\n') fatal("slattach gave strange output `%s'",ifnbuf);
   ifnbuf[l-1]= 0;
   for (k=l; k>0 && ifnbuf[k-1]!=' '; k--);
   ifname= ifnbuf+k;