summaryrefslogtreecommitdiff
path: root/startup
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2016-04-23 17:52:33 +0200
committerJustus Winter <justus@gnupg.org>2016-04-28 18:46:38 +0200
commit10218526abf4c7537642cf5c3d8955578d599402 (patch)
tree8a61f229c24a68c74a2a9ec81057a4759a85e3eb /startup
parentf250b6d8626c9d3ecf0d356dfd786a23ebbf6ca1 (diff)
startup: implement bits of the fs and io protocols
* startup/Makefile: Build fs and io server with default implementations. (mung_msg_S.h): Tune regexp only to match the include guard. * startup/startup.c (mig_reply_setup): New function. (demuxer): Add new protocols. Nicer implementation. (S_file_check_access): New function. (S_io_restrict_auth): Likewise.
Diffstat (limited to 'startup')
-rw-r--r--startup/Makefile6
-rw-r--r--startup/startup.c106
2 files changed, 101 insertions, 11 deletions
diff --git a/startup/Makefile b/startup/Makefile
index ee2ecdd5..db062ada 100644
--- a/startup/Makefile
+++ b/startup/Makefile
@@ -21,15 +21,17 @@ makemode := server
SRCS = startup.c
OBJS = $(SRCS:.c=.o) \
startupServer.o notifyServer.o startup_replyUser.o msgServer.o \
- startup_notifyUser.o fsysServer.o
+ startup_notifyUser.o fsysServer.o fsServer.o ioServer.o
target = startup
HURDLIBS = shouldbeinlibc
# startup does not use libports. Disable the default payload to port
# conversion.
MIGSFLAGS="-DHURD_DEFAULT_PAYLOAD_TO_PORT=1"
+fsServer-CFLAGS="-DMIG_EOPNOTSUPP=EOPNOTSUPP"
+ioServer-CFLAGS="-DMIG_EOPNOTSUPP=EOPNOTSUPP"
include ../Makeconf
mung_msg_S.h: msg_S.h
- sed 's/msg_server/mung_msg_server/' < $< > $@
+ sed 's/_msg_server/_mung_msg_server/' < $< > $@
diff --git a/startup/startup.c b/startup/startup.c
index 9c45f4bb..97a1bab3 100644
--- a/startup/startup.c
+++ b/startup/startup.c
@@ -51,12 +51,16 @@
#include <version.h>
#include <argp.h>
#include <pids.h>
+#include <idvec.h>
#include "startup_notify_U.h"
#include "startup_reply_U.h"
#include "startup_S.h"
#include "notify_S.h"
#include "mung_msg_S.h"
+#include "fsys_S.h"
+#include "fs_S.h"
+#include "io_S.h"
/* host_reboot flags for when we crash. */
static int crash_flags = RB_AUTOBOOT;
@@ -498,19 +502,57 @@ run_for_real (char *filename, char *args, int arglen, mach_port_t ctty,
/** Main program and setup **/
+/* XXX: The libc should provide this function. */
+static void
+mig_reply_setup (
+ const mach_msg_header_t *in,
+ mach_msg_header_t *out)
+{
+ static const mach_msg_type_t RetCodeType = {
+ /* msgt_name = */ MACH_MSG_TYPE_INTEGER_32,
+ /* msgt_size = */ 32,
+ /* msgt_number = */ 1,
+ /* msgt_inline = */ TRUE,
+ /* msgt_longform = */ FALSE,
+ /* msgt_deallocate = */ FALSE,
+ /* msgt_unused = */ 0
+ };
+
+#define InP (in)
+#define OutP ((mig_reply_header_t *) out)
+ OutP->Head.msgh_bits =
+ MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(InP->msgh_bits), 0);
+ OutP->Head.msgh_size = sizeof *OutP;
+ OutP->Head.msgh_remote_port = InP->msgh_remote_port;
+ OutP->Head.msgh_local_port = MACH_PORT_NULL;
+ OutP->Head.msgh_seqno = 0;
+ OutP->Head.msgh_id = InP->msgh_id + 100;
+ OutP->RetCodeType = RetCodeType;
+ OutP->RetCode = MIG_BAD_ID;
+#undef InP
+#undef OutP
+}
+
static int
demuxer (mach_msg_header_t *inp,
mach_msg_header_t *outp)
{
- 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));
+ mig_routine_t routine;
+
+ mig_reply_setup (inp, outp);
+
+ if ((routine = notify_server_routine (inp)) ||
+ (routine = msg_server_routine (inp)) ||
+ (routine = fsys_server_routine (inp)) ||
+ (routine = fs_server_routine (inp)) ||
+ (routine = io_server_routine (inp)) ||
+ (routine = startup_server_routine (inp)))
+ {
+ (*routine) (inp, outp);
+ return TRUE;
+ }
+ else
+ return FALSE;
}
error_t
@@ -1703,3 +1745,49 @@ S_fsys_forward (mach_port_t server, mach_port_t requestor,
{
return EOPNOTSUPP;
}
+
+error_t
+S_file_check_access (mach_port_t server,
+ int *allowed)
+{
+ if (server != startup)
+ return EOPNOTSUPP;
+ *allowed = 0;
+ return 0;
+}
+
+error_t
+S_io_stat (mach_port_t server,
+ struct stat *st)
+{
+ if (server != startup)
+ return EOPNOTSUPP;
+
+ memset (st, 0, sizeof *st);
+
+ st->st_fstype = FSTYPE_MISC;
+ st->st_fsid = getpid ();
+ st->st_mode = S_IFCHR | S_IROOT;
+
+ return 0;
+}
+
+error_t
+S_io_restrict_auth (mach_port_t server,
+ mach_port_t *newport,
+ mach_msg_type_name_t *newporttype,
+ uid_t *uids, size_t nuids,
+ uid_t *gids, size_t ngids)
+{
+ struct idvec user = { uids, (unsigned) nuids, (unsigned) nuids };
+
+ if (server != startup)
+ return EOPNOTSUPP;
+
+ if (! idvec_contains (&user, 0))
+ return EPERM;
+
+ *newport = server;
+ *newporttype = MACH_MSG_TYPE_COPY_SEND;
+ return 0;
+}