aboutsummaryrefslogtreecommitdiff
path: root/proc/mgt.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-01-08 23:00:37 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-01-08 23:00:37 +0100
commit104f3121f8005b426d4df77b2420cfe5837033d1 (patch)
tree34bb93d3796e7c45dc1c67a5d40fb3bd1604ad9f /proc/mgt.c
parent9d3ba19ddc56ad929f673af23eb87ab07ae30631 (diff)
downloadhurd-104f3121f8005b426d4df77b2420cfe5837033d1.tar.gz
hurd-104f3121f8005b426d4df77b2420cfe5837033d1.tar.bz2
hurd-104f3121f8005b426d4df77b2420cfe5837033d1.zip
Implement /proc/<pid>/exe
by adding proc_set/get_exe to the proc server, making exec call proc_set_exe, and libps call proc_get_exe. procfs can then just retrieve the information to make the "exe" symlink. * hurd/process.defs (proc_set_exe, proc_get_exe): New RPCs. * hurd/process_request.defs: Likewise. * hurd/process_reply.defs: Add skips for proc_set_exe and proc_get_exe RPCs. * proc/proc.h (struct proc): Add `exe' field. * proc/info.c (S_proc_set_exe, S_proc_get_exe): New functions. * proc/mgt.c (process_has_exited): Free p->exe. (S_proc_child): Duplicate parent `exe' into child's `exe'. * exec/exec.c (do_exec): Call proc_set_exe when a filename is available. * libps/ps.h (struct proc_stat): Add `exe_vm_alloced', `exe', and `exe_len' field. (PSTAT_EXE): New macro. (PSTAT_USER_BASE): Change value to make room. (proc_stat_exe, proc_stat_exe_len): New macros. * libps/procstat.c (proc_stat_set_flags): Handle PSTAT_EXE case by calling proc_get_exe. * libps/spec.c (ps_get_exe): New function. (ps_exe_getter): New structure. (ps_fmt_spec): Add "Exe" specification. * procfs/process.c (process_file_symlink_make_node, process_file_gc_exe): New functions. (procfs_dir_entry): Add "exe" entry. * startup/startup.c (launch_core_servers): Set exe paths for startup, auth, proc, and fs servers. (frob_kernel_process): Set exe path for kernel task. (S_startup_essential_task): Set exe path for exec server.
Diffstat (limited to 'proc/mgt.c')
-rw-r--r--proc/mgt.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/proc/mgt.c b/proc/mgt.c
index 354f3784..d92bf528 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -223,6 +223,8 @@ S_proc_child (struct proc *parentp,
childp->start_code = parentp->start_code;
childp->end_code = parentp->end_code;
}
+ if (! childp->exe && parentp->exe)
+ childp->exe = strdup (parentp->exe);
if (MACH_PORT_VALID (parentp->p_task_namespace))
{
@@ -860,6 +862,8 @@ process_has_exited (struct proc *p)
if (!--p->p_login->l_refcnt)
free (p->p_login);
+ free (p->exe);
+ p->exe = NULL;
ids_rele (p->p_id);