net: rock: Use a helper for conversation filenames (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Dec 2017 18:28:03 +0000 (13:28 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 20 Dec 2017 18:37:08 +0000 (13:37 -0500)
This pops up a few times, and it is safer to use a common helper.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/accept4.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h

index 67a57de..7aa659f 100644 (file)
@@ -30,7 +30,6 @@ int __libc_accept4(int fd, __SOCKADDR_ARG addr, socklen_t *alen, int a4_flags)
        struct sockaddr_in *ip;
        char name[Ctlsize];
        char file[8 + Ctlsize + 1];
-       char *p;
        const char *net = 0;
        char listen[Ctlsize];
        int open_flags;
@@ -52,13 +51,8 @@ int __libc_accept4(int fd, __SOCKADDR_ARG addr, socklen_t *alen, int a4_flags)
                                        break;
                        }
                        /* at this point, our FD is for the data file.  we need to open the
-                        * listen file.  The line is stored in r->ctl (e.g.
-                        * /net/tcp/666/ctl) */
-                       strcpy(listen, r->ctl);
-                       p = strrchr(listen, '/');
-                       if (p == 0)
-                               return -1;
-                       strcpy(p + 1, "listen");
+                        * listen file. */
+                       _sock_get_conv_filename(r, "listen", listen);
                        open_flags = O_RDWR;
                        /* This is for the listen - maybe don't block on open */
                        open_flags |= (r->sopts & SOCK_NONBLOCK ? O_NONBLOCK : 0);
index a7303dd..ceb065a 100644 (file)
 
 #include <sys/plan9_helpers.h>
 
+/* Puts the path of the conversation file for 'name' for the Rock in retval,
+ * which must be a char [Ctlsize]. */
+void _sock_get_conv_filename(Rock *r, const char *name, char *retloc)
+{
+       char *p;
+
+       strlcpy(retloc, r->ctl, Ctlsize);
+       p = strrchr(retloc, '/');
+       assert(p);
+       p++;
+       *p = 0;
+       strlcat(retloc, name, Ctlsize);
+}
+
 void
 _sock_ingetaddr(Rock *r, struct sockaddr_in *ip, socklen_t *alen,
                 const char *a)
@@ -36,9 +50,7 @@ _sock_ingetaddr(Rock *r, struct sockaddr_in *ip, socklen_t *alen,
        int open_flags;
 
        /* get remote address */
-       strcpy(name, r->ctl);
-       p = strrchr(name, '/');
-       strcpy(p + 1, a);
+       _sock_get_conv_filename(r, a, name);
        open_flags = O_RDONLY;
        open_flags |= (r->sopts & SOCK_CLOEXEC ? O_CLOEXEC : 0);
        fd = open(name, open_flags);
@@ -317,28 +329,11 @@ int _sock_get_opts(int type)
  * success, -1 on error.  This is racy, like a lot of other Rock stuff. */
 static int _rock_open_listen_fd(Rock *r)
 {
-       char listen_file[Ctlsize + 3];
-       char *p;
+       char listen_file[Ctlsize];
        int ret;
        int open_flags;
 
-       if (r->ctl == NULL || r->ctl[0] != '/') {
-               fprintf(stderr, "r->ctl corrupt: '%s' (domain = %d)\n",
-                       (r->ctl == NULL ? "NULL" : r->ctl), r->domain);
-               assert(r->ctl != NULL && r->ctl[0] == '/');
-       }
-       strlcpy(listen_file, r->ctl, sizeof(listen_file));
-       /* We want the conversation directory. We look for '/ctl' at
-        * the end of the string. */
-       p = strrchr(listen_file, '/');
-       if (p == NULL)
-               p = listen_file;
-       ++p;
-       if (strcmp(p, "ctl") != 0) {
-               fprintf(stderr, "ctl file does not end in '/ctl': is '%s'\n", p);
-               assert(strcmp(p, "ctl") == 0);
-       }
-       strlcpy(p, "listen", sizeof(listen_file) - (p - listen_file));
+       _sock_get_conv_filename(r, "listen", listen_file);
        open_flags = O_PATH;
        open_flags |= (r->sopts & SOCK_CLOEXEC ? O_CLOEXEC : 0);
        ret = open(listen_file, open_flags);
index a67a8b8..2c922a6 100644 (file)
@@ -71,6 +71,7 @@ extern void _sock_srvname(char *, char *);
 extern int _sock_srv(char *, int);
 extern int _sock_data(int, const char *, int, int, int, Rock **);
 extern int _sock_ipattr(const char *);
+extern void _sock_get_conv_filename(Rock *r, const char *name, char *retloc);
 extern void _sock_ingetaddr(Rock *, struct sockaddr_in *, socklen_t *,
                                                        const char *);
 extern int _sock_strip_opts(int type);