Track program names better for ps
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Oct 2014 19:32:27 +0000 (12:32 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Oct 2014 19:32:27 +0000 (12:32 -0700)
Using the file's true name doesn't capture the use of symlinks, used
heavily by busybox.  Alternatively, we could save all the args.

kern/src/process.c
kern/src/syscall.c

index 31f1afe..f2da1c4 100644 (file)
@@ -433,7 +433,7 @@ struct proc *proc_create(struct file *prog, char **argv, char **envp)
        error_t r;
        if ((r = proc_alloc(&p, current, 0 /* flags */)) < 0)
                panic("proc_create: %e", r);    /* one of 3 quaint usages of %e */
-       proc_set_progname(p, file_name(prog));
+       proc_set_progname(p, argv[0]);
        procinfo_pack_args(p->procinfo, argv, envp);
        assert(load_elf(p, prog) == 0);
        __proc_ready(p);
index a5c5088..25f0a0d 100644 (file)
@@ -499,7 +499,6 @@ static int sys_proc_create(struct proc *p, char *path, size_t path_l,
                set_errstr("Failed to alloc new proc");
                goto mid_error;
        }
-       proc_set_progname(new_p, file_name(program));
        /* close the CLOEXEC ones, even though this isn't really an exec */
        close_9ns_files(new_p, TRUE);
        close_all_files(&new_p->open_files, TRUE);
@@ -518,6 +517,8 @@ static int sys_proc_create(struct proc *p, char *path, size_t path_l,
                set_errstr("Failed to load elf");
                goto late_error;
        }
+       /* progname is argv0, which accounts for symlinks */
+       proc_set_progname(p, p->procinfo->argbuf);
        kref_put(&program->f_kref);
        __proc_ready(new_p);
        pid = new_p->pid;
@@ -747,7 +748,8 @@ static int sys_exec(struct proc *p, char *path, size_t path_l,
                                   sizeof(pi->argbuf)))
                goto mid_error;
        /* This is the point of no return for the process. */
-       proc_set_progname(p, file_name(program));
+       /* progname is argv0, which accounts for symlinks */
+       proc_set_progname(p, p->procinfo->argbuf);
        #ifdef CONFIG_X86
        /* clear this, so the new program knows to get an LDT */
        p->procdata->ldt = 0;