Module Name:    src
Committed By:   pooka
Date:           Fri May 23 11:04:03 UTC 2014

Modified Files:
        src/lib/librumpuser: rumpuser_sp.c

Log Message:
Create remote clients with standard file descriptors open.  Fixes at
least editing a new file with ed in rumpremote (because ed calls
isatty(0) in case a file does not exist).


To generate a diff of this commit:
cvs rdiff -u -r1.63 -r1.64 src/lib/librumpuser/rumpuser_sp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumpuser/rumpuser_sp.c
diff -u src/lib/librumpuser/rumpuser_sp.c:1.63 src/lib/librumpuser/rumpuser_sp.c:1.64
--- src/lib/librumpuser/rumpuser_sp.c:1.63	Fri Feb 28 13:55:36 2014
+++ src/lib/librumpuser/rumpuser_sp.c	Fri May 23 11:04:03 2014
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpuser_sp.c,v 1.63 2014/02/28 13:55:36 pooka Exp $	*/
+/*      $NetBSD: rumpuser_sp.c,v 1.64 2014/05/23 11:04:03 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -37,7 +37,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_sp.c,v 1.63 2014/02/28 13:55:36 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.64 2014/05/23 11:04:03 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -957,6 +957,7 @@ schedulework(struct spclient *spc, enum 
 struct spservarg {
 	int sps_sock;
 	connecthook_fn sps_connhook;
+	struct lwp *sps_l;
 };
 
 static void
@@ -983,7 +984,7 @@ handlereq(struct spclient *spc)
 			comm[commlen] = '\0';
 
 			if ((error = lwproc_rfork(spc,
-			    RUMP_RFCFDG, comm)) != 0) {
+			    RUMP_RFFDG, comm)) != 0) {
 				shutdown(spc->spc_fd, SHUT_RDWR);
 			}
 
@@ -1193,6 +1194,8 @@ spserver(void *arg)
 	int rv;
 	unsigned int nfds, maxidx;
 
+	rump_pub_lwproc_switch(sarg->sps_l);
+
 	for (idx = 0; idx < MAXCLI; idx++) {
 		pfdlist[idx].fd = -1;
 		pfdlist[idx].events = POLLIN;
@@ -1317,6 +1320,7 @@ rumpuser_sp_init(const char *url,
 	pthread_t pt;
 	struct spservarg *sarg;
 	struct sockaddr *sap;
+	struct lwp *calllwp;
 	char *p;
 	unsigned idx = 0; /* XXXgcc */
 	int error, s;
@@ -1361,13 +1365,28 @@ rumpuser_sp_init(const char *url,
 		fprintf(stderr, "rump_sp: server bind failed\n");
 		goto out;
 	}
-
 	if (listen(s, MAXCLI) == -1) {
 		error = errno;
 		fprintf(stderr, "rump_sp: server listen failed\n");
 		goto out;
 	}
 
+	/*
+	 * Create a context that the client threads run off of.
+	 * We fork a dedicated context so as to ensure that all
+	 * client threads get the same set of fd's.  We fork off
+	 * of whatever context the caller is running in (most likely
+	 * an implicit thread, i.e. proc 1) and do not
+	 * close fd's.  The assumption is that people who
+	 * write servers (i.e. "kernels") know what they're doing.
+	 */
+	calllwp = rump_pub_lwproc_curlwp();
+	if ((error = rump_pub_lwproc_rfork(RUMP_RFFDG)) != 0) {
+		fprintf(stderr, "rump_sp: rfork failed");
+		goto out;
+	}
+	sarg->sps_l = rump_pub_lwproc_curlwp();
+	rump_pub_lwproc_switch(calllwp);
 	if ((error = pthread_create(&pt, NULL, spserver, sarg)) != 0) {
 		fprintf(stderr, "rump_sp: cannot create wrkr thread\n");
 		goto out;
@@ -1389,8 +1408,8 @@ rumpuser_sp_fini(void *arg)
 	}
 
 	/*
-	 * stuff response into the socket, since this process is just
-	 * about to exit
+	 * stuff response into the socket, since the rump kernel container
+	 * is just about to exit
 	 */
 	if (spc && spc->spc_syscallreq)
 		send_syscall_resp(spc, spc->spc_syscallreq, 0, retval);
@@ -1399,4 +1418,9 @@ rumpuser_sp_fini(void *arg)
 		shutdown(spclist[0].spc_fd, SHUT_RDWR);
 		spfini = 1;
 	}
+
+	/*
+	 * could release thread, but don't bother, since the container
+	 * will be stone dead in a moment.
+	 */
 }

Reply via email to