--- exec/main.c | 2 +- hurd/process.defs | 7 +++++++ init/Makefile | 2 +- init/init.c | 8 ++++++-- libdiskfs/boot-start.c | 2 +- libdiskfs/init-startup.c | 2 +- pfinet/main.c | 2 +- proc/main.c | 6 +++++- proc/mgt.c | 43 +++++++++++++++++++++++++++---------------- proc/msg.c | 17 +++++++++++++++++ proc/proc.h | 3 ++- 11 files changed, 69 insertions(+), 25 deletions(-)
diff --git a/exec/main.c b/exec/main.c index efad85a..043753c 100644 --- a/exec/main.c +++ b/exec/main.c @@ -246,7 +246,7 @@ S_exec_init (struct trivfs_protid *protid, proc_register_version (procserver, host_priv, "exec", "", HURD_VERSION); - err = proc_getmsgport (procserver, 1, &startup); + err = proc_getmsgport (procserver, 2, &startup); assert_perror (err); mach_port_deallocate (mach_task_self (), procserver); diff --git a/hurd/process.defs b/hurd/process.defs index 43cc9f2..3dc4d9a 100644 --- a/hurd/process.defs +++ b/hurd/process.defs @@ -370,3 +370,10 @@ routine proc_getnports ( process: process_t; which: pid_t; out nports: mach_msg_type_number_t); + +/* XXX */ + +/* XXX */ +routine proc_setinittask ( + process: process_t; + task: task_t); diff --git a/init/Makefile b/init/Makefile index ffb82ff..5ae3b50 100644 --- a/init/Makefile +++ b/init/Makefile @@ -21,7 +21,7 @@ makemode := server SRCS = init.c stubs.c OBJS = $(SRCS:.c=.o) \ startupServer.o notifyServer.o startup_replyUser.o msgServer.o \ - startup_notifyUser.o + startup_notifyUser.o processUser.o target = init HURDLIBS = shouldbeinlibc diff --git a/init/init.c b/init/init.c index 930408e..4de7b33 100644 --- a/init/init.c +++ b/init/init.c @@ -770,7 +770,7 @@ frob_kernel_process (void) task_t task; process_t proc, kbs; - err = proc_pid2task (procserver, 2, &task); + err = proc_pid2task (procserver, 3, &task); if (err) { error (0, err, "cannot get kernel task port"); @@ -1049,7 +1049,11 @@ start_child (const char *prog, char **progargs) NULL, 0, /* OSF Mach */ #endif 0, &child_task); - proc_child (procserver, child_task); + + err = proc_setinittask (procserver, child_task); + if (err) + error (0, err, "proc_setinittask"); + proc_task2pid (procserver, child_task, &child_pid); proc_task2proc (procserver, child_task, &default_ports[INIT_PORT_PROC]); diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c index b62d5f3..703cf0e 100644 --- a/libdiskfs/boot-start.c +++ b/libdiskfs/boot-start.c @@ -606,7 +606,7 @@ diskfs_S_fsys_init (mach_port_t port, proc_register_version (procserver, host, diskfs_server_name, "", diskfs_server_version); - err = proc_getmsgport (procserver, 1, &startup); + err = proc_getmsgport (procserver, 2, &startup); if (!err) { startup_essential_task (startup, mach_task_self (), MACH_PORT_NULL, diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c index 2c0814f..198cf0e 100644 --- a/libdiskfs/init-startup.c +++ b/libdiskfs/init-startup.c @@ -190,7 +190,7 @@ _diskfs_init_completed () if (err) goto errout; - err = proc_getmsgport (proc, 1, &init); + err = proc_getmsgport (proc, 2, &init); mach_port_deallocate (mach_task_self (), proc); if (err) goto errout; diff --git a/pfinet/main.c b/pfinet/main.c index 01b324d..35ea531 100644 --- a/pfinet/main.c +++ b/pfinet/main.c @@ -153,7 +153,7 @@ arrange_shutdown_notification () if (!procserver) return; - err = proc_getmsgport (procserver, 1, &initport); + err = proc_getmsgport (procserver, 2, &initport); mach_port_deallocate (mach_task_self (), procserver); if (err) return; diff --git a/proc/main.c b/proc/main.c index 494169e..1c603e8 100644 --- a/proc/main.c +++ b/proc/main.c @@ -81,7 +81,11 @@ main (int argc, char **argv, char **envp) generic_port = ports_get_right (genport); /* Create the initial proc object for init (PID 1). */ - startup_proc = create_startup_proc (); + init_proc = create_startup_proc (); + + startup_proc = allocate_proc (MACH_PORT_NULL); + startup_proc->p_deadmsg = 1; + complete_proc (startup_proc, 2); /* Create our own proc object (we are PID 0). */ self_proc = allocate_proc (mach_task_self ()); diff --git a/proc/mgt.c b/proc/mgt.c index 7af9c1a..8c171ab 100644 --- a/proc/mgt.c +++ b/proc/mgt.c @@ -183,7 +183,7 @@ S_proc_child (struct proc *parentp, /* Process hierarchy. Remove from our current location and place us under our new parent. Sanity check to make sure parent is currently init. */ - assert (childp->p_parent == startup_proc); + assert (childp->p_parent == init_proc); if (childp->p_sib) childp->p_sib->p_prevsib = childp->p_prevsib; *childp->p_prevsib = childp->p_sib; @@ -628,7 +628,7 @@ proc_death_notify (struct proc *p) } /* Complete a new process that has been allocated but not entirely initialized. - This gets called for every process except startup_proc (PID 1). */ + This gets called for every process except init_proc (PID 1). */ void complete_proc (struct proc *p, pid_t pid) { @@ -654,24 +654,35 @@ complete_proc (struct proc *p, pid_t pid) p->p_login->l_refcnt++; /* Our parent is init for now. */ - p->p_parent = startup_proc; + p->p_parent = init_proc; - p->p_sib = startup_proc->p_ochild; - p->p_prevsib = &startup_proc->p_ochild; + p->p_sib = init_proc->p_ochild; + p->p_prevsib = &init_proc->p_ochild; if (p->p_sib) p->p_sib->p_prevsib = &p->p_sib; - startup_proc->p_ochild = p; + init_proc->p_ochild = p; p->p_loginleader = 0; p->p_ochild = 0; p->p_parentset = 0; p->p_noowner = 1; - p->p_pgrp = startup_proc->p_pgrp; - - proc_death_notify (p); - add_proc_to_hash (p); + p->p_pgrp = init_proc->p_pgrp; join_pgrp (p); + + /* XXX */ + if (pid == 2) + { + ids_rele (&nullids); + static const uid_t zero; + p->p_id = make_ids (&zero, 1); + assert (p->p_id); + } + else + { + proc_death_notify (p); + add_proc_to_hash (p); + } } @@ -732,7 +743,7 @@ process_has_exited (struct proc *p) nowait_msg_proc_newids (tp->p_msgport, tp->p_task, 1, tp->p_pgrp->pg_pgid, !tp->p_pgrp->pg_orphcnt); - tp->p_parent = startup_proc; + tp->p_parent = init_proc; if (tp->p_dead) isdead = 1; } @@ -740,17 +751,17 @@ process_has_exited (struct proc *p) nowait_msg_proc_newids (tp->p_msgport, tp->p_task, 1, tp->p_pgrp->pg_pgid, !tp->p_pgrp->pg_orphcnt); - tp->p_parent = startup_proc; + tp->p_parent = init_proc; /* And now append the lists. */ - tp->p_sib = startup_proc->p_ochild; + tp->p_sib = init_proc->p_ochild; if (tp->p_sib) tp->p_sib->p_prevsib = &tp->p_sib; - startup_proc->p_ochild = p->p_ochild; - p->p_ochild->p_prevsib = &startup_proc->p_ochild; + init_proc->p_ochild = p->p_ochild; + p->p_ochild->p_prevsib = &init_proc->p_ochild; if (isdead) - alert_parent (startup_proc); + alert_parent (init_proc); } /* If an operation is in progress for this process, cause it diff --git a/proc/msg.c b/proc/msg.c index a6eca21..91faacd 100644 --- a/proc/msg.c +++ b/proc/msg.c @@ -161,3 +161,20 @@ restart: return 0; } + +error_t +S_proc_setinittask(struct proc *callerp, + task_t task) +{ + if (! callerp) + return EOPNOTSUPP; + + if (callerp != startup_proc) + return EPERM; + + init_proc->p_task = task; + proc_death_notify (init_proc); + add_proc_to_hash (init_proc); + + return 0; +} diff --git a/proc/proc.h b/proc/proc.h index 247795d..f14364e 100644 --- a/proc/proc.h +++ b/proc/proc.h @@ -133,7 +133,8 @@ struct zombie *zombie_list; mach_port_t authserver; struct proc *self_proc; /* process 0 (us) */ -struct proc *startup_proc; /* process 1 (init) */ +struct proc *init_proc; /* process 1 (sysvinit) */ +struct proc *startup_proc; /* process 2 (hurd/init) */ struct port_bucket *proc_bucket; struct port_class *proc_class; -- 1.7.10.4