iplib: Refactor announce9(), add clone9()
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 16 Dec 2016 16:05:23 +0000 (11:05 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Jan 2017 00:01:40 +0000 (19:01 -0500)
The guts of announce9() is basically just a clone, with writing 'announce'
at the end.

This extracts those guts into their own helper, and uses it for a clone9()
function.  This is just a convenient way to clone a conversation for a
given dialstring.  Note that clone does nothing with the port.  announce9()
and other functions can do something with that.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/iplib/announce.c
user/iplib/include/iplib/iplib.h

index 90c79a9..77596e6 100644 (file)
@@ -21,69 +21,91 @@ enum {
        Maxpath = 256,
 };
 
-/*
- *  announce a network service.
- */
-int announce9(char *addr, char *dir, int flags)
+/* Helper, given a net directory (translated from an addr/dialstring) by
+ * nettrans), clones a conversation, returns the ctl, and optionally fills in
+ * dir with the path of the directory (e.g. /net/tcp/1/).
+ *
+ * Returns the ctl FD, or -1 on error.  err_func is the function name to print
+ * for error output. */
+static int __clone9(char *netdir, char *dir, char *err_func, int flags)
 {
        int ctl, n, m;
        char buf[Maxpath];
-       char buf2[Maxpath];
-       char netdir[Maxpath];
-       char naddr[Maxpath];
        char *cp;
 
-       /*
-        *  translate the address
-        */
-       if (nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0)
-               return -1;
-
-       /*
-        * get a control channel
-        */
+       /* get a control channel */
        ctl = open(netdir, O_RDWR);
        if (ctl < 0) {
-               fprintf(stderr, "announce opening %s: %r\n", netdir);
+               fprintf(stderr, "%s opening %s: %r\n", err_func, netdir);
                return -1;
        }
        cp = strrchr(netdir, '/');
        if (cp == NULL) {
-               fprintf(stderr, "announce arg format %s\n", netdir);
+               fprintf(stderr, "%s arg format %s\n", err_func, netdir);
                close(ctl);
                return -1;
        }
        *cp = 0;
 
-       /*
-        *  find out which line we have
-        */
+       /* find out which line we have */
        n = snprintf(buf, sizeof(buf), "%s/", netdir);
        m = read(ctl, &buf[n], sizeof(buf) - n - 1);
        if (m <= 0) {
-               fprintf(stderr, "announce reading %s: %r\n", netdir);
+               fprintf(stderr, "%s reading %s: %r\n", err_func, netdir);
                close(ctl);
                return -1;
        }
        buf[n + m] = 0;
 
+       /* return directory etc. */
+       if (dir) {
+               strncpy(dir, buf, NETPATHLEN);
+               dir[NETPATHLEN - 1] = 0;
+       }
+       return ctl;
+}
+
+/* Clones a new network connection for a given dialstring (e.g. tcp!*!22). */
+int clone9(char *addr, char *dir, int flags)
+{
+       char netdir[Maxpath];
+       char naddr[Maxpath];
+
+       if (nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0)
+               return -1;
+       return __clone9(addr, dir, "clone", flags);
+}
+
+/*
+ *  announce a network service.
+ */
+int announce9(char *addr, char *dir, int flags)
+{
+       int ctl, n;
+       char buf[Maxpath];
+       char netdir[Maxpath];
+       char naddr[Maxpath];
+
+       /*
+        *  translate the address
+        */
+       if (nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0)
+               return -1;
+
+       ctl = __clone9(netdir, dir, "announce", flags);
+       if (ctl < 0)
+               return -1;
+
        /*
         *  make the call
         */
-       n = snprintf(buf2, sizeof(buf2), "announce %s", naddr);
-       if (write(ctl, buf2, n) != n) {
+       n = snprintf(buf, sizeof(buf), "announce %s", naddr);
+       if (write(ctl, buf, n) != n) {
                fprintf(stderr, "announce writing %s: %r\n", netdir);
                close(ctl);
                return -1;
        }
 
-       /*
-        *  return directory etc.
-        */
-       if (dir) {
-               strncpy(dir, buf, NETPATHLEN);
-               dir[NETPATHLEN - 1] = 0;
-       }
        return ctl;
 }
 
index e7ada85..c0fba21 100644 (file)
@@ -225,6 +225,7 @@ int tokenize(char *s, char **args, int maxargs);
 int getfields(char *str, char **args, int max, int mflag, char *unused_set);
 char *netmkaddr(char *linear, char *defnet, char *defsrv);
 int dial9(char *dest, char *local, char *dir, int *cfdp, int flags);
+int clone9(char *addr, char *dir, int flags);
 int announce9(char *addr, char *dir, int flags);
 int listen9(char *dir, char *newdir, int flags);
 int accept9(int ctl, char *dir);