sys_proc_create() can dup FGRPs (XCC)
[akaros.git] / kern / src / process.c
index 8fc1c9e..f7c617d 100644 (file)
@@ -294,7 +294,7 @@ static void proc_init_procdata(struct proc *p)
  * Errors include:
  *  - ENOFREEPID if it can't get a PID
  *  - ENOMEM on memory exhaustion */
-error_t proc_alloc(struct proc **pp, struct proc *parent)
+error_t proc_alloc(struct proc **pp, struct proc *parent, int flags)
 {
        error_t r;
        struct proc *p;
@@ -376,13 +376,24 @@ error_t proc_alloc(struct proc **pp, struct proc *parent)
        p->open_files.max_fdset = NR_FILE_DESC_DEFAULT;
        p->open_files.fd = p->open_files.fd_array;
        p->open_files.open_fds = (struct fd_set*)&p->open_files.open_fds_init;
+       if (parent) {
+               if (flags & PROC_DUP_FGRP)
+                       clone_files(&parent->open_files, &p->open_files);
+       } else {
+               /* no parent, we're created from the kernel */
+               assert(insert_file(&p->open_files, dev_stdin,  0) == 0);
+               assert(insert_file(&p->open_files, dev_stdout, 0) == 1);
+               assert(insert_file(&p->open_files, dev_stderr, 0) == 2);
+       }
        /* Init the ucq hash lock */
        p->ucq_hashlock = (struct hashlock*)&p->ucq_hl_noref;
        hashlock_init_irqsave(p->ucq_hashlock, HASHLOCK_DEFAULT_SZ);
 
        atomic_inc(&num_envs);
        frontend_proc_init(p);
-       plan9setup(p, parent);
+       /* this does all the 9ns setup, much of which is done throughout this func
+        * for the VFS, including duping the fgrp */
+       plan9setup(p, parent, flags);
        devalarm_init(p);
        TAILQ_INIT(&p->abortable_sleepers);
        spinlock_init_irqsave(&p->abort_list_lock);
@@ -412,14 +423,10 @@ struct proc *proc_create(struct file *prog, char **argv, char **envp)
 {
        struct proc *p;
        error_t r;
-       if ((r = proc_alloc(&p, current)) < 0)
+       if ((r = proc_alloc(&p, current, 0 /* flags */)) < 0)
                panic("proc_create: %e", r);    /* one of 3 quaint usages of %e */
        procinfo_pack_args(p->procinfo, argv, envp);
        assert(load_elf(p, prog) == 0);
-       /* Connect to stdin, stdout, stderr */
-       assert(insert_file(&p->open_files, dev_stdin,  0) == 0);
-       assert(insert_file(&p->open_files, dev_stdout, 0) == 1);
-       assert(insert_file(&p->open_files, dev_stderr, 0) == 2);
        __proc_ready(p);
        return p;
 }