Implement pipes in userspace (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 11 Apr 2016 20:56:14 +0000 (16:56 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Apr 2016 14:29:13 +0000 (10:29 -0400)
With openat(), we don't need SYS_pipe.  Userspace can do this on their own.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/include/ros/bits/syscall.h
kern/src/ns/sysfile.c
kern/src/syscall.c
tests/cs.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/pipe2.c

index 3cfe24f..44855aa 100644 (file)
@@ -943,7 +943,6 @@ int sysfstatakaros(int fd, struct kstat *);
 char *sysfd2path(int fd);
 int sysfauth(int fd, char *aname);
 int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen);
-int syspipe(int fd[2]);
 int sysfwstat(int fd, uint8_t * buf, int n);
 long bindmount(struct chan *c, char *old, int flag, char *spec);
 int sysbind(char *new, char *old, int flags);
index 37180c2..1042913 100644 (file)
@@ -69,7 +69,7 @@
 #define SYS_getcwd                             117
 #define SYS_mkdir                              118
 #define SYS_rmdir                              119
-#define SYS_pipe                               120
+/* was SYS_pipe                                120 */
 
 #define SYS_wstat                              121
 #define SYS_fwstat                             122
index 1563006..1cd310c 100644 (file)
@@ -353,52 +353,6 @@ int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen)
        return m;
 }
 
-int syspipe(int fd[2])
-{
-       ERRSTACK(1);
-       struct dev *d;
-       struct chan *c[2];
-       static char *names[] = { "data", "data1" };
-
-       d = &devtab[devno("pipe", 0)];
-       c[0] = 0;
-       c[1] = 0;
-       fd[0] = -1;
-       fd[1] = -1;
-       if (waserror()) {
-               /* need to remove from the fd table and make sure the chan is closed
-                * exactly once.  if fd[i] >= 0, then the fd is valid (or it was!) and
-                * the fd table has the only ref (newfd() currently decrefs/consumes the
-                * reference).  cclose() doesn't care if you pass it 0 (like kfree()). */
-               if (fd[0] >= 0)
-                       close_fd(&current->open_files, fd[0]);
-               else
-                       cclose(c[0]);
-               if (fd[1] >= 0)
-                       close_fd(&current->open_files, fd[1]);
-               else
-                       cclose(c[1]);
-               poperror();
-               return -1;
-       }
-       c[0] = namec("#pipe", Atodir, 0, 0);
-       c[1] = cclone(c[0]);
-       if (walk(&c[0], &names[0], 1, FALSE, NULL) < 0)
-               error(EINVAL, ERROR_FIXME);
-       if (walk(&c[1], &names[1], 1, FALSE, NULL) < 0)
-               error(EINVAL, ERROR_FIXME);
-       c[0] = d->open(c[0], O_RDWR);
-       c[1] = d->open(c[1], O_RDWR);
-       fd[0] = newfd(c[0], 0);
-       if (fd[0] < 0)
-               error(-fd[0], ERROR_FIXME);
-       fd[1] = newfd(c[1], 0);
-       if (fd[1] < 0)
-               error(-fd[1], ERROR_FIXME);
-       poperror();
-       return 0;
-}
-
 int sysfwstat(int fd, uint8_t * buf, int n)
 {
        ERRSTACK(2);
index 211f821..23dd2cd 100644 (file)
@@ -2011,22 +2011,6 @@ intreg_t sys_rmdir(struct proc *p, const char *path, size_t path_l)
        return retval;
 }
 
-intreg_t sys_pipe(struct proc *p, int *u_pipefd, int flags)
-{
-       int pipefd[2] = {0};
-       int retval = syspipe(pipefd);
-
-       if (retval)
-               return -1;
-       if (memcpy_to_user_errno(p, u_pipefd, pipefd, sizeof(pipefd))) {
-               sysclose(pipefd[0]);
-               sysclose(pipefd[1]);
-               set_errno(EFAULT);
-               return -1;
-       }
-       return 0;
-}
-
 intreg_t sys_gettimeofday(struct proc *p, int *buf)
 {
        static spinlock_t gtod_lock = SPINLOCK_INITIALIZER;
@@ -2582,7 +2566,6 @@ const struct sys_table_entry syscall_table[] = {
        [SYS_getcwd] = {(syscall_t)sys_getcwd, "getcwd"},
        [SYS_mkdir] = {(syscall_t)sys_mkdir, "mkdir"},
        [SYS_rmdir] = {(syscall_t)sys_rmdir, "rmdir"},
-       [SYS_pipe] = {(syscall_t)sys_pipe, "pipe"},
        [SYS_gettimeofday] = {(syscall_t)sys_gettimeofday, "gettime"},
        [SYS_tcgetattr] = {(syscall_t)sys_tcgetattr, "tcgetattr"},
        [SYS_tcsetattr] = {(syscall_t)sys_tcsetattr, "tcsetattr"},
index e49e978..d0de3fc 100644 (file)
@@ -333,7 +333,7 @@ mountinit(char *service, char *mntpt)
        char buf[32];
        int ret;
 
-       ret = syscall(SYS_pipe, (unsigned long)p);
+       ret = pipe(p);
        if (ret < 0){
                error(1, 0, "pipe: %r");
                exit(1);
index 982cc63..26ebfe8 100644 (file)
@@ -1,37 +1,45 @@
-/* Copyright (C) 1991, 1995, 1996, 2002, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+/* Copyright (c) 2016 Google Inc.
+ * Barret Rhoden <brho@cs.berkeley.edu>
+ * See LICENSE for details.
+ *
+ * Pipes, now with openat! */
 
 #include <errno.h>
 #include <unistd.h>
 #include <stddef.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
-/* Create a one-way communication channel (__pipe).  If successful,
-   two file descriptors are stored in PIPEDES; bytes written on
-   PIPEDES[1] can be read from PIPEDES[0].  Apply FLAGS to the new
-   file descriptors.  Returns 0 if successful, -1 if not.  */
 int __pipe2(int pipedes[2], int flags)
 {
-       if (pipedes == NULL) {
-               __set_errno (EINVAL);
+       int dirfd, dfd, d1fd, old_errno;
+       char old_errstr[MAX_ERRSTR_LEN];
+
+       if (!pipedes) {
+               __set_errno(EFAULT);
                return -1;
        }
-
-       __set_errno (ENOSYS);
-       return ros_syscall(SYS_pipe, pipedes, flags, 0, 0, 0, 0);
+       dirfd = open("#pipe", O_PATH);
+       if (dirfd < 0)
+               return -1;
+       dfd = openat(dirfd, "data", O_RDWR | flags);
+       if (dfd < 0) {
+               save_err(&old_errno, old_errstr);
+               close(dirfd);
+               restore_err(&old_errno, old_errstr);
+               return -1;
+       }
+       d1fd = openat(dirfd, "data1", O_RDWR | flags);
+       if (d1fd < 0) {
+               save_err(&old_errno, old_errstr);
+               close(dfd);
+               close(dirfd);
+               restore_err(&old_errno, old_errstr);
+               return -1;
+       }
+       pipedes[0] = dfd;
+       pipedes[1] = d1fd;
+       return 0;
 }
-weak_alias (__pipe2, pipe2)
+weak_alias(__pipe2, pipe2)