iplib: Add helpers for bypass
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 16 Dec 2016 17:11:25 +0000 (12:11 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Jan 2017 00:01:40 +0000 (19:01 -0500)
bypass9() is just like announce9(), but it says "bypass" instead of
"announce".  open_data_fd9() is just a helper for opening a data file in a
net directory.  I got tired of copy-and-pasting that code.

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

index 77596e6..78e846e 100644 (file)
@@ -109,6 +109,28 @@ int announce9(char *addr, char *dir, int flags)
        return ctl;
 }
 
+/* Gets a conversation and bypasses the protocol layer */
+int bypass9(char *addr, char *conv_dir, int flags)
+{
+       int ctl, n;
+       char buf[Maxpath];
+       char netdir[Maxpath];
+       char naddr[Maxpath];
+
+       if (nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0)
+               return -1;
+       ctl = __clone9(netdir, conv_dir, "bypass", flags);
+       if (ctl < 0)
+               return -1;
+       n = snprintf(buf, sizeof(buf), "bypass %s", naddr);
+       if (write(ctl, buf, n) != n) {
+               fprintf(stderr, "bypass writing %s: %r\n", netdir);
+               close(ctl);
+               return -1;
+       }
+       return ctl;
+}
+
 /*
  *  listen for an incoming call
  */
@@ -300,3 +322,37 @@ static int nettrans(char *addr, char *naddr, int na, char *file, int nf)
        snprintf(file, nf, "%s/%s", netdir, p);
        return 0;
 }
+
+int open_data_fd9(char *conv_dir, int flags)
+{
+       char path_buf[MAX_PATH_LEN];
+
+       snprintf(path_buf, sizeof(path_buf), "%s/data", conv_dir);
+       return open(path_buf, O_RDWR | flags);
+}
+
+/* Given a conversation directory, return the "remote" or "local" port, passed
+ * as the string which.  Returns the port via *port and TRUE on success. */
+bool get_port9(char *conv_dir, char *which, uint16_t *port)
+{
+       /* We don't have a MAX_DIALSTRING, but MAX_PATH_LEN should be enough. */
+       char buf[MAX_PATH_LEN];
+       int local_fd;
+       int ret;
+       char *p;
+
+       snprintf(buf, sizeof(buf), "%s/%s", conv_dir, which);
+       local_fd = open(buf, O_RDONLY);
+       if (local_fd < 0)
+               return FALSE;
+       ret = read(local_fd, buf, sizeof(buf));
+       close(local_fd);
+       if (ret <= 0)
+               return FALSE;
+       p = strrchr(buf, '!');
+       if (!p)
+               return FALSE;
+       p++;
+       *port = atoi(p);
+       return TRUE;
+}
index c0fba21..582fa2b 100644 (file)
@@ -227,8 +227,11 @@ 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 bypass9(char *addr, char *conv_dir, int flags);
 int listen9(char *dir, char *newdir, int flags);
 int accept9(int ctl, char *dir);
 int reject9(int ctl, char *dir, char *cause);
+int open_data_fd9(char *conv_dir, int flags);
+bool get_port9(char *conv_dir, char *which, uint16_t *port);
 
 __END_DECLS