Have #ip protocol's bind()s throw errors
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 13 Feb 2016 17:21:16 +0000 (12:21 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 14 Feb 2016 14:03:21 +0000 (09:03 -0500)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ip.h
kern/src/net/devip.c
kern/src/net/ipifc.c

index 797bb1e..a9dac77 100644 (file)
@@ -291,7 +291,7 @@ struct Proto {
 
        void (*connect)(struct conv *, char **, int);
        void (*announce)(struct conv *, char **, int);
-       char *(*bind) (struct conv *, char **unused_char_pp_t, int);
+       void (*bind)(struct conv *, char **, int);
        int (*state) (struct conv *, char *unused_char_p_t, int);
        void (*create) (struct conv *);
        void (*close) (struct conv *);
@@ -390,7 +390,7 @@ struct Proto *Fsrcvpcol(struct Fs *, uint8_t unused_uint8_t);
 struct Proto *Fsrcvpcolx(struct Fs *, uint8_t unused_uint8_t);
 void Fsstdconnect(struct conv *, char **, int);
 void Fsstdannounce(struct conv *, char **, int);
-char *Fsstdbind(struct conv *, char **unused_char_pp_t, int);
+void Fsstdbind(struct conv *, char **, int);
 void Fsconvnonblock(struct conv *, bool);
 uint32_t scalednconv(void);
 
index 390da16..e68bc29 100644 (file)
@@ -1108,23 +1108,15 @@ static void announcectlmsg(struct Proto *x, struct conv *c, struct cmdbuf *cb)
 /*
  *  called by protocol bind routine to set addresses
  */
-char *Fsstdbind(struct conv *c, char *argv[], int argc)
+void Fsstdbind(struct conv *c, char *argv[], int argc)
 {
-       ERRSTACK(1);
-
        switch (argc) {
                default:
-                       return "bad args to bind";
+                       error(EINVAL, "bad args to bind");
                case 2:
-                       if (waserror()) {
-                               poperror();
-                               return current_errstr();
-                       }
                        setladdrport(c, argv[1], 0);
-                       poperror();
                        break;
        }
-       return 0;
 }
 
 void Fsconvnonblock(struct conv *cv, bool onoff)
@@ -1136,14 +1128,10 @@ void Fsconvnonblock(struct conv *cv, bool onoff)
 
 static void bindctlmsg(struct Proto *x, struct conv *c, struct cmdbuf *cb)
 {
-       char *p;
-
        if (x->bind == NULL)
-               p = Fsstdbind(c, cb->f, cb->nf);
+               Fsstdbind(c, cb->f, cb->nf);
        else
-               p = x->bind(c, cb->f, cb->nf);
-       if (p != NULL)
-               error(EFAIL, p);
+               x->bind(c, cb->f, cb->nf);
 }
 
 static void nonblockctlmsg(struct conv *c, struct cmdbuf *cb)
index df85c0c..eea8d2a 100644 (file)
@@ -132,26 +132,26 @@ struct medium *ipfindmedium(char *name)
  *  attach a device (or pkt driver) to the interface.
  *  called with c locked
  */
-static char *ipifcbind(struct conv *c, char **argv, int argc)
+static void ipifcbind(struct conv *c, char **argv, int argc)
 {
        ERRSTACK(1);
        struct Ipifc *ifc;
        struct medium *m;
 
        if (argc < 2)
-               return errno_to_string(EINVAL);
+               error(EINVAL, "Too few args (%d) to %s", argc, __func__);
 
        ifc = (struct Ipifc *)c->ptcl;
 
        /* bind the device to the interface */
        m = ipfindmedium(argv[1]);
        if (m == NULL)
-               return "unknown interface type";
+               error(EFAIL, "unknown interface type");
 
        wlock(&ifc->rwlock);
        if (ifc->m != NULL) {
                wunlock(&ifc->rwlock);
-               return "interface already bound";
+               error(EFAIL, "interfacr already bound");
        }
        if (waserror()) {
                wunlock(&ifc->rwlock);
@@ -193,8 +193,6 @@ static char *ipifcbind(struct conv *c, char **argv, int argc)
 
        wunlock(&ifc->rwlock);
        poperror();
-
-       return NULL;
 }
 
 /*