Allow a parent to set up a child's fd's via a new system call
[akaros.git] / kern / src / syscall.c
index 3d30132..6e4cddb 100644 (file)
@@ -1127,6 +1127,35 @@ static intreg_t sys_write(struct proc *p, int fd, const void *buf, int len)
        return ret;
 }
 
+static intreg_t sys_mapchildfds(struct proc *p, int pid, struct childfdmap *map, int nentries)
+{
+       ssize_t ret = 0;
+       int i;
+       // TODO: validate pointer, etc.
+       struct proc *child = pid2proc(pid);
+       if (! child)
+               return -ENOENT;
+
+       for (i = 0; i < nentries; i++) {
+               int slot;
+               struct file *file = get_file_from_fd(&p->open_files, map[i].parentfd);
+               printk("Try to map parent fd %d(%p) to %d\n", map[i].parentfd, file, map[i].childfd);
+               map[i].ok = -1;
+               if (! file) {
+                       printk("sys_mapchildfds: %d is wrong\n", map[i].parentfd);
+                       continue;
+               }
+               slot = insert_file(&child->open_files, file, map[i].childfd, 1);
+               printk("%s: slot is %d\n", __func__, slot);
+               if (slot == map[i].childfd) {
+                       map[i].ok = 0;
+                       ret++;
+               }
+               kref_put(&file->f_kref);
+       }
+       return ret;
+}
+
 /* Checks args/reads in the path, opens the file, and inserts it into the
  * process's open file list. */
 static intreg_t sys_open(struct proc *p, const char *path, size_t path_l,
@@ -1151,7 +1180,7 @@ static intreg_t sys_open(struct proc *p, const char *path, size_t path_l,
        file = do_file_open(t_path, oflag, mode);
        /* VFS */
        if (file) {
-               fd = insert_file(&p->open_files, file, 0);      /* stores the ref to file */
+               fd = insert_file(&p->open_files, file, 0, 0);   /* stores the ref to file */
                kref_put(&file->f_kref);        /* drop our ref */
                if (fd < 0)
                        warn("File insertion failed");
@@ -1319,7 +1348,7 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
 
        switch (cmd) {
                case (F_DUPFD):
-                       retval = insert_file(&p->open_files, file, arg);
+                       retval = insert_file(&p->open_files, file, arg, 0);
                        if (retval < 0) {
                                set_errno(-retval);
                                retval = -1;
@@ -2059,6 +2088,7 @@ const struct sys_table_entry syscall_table[] = {
        [SYS_wstat] ={(syscall_t)sys_wstat, "wstat"},
        [SYS_fwstat] ={(syscall_t)sys_fwstat, "fwstat"},
        [SYS_rename] ={(syscall_t)sys_rename, "rename"},
+       [65536] = {(syscall_t)sys_mapchildfds, "mapchildfds"},
 };
 const int max_syscall = sizeof(syscall_table)/sizeof(syscall_table[0]);
 /* Executes the given syscall.