Add helpers for common 9ns functions (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 12 Apr 2016 22:10:23 +0000 (18:10 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Apr 2016 14:29:13 +0000 (10:29 -0400)
Careful with get_sibling_fd(); don't call it on a cloned FD yet.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions
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 797f57e..28c657e 100644 (file)
@@ -56,6 +56,8 @@ libc {
     register_fork_cb;
 
     _sock_lookup_listen_fd;
+    get_sibling_fd;
+    write_hex_to_fd;
 
     eventfd;
     eventfd_read;
index 23f63b0..1ec6481 100644 (file)
@@ -339,3 +339,35 @@ int _sock_lookup_listen_fd(int sock_fd)
                return -1;
        return r->listen_fd;
 }
+
+/* Given an FD, opens the FD with the name 'sibling' in the same directory.
+ * e.g., you have a data, you open a ctl.  Don't use this with cloned FDs (i.e.
+ * open clone, get a ctl back) until we fix 9p and fd2path. */
+int get_sibling_fd(int fd, const char *sibling)
+{
+       char path[MAX_PATH_LEN];
+       char *graft;
+
+       if (syscall(SYS_fd2path, fd, path, sizeof(path)) < 0)
+               return -1;
+       graft = strrchr(path, '/');
+       if (!graft)
+               return -1;
+       graft++;
+       *graft = 0;
+       snprintf(graft, sizeof(path) - strlen(path), sibling);
+       return open(path, O_RDWR);
+}
+
+/* Writes num to FD in ASCII in hex format. */
+int write_hex_to_fd(int fd, uint64_t num)
+{
+       int ret;
+       char cmd[50];
+
+       ret = snprintf(cmd, sizeof(cmd), "%llx", num);
+       ret = write(fd, cmd, ret);
+       if (ret <= 0)
+               return -1;
+       return 0;
+}
index c9a322d..0155ab2 100644 (file)
@@ -77,6 +77,9 @@ extern int _sock_get_opts(int type);
 extern int _rock_open_listen_fd(Rock *r);
 extern int _sock_lookup_listen_fd(int sock_fd);
 
+int get_sibling_fd(int fd, const char *sibling);
+int write_hex_to_fd(int fd, uint64_t num);
+
 extern void _syserrno(void);
 
 /* The plan9 UDP header looks like: