summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2013-09-19 09:15:02 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-11-21 05:49:03 +0100
commit5ee314b6c1ffd8b090ca6771f0896e080f7000ef (patch)
treef6d20c43e718f887060f9c2c4e6e78fffed26407
parentdcafd2d6cc7a98744b08875b35caf218a4a5c14a (diff)
startup: bind the startup server to /servers/startup
Previously, the Hurd (ab)used the fact that the startup server speaks all protocols on its message port. Any server that wished to register for shutdown notifications would use proc_getmsgport to get a port to the startup server. This hardcodes the PID of /hurd/startup, and does not allow one to point a server to ones own startup server (e.g. using remap). Bind the startup server to /servers/startup instead. Use this to contact the startup server. * exec/main.c (S_exec_init): Use /servers/startup. Fall back to the old method so that the system still boots when the node /servers/startup is missing. * hurd/paths.h (_SERVERS_STARTUP): New macro. * libdiskfs/boot-start.c (diskfs_S_fsys_init): Use /servers/startup. * libdiskfs/init-startup.c (_diskfs_init_completed): Likewise. * pfinet/main.c (arrange_shutdown_notification): Likewise. * startup/Makefile (OBJS): Add fsysServer.o. * startup/startup.c (demuxer): Handle the fsys protocol. (main): Bind to /servers/startup. (S_fsys_getroot): Implement fsys_getroot. Stub out the rest.
-rw-r--r--exec/main.c11
-rw-r--r--hurd/paths.h1
-rw-r--r--libdiskfs/boot-start.c9
-rw-r--r--libdiskfs/init-startup.c13
-rw-r--r--pfinet/main.c12
-rw-r--r--startup/Makefile2
-rw-r--r--startup/startup.c119
7 files changed, 146 insertions, 21 deletions
diff --git a/exec/main.c b/exec/main.c
index 784000b8..c86c000f 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -331,8 +331,15 @@ S_exec_init (struct trivfs_protid *protid,
proc_register_version (procserver, host_priv, "exec", "", HURD_VERSION);
- err = proc_getmsgport (procserver, HURD_PID_STARTUP, &startup);
- assert_perror (err);
+ startup = file_name_lookup (_SERVERS_STARTUP, 0, 0);
+ if (startup == MACH_PORT_NULL)
+ {
+ error (0, errno, "%s", _SERVERS_STARTUP);
+
+ /* Fall back to abusing the message port lookup. */
+ err = proc_getmsgport (procserver, HURD_PID_STARTUP, &startup);
+ assert_perror (err);
+ }
mach_port_deallocate (mach_task_self (), procserver);
/* Call startup_essential task last; init assumes we are ready to
diff --git a/hurd/paths.h b/hurd/paths.h
index 0042f767..a13ba9b7 100644
--- a/hurd/paths.h
+++ b/hurd/paths.h
@@ -26,6 +26,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define _SERVERS "/servers/"
#define _SERVERS_CRASH _SERVERS "crash"
#define _SERVERS_EXEC _SERVERS "exec"
+#define _SERVERS_STARTUP _SERVERS "startup"
#define _SERVERS_PROC _SERVERS "proc"
#define _SERVERS_PASSWORD _SERVERS "password"
#define _SERVERS_DEFPAGER _SERVERS "default-pager"
diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c
index 42e991e6..cfe23034 100644
--- a/libdiskfs/boot-start.c
+++ b/libdiskfs/boot-start.c
@@ -33,7 +33,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <string.h>
#include <argz.h>
#include <error.h>
-#include <pids.h>
#include "exec_S.h"
#include "exec_startup_S.h"
#include "fsys_S.h"
@@ -602,9 +601,12 @@ diskfs_S_fsys_init (struct diskfs_control *pt,
proc_register_version (procserver, host, diskfs_server_name, "",
diskfs_server_version);
+ mach_port_deallocate (mach_task_self (), procserver);
- err = proc_getmsgport (procserver, HURD_PID_STARTUP, &startup);
- if (!err)
+ startup = file_name_lookup (_SERVERS_STARTUP, 0, 0);
+ if (startup == MACH_PORT_NULL)
+ error (0, errno, "%s", _SERVERS_STARTUP);
+ else
{
startup_essential_task (startup, mach_task_self (), MACH_PORT_NULL,
diskfs_server_name, host);
@@ -612,7 +614,6 @@ diskfs_S_fsys_init (struct diskfs_control *pt,
}
mach_port_deallocate (mach_task_self (), host);
- mach_port_deallocate (mach_task_self (), procserver);
_diskfs_init_completed ();
diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c
index d10c9641..3a588e15 100644
--- a/libdiskfs/init-startup.c
+++ b/libdiskfs/init-startup.c
@@ -25,8 +25,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <fcntl.h>
#include <error.h>
#include <hurd/fsys.h>
+#include <hurd/paths.h>
#include <hurd/startup.h>
-#include <pids.h>
#include "startup_S.h"
@@ -195,15 +195,18 @@ _diskfs_init_completed ()
/* Mark us as important. */
err = proc_mark_important (proc);
+ mach_port_deallocate (mach_task_self (), proc);
/* This might fail due to permissions or because the old proc server
is still running, ignore any such errors. */
if (err && err != EPERM && err != EMIG_BAD_ID)
goto errout;
- err = proc_getmsgport (proc, HURD_PID_STARTUP, &init);
- mach_port_deallocate (mach_task_self (), proc);
- if (err)
- goto errout;
+ init = file_name_lookup (_SERVERS_STARTUP, 0, 0);
+ if (init == MACH_PORT_NULL)
+ {
+ err = errno;
+ goto errout;
+ }
notify = ports_get_send_right (pi);
ports_port_deref (pi);
diff --git a/pfinet/main.c b/pfinet/main.c
index d52d9a3a..0f1fbfc7 100644
--- a/pfinet/main.c
+++ b/pfinet/main.c
@@ -24,11 +24,11 @@
#include <arpa/inet.h>
#include <error.h>
#include <argp.h>
+#include <hurd/paths.h>
#include <hurd/startup.h>
#include <string.h>
#include <fcntl.h>
#include <version.h>
-#include <pids.h>
/* Include Hurd's errno.h file, but don't include glue-include/linux/errno.h,
since it #undef's the errno macro. */
@@ -154,7 +154,6 @@ arrange_shutdown_notification ()
{
error_t err;
mach_port_t initport, notify;
- process_t procserver;
struct port_info *pi;
shutdown_notify_class = ports_create_class (0, 0);
@@ -169,13 +168,8 @@ arrange_shutdown_notification ()
if (err)
return;
- procserver = getproc ();
- if (!procserver)
- return;
-
- err = proc_getmsgport (procserver, HURD_PID_STARTUP, &initport);
- mach_port_deallocate (mach_task_self (), procserver);
- if (err)
+ initport = file_name_lookup (_SERVERS_STARTUP, 0, 0);
+ if (initport == MACH_PORT_NULL)
return;
notify = ports_get_send_right (pi);
diff --git a/startup/Makefile b/startup/Makefile
index 277fee42..23d35cb5 100644
--- a/startup/Makefile
+++ b/startup/Makefile
@@ -21,7 +21,7 @@ makemode := server
SRCS = startup.c
OBJS = $(SRCS:.c=.o) \
startupServer.o notifyServer.o startup_replyUser.o msgServer.o \
- startup_notifyUser.o
+ startup_notifyUser.o fsysServer.o
target = startup
HURDLIBS = shouldbeinlibc
diff --git a/startup/startup.c b/startup/startup.c
index fe8471d9..ff58270a 100644
--- a/startup/startup.c
+++ b/startup/startup.c
@@ -504,9 +504,11 @@ demuxer (mach_msg_header_t *inp,
extern int notify_server (mach_msg_header_t *, mach_msg_header_t *);
extern int startup_server (mach_msg_header_t *, mach_msg_header_t *);
extern int msg_server (mach_msg_header_t *, mach_msg_header_t *);
+ extern int fsys_server (mach_msg_header_t *, mach_msg_header_t *);
return (notify_server (inp, outp) ||
msg_server (inp, outp) ||
+ fsys_server (inp, outp) ||
startup_server (inp, outp));
}
@@ -583,6 +585,18 @@ main (int argc, char **argv, char **envp)
/* Crash if the boot filesystem task dies. */
request_dead_name (fstask);
+ file_t node = file_name_lookup (_SERVERS_STARTUP, O_NOTRANS, 0);
+ if (node == MACH_PORT_NULL)
+ error (0, errno, "%s", _SERVERS_STARTUP);
+ else
+ {
+ file_set_translator (node,
+ 0, FS_TRANS_SET, 0,
+ NULL, 0,
+ startup, MACH_MSG_TYPE_COPY_SEND);
+ mach_port_deallocate (mach_task_self (), node);
+ }
+
/* Set up the set of ports we will pass to the programs we exec. */
for (i = 0; i < INIT_PORT_MAX; i++)
switch (i)
@@ -1544,3 +1558,108 @@ S_msg_report_wait (mach_port_t process, thread_t thread,
*rpc = 0;
return 0;
}
+
+/* fsys */
+error_t
+S_fsys_getroot (mach_port_t fsys_t,
+ mach_port_t dotdotnode,
+ uid_t *uids, size_t nuids,
+ uid_t *gids, size_t ngids,
+ int flags,
+ retry_type *do_retry,
+ char *retry_name,
+ mach_port_t *ret,
+ mach_msg_type_name_t *rettype)
+{
+ int is_root = 0;
+ size_t i;
+
+ for (i = 0; i < nuids; i++)
+ if (uids[i] == 0)
+ {
+ is_root = 1;
+ break;
+ }
+
+ if (! is_root)
+ return EPERM;
+
+ *do_retry = FS_RETRY_NORMAL;
+ *retry_name = '\0';
+ *ret = startup;
+ *rettype = MACH_MSG_TYPE_COPY_SEND;
+ return 0;
+}
+
+error_t
+S_fsys_goaway (mach_port_t control, int flags)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_startup (mach_port_t bootstrap, int flags, mach_port_t control,
+ mach_port_t *real, mach_msg_type_name_t *realtype)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_syncfs (mach_port_t control,
+ int wait,
+ int recurse)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_set_options (mach_port_t control,
+ char *data, mach_msg_type_number_t len,
+ int do_children)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_get_options (mach_port_t control,
+ char **data, mach_msg_type_number_t *len)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_getfile (mach_port_t control,
+ uid_t *uids, size_t nuids,
+ uid_t *gids, size_t ngids,
+ char *handle, size_t handllen,
+ mach_port_t *pt,
+ mach_msg_type_name_t *pttype)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_getpriv (mach_port_t control,
+ mach_port_t *host_priv, mach_msg_type_name_t *host_priv_type,
+ mach_port_t *dev_master, mach_msg_type_name_t *dev_master_type,
+ task_t *fs_task, mach_msg_type_name_t *fs_task_type)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_init (mach_port_t control,
+ mach_port_t reply,
+ mach_msg_type_name_t replytype,
+ mach_port_t proc,
+ auth_t auth)
+{
+ return EOPNOTSUPP;
+}
+
+error_t
+S_fsys_forward (mach_port_t server, mach_port_t requestor,
+ char *argz, size_t argz_len)
+{
+ return EOPNOTSUPP;
+}