diff options
-rw-r--r-- | exec/main.c | 11 | ||||
-rw-r--r-- | hurd/paths.h | 1 | ||||
-rw-r--r-- | libdiskfs/boot-start.c | 9 | ||||
-rw-r--r-- | libdiskfs/init-startup.c | 13 | ||||
-rw-r--r-- | pfinet/main.c | 12 | ||||
-rw-r--r-- | startup/Makefile | 2 | ||||
-rw-r--r-- | startup/startup.c | 119 |
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; +} |