bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] prototype: runsystem as pid 1


From: Justus Winter
Subject: [PATCH] prototype: runsystem as pid 1
Date: Thu, 25 Jul 2013 22:41:09 +0200

---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]