summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile9
-rw-r--r--ping.c73
-rw-r--r--pong.c227
-rw-r--r--pong.defs12
4 files changed, 319 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 17578a1..be93aa3 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@
dir := reincarnation
makemode := servers
-SRCS = reincarnation.c persistent-hello.c lib.c stubs.c
+SRCS = reincarnation.c stubs.c lib.c persistent-hello.c pong.c ping.c
OBJS = $(SRCS:.c=.o) \
notifyServer.o \
reincarnationServer.o \
@@ -30,8 +30,10 @@ OBJS = $(SRCS:.c=.o) \
fsysServer.o \
fsys_proxy.o \
fsys_requestUser.o \
+ pongServer.o \
+ pongUser.o \
-targets = reincarnation persistent-hello
+targets = reincarnation persistent-hello pong ping
HURDLIBS = fshelp trivfs ihash shouldbeinlibc
include ../Makeconf
@@ -42,4 +44,7 @@ reincarnation: stubs.o notifyServer.o reincarnationServer.o \
../libfshelp/libfshelp.a
persistent-hello: reincarnationUser.o ../libtrivfs/libtrivfs.a ../libfshelp/libfshelp.a ../libports/libports.a ../libihash/libihash.a
+pong: reincarnationUser.o fsysServer.o pongServer.o
+ping: reincarnationUser.o pongUser.o
+
$(targets): %: %.o lib.o
diff --git a/ping.c b/ping.c
new file mode 100644
index 0000000..32a2fb8
--- /dev/null
+++ b/ping.c
@@ -0,0 +1,73 @@
+/* A pong client.
+
+ Copyright (C) 2013 Free Software Foundation, Inc.
+
+ Written by Justus Winter <4winter@informatik.uni-hamburg.de>
+
+ This file might one day be a part of the GNU Hurd.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <error.h>
+#include <hurd.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "reincarnation.h"
+
+#include "pong_U.h"
+#include "reincarnation_U.h"
+
+int
+main (int argc, char **argv)
+{
+ error_t err;
+
+ if (argc != 2)
+ error (1, 0, "Usage: %s PONG-SERVER", argv[0]);
+
+ /* Get reincarnation port. */
+ mach_port_t reincarnation;
+ err = reincarnation_get_port (mach_task_self (),
+ &reincarnation);
+ if (err)
+ error (1, err, "reincarnation_get_port");
+
+ if (reincarnation != MACH_PORT_NULL)
+ {
+ /* Get reincarnation image. */
+ char *image = NULL;
+ size_t image_len = 0;
+ err = reincarnation_reincarnate (reincarnation, &image, &image_len);
+ if (err)
+ error (1, err, "reincarnation_reincarnate");
+ }
+
+ mach_port_t pong = file_name_lookup (argv[1], 0, 0);
+ if (pong == MACH_PORT_NULL)
+ error (1, errno, "file_name_lookup");
+
+ while (1)
+ {
+ int local;
+ int global;
+ err = ping (pong, &local, &global);
+ if (err)
+ error (1, err, "ping");
+
+ printf ("local: % 4i\tglobal: % 4i\n", local, global);
+
+ sleep (1);
+ }
+}
diff --git a/pong.c b/pong.c
new file mode 100644
index 0000000..da9eb69
--- /dev/null
+++ b/pong.c
@@ -0,0 +1,227 @@
+/* A pong server.
+
+ Copyright (C) 2013 Free Software Foundation, Inc.
+
+ Written by Justus Winter <4winter@informatik.uni-hamburg.de>
+
+ This file might one day be a part of the GNU Hurd.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <argp.h>
+#include <error.h>
+#include <hurd.h>
+#include <hurd/fsys.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "reincarnation.h"
+#include "reincarnation_U.h"
+
+static mach_port_t reincarnation;
+static mach_port_t control;
+
+static int global_count;
+
+static int
+demuxer (mach_msg_header_t *inp,
+ mach_msg_header_t *outp)
+{
+ extern int pong_server (mach_msg_header_t *, mach_msg_header_t *);
+ extern int fsys_server (mach_msg_header_t *, mach_msg_header_t *);
+
+ return (pong_server (inp, outp) ||
+ fsys_server (inp, outp));
+}
+
+int
+main (int argc, char **argv)
+{
+ error_t err;
+
+ /* Get reincarnation port. */
+ err = reincarnation_get_port (mach_task_self (),
+ &reincarnation);
+ if (err)
+ error (2, err, "reincarnation_get_port");
+
+ if (reincarnation != MACH_PORT_NULL)
+ {
+ /* Get reincarnation image. */
+ char *image = NULL;
+ size_t image_len = 0;
+ err = reincarnation_reincarnate (reincarnation, &image, &image_len);
+ if (err)
+ error (2, err, "reincarnation_reincarnate");
+
+ if (image_len)
+ {
+ global_count = *(int *) image;
+ }
+ }
+
+ mach_port_t bootstrap;
+ task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ if (bootstrap == MACH_PORT_NULL)
+ error (1, 0, "Must be started as a translator");
+
+ /* Reply to our parent */
+ err = mach_port_allocate (mach_task_self (),
+ MACH_PORT_RIGHT_RECEIVE,
+ &control);
+ if (err)
+ error (1, err, "mach_port_allocate");
+
+ err = mach_port_insert_right (mach_task_self (),
+ control,
+ control,
+ MACH_MSG_TYPE_MAKE_SEND);
+ if (err)
+ error (1, err, "mach_port_insert_right");
+
+ mach_port_t realnode;
+ err =
+ fsys_startup (bootstrap, 0, control, MACH_MSG_TYPE_COPY_SEND, &realnode);
+ if (err)
+ error (1, err, "fsys_startup");
+
+ mach_port_deallocate (mach_task_self (), bootstrap);
+
+ /* Launch */
+ while (1)
+ {
+ err = mach_msg_server (demuxer, 0, control);
+ if (err)
+ error (2, err, "mach_msg_server");
+ }
+}
+
+error_t
+S_ping (mach_port_t server,
+ int *local,
+ int *global)
+{
+ global_count += 1;
+
+ if (reincarnation != MACH_PORT_NULL)
+ {
+ error_t err = reincarnation_checkpoint (reincarnation,
+ (data_t) &global_count,
+ sizeof global_count);
+ if (err)
+ error (0, err, "checkpoint");
+ }
+
+ *local = global_count; /* XXX */
+ *global = global_count;
+
+ return 0;
+}
+
+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)
+{
+ *do_retry = FS_RETRY_NORMAL;
+ *retry_name = '\0';
+ *ret = control;
+ *rettype = MACH_MSG_TYPE_COPY_SEND;
+ return 0;
+}
+
+error_t
+S_fsys_goaway (mach_port_t control, int flags)
+{
+ if (reincarnation != MACH_PORT_NULL)
+ reincarnation_goaway (reincarnation);
+
+ exit (0);
+}
+
+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;
+}
+
+
diff --git a/pong.defs b/pong.defs
new file mode 100644
index 0000000..e76ce76
--- /dev/null
+++ b/pong.defs
@@ -0,0 +1,12 @@
+subsystem pong 40000;
+
+#include <hurd/hurd_types.defs>
+
+#ifdef FILE_IMPORTS
+FILE_IMPORTS
+#endif
+
+routine ping (
+ server: mach_port_t;
+ out local: int;
+ out global: int);