Module Name:    src
Committed By:   pooka
Date:           Tue Feb 15 10:37:08 UTC 2011

Modified Files:
        src/lib/librumpclient: rumpclient.c
        src/lib/librumpuser: rumpuser_sp.c sp_common.c

Log Message:
support HANDSHAKE_EXEC


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/lib/librumpclient/rumpclient.c
cvs rdiff -u -r1.40 -r1.41 src/lib/librumpuser/rumpuser_sp.c
cvs rdiff -u -r1.27 -r1.28 src/lib/librumpuser/sp_common.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/librumpclient/rumpclient.c
diff -u src/lib/librumpclient/rumpclient.c:1.28 src/lib/librumpclient/rumpclient.c:1.29
--- src/lib/librumpclient/rumpclient.c:1.28	Mon Feb 14 14:56:23 2011
+++ src/lib/librumpclient/rumpclient.c	Tue Feb 15 10:37:07 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpclient.c,v 1.28 2011/02/14 14:56:23 pooka Exp $	*/
+/*      $NetBSD: rumpclient.c,v 1.29 2011/02/15 10:37:07 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -84,7 +84,7 @@
 static sigset_t fullset;
 
 static int doconnect(bool);
-static int handshake_req(struct spclient *, uint32_t *, int, bool);
+static int handshake_req(struct spclient *, int, void *, int, bool);
 
 time_t retrytimo = RUMPCLIENT_RETRYCONN_ONCE;
 
@@ -146,7 +146,8 @@
 
 			if ((rv = doconnect(false)) != 0)
 				continue;
-			if ((rv = handshake_req(&clispc, NULL, 0, true)) != 0)
+			if ((rv = handshake_req(&clispc, HANDSHAKE_GUEST,
+			    NULL, 0, true)) != 0)
 				continue;
 
 			/*
@@ -305,7 +306,8 @@
 }
 
 static int
-handshake_req(struct spclient *spc, uint32_t *auth, int cancel, bool haslock)
+handshake_req(struct spclient *spc, int type, void *data,
+	int cancel, bool haslock)
 {
 	struct handshake_fork rf;
 	struct rsp_hdr rhdr;
@@ -314,7 +316,7 @@
 	size_t bonus;
 	int rv;
 
-	if (auth) {
+	if (type == HANDSHAKE_FORK) {
 		bonus = sizeof(rf);
 	} else {
 		bonus = strlen(getprogname())+1;
@@ -324,10 +326,7 @@
 	rhdr.rsp_len = sizeof(rhdr) + bonus;
 	rhdr.rsp_class = RUMPSP_REQ;
 	rhdr.rsp_type = RUMPSP_HANDSHAKE;
-	if (auth)
-		rhdr.rsp_handshake = HANDSHAKE_FORK;
-	else
-		rhdr.rsp_handshake = HANDSHAKE_GUEST;
+	rhdr.rsp_handshake = type;
 
 	pthread_sigmask(SIG_SETMASK, &fullset, &omask);
 	if (haslock)
@@ -335,8 +334,8 @@
 	else
 		putwait(spc, &rw, &rhdr);
 	rv = dosend(spc, &rhdr, sizeof(rhdr));
-	if (auth) {
-		memcpy(rf.rf_auth, auth, AUTHLEN*sizeof(*auth));
+	if (type == HANDSHAKE_FORK) {
+		memcpy(rf.rf_auth, data, sizeof(rf.rf_auth)); /* uh, why? */
 		rf.rf_cancel = cancel;
 		rv = send_with_recon(spc, &rf, sizeof(rf));
 	} else {
@@ -710,12 +709,19 @@
 }
 
 void *(*rumpclient_dlsym)(void *, const char *);
+static int init_done = 0;
 
 int
 rumpclient_init()
 {
 	char *p;
 	int error;
+	int rv = -1;
+	int hstype;
+
+	if (init_done)
+		return 0;
+	init_done = 1;
 
 	sigfillset(&fullset);
 
@@ -753,38 +759,43 @@
 	if ((p = getenv("RUMP__PARSEDSERVER")) == NULL) {
 		if ((p = getenv("RUMP_SERVER")) == NULL) {
 			errno = ENOENT;
-			return -1;
+			goto out;
 		}
 	}
 
 	if ((error = parseurl(p, &serv_sa, &ptab_idx, 0)) != 0) {
 		errno = error;
-		return -1;
+		goto out;
 	}
 
 	if (doinit() == -1)
-		return -1;
+		goto out;
 
 	if ((p = getenv("RUMPCLIENT__EXECFD")) != NULL) {
 		sscanf(p, "%d,%d", &clispc.spc_fd, &kq);
 		unsetenv("RUMPCLIENT__EXECFD");
-		return 0;
+		hstype = HANDSHAKE_EXEC;
+	} else {
+		if (doconnect(true) == -1)
+			goto out;
+		hstype = HANDSHAKE_GUEST;
 	}
 
-	if (doconnect(true) == -1)
-		return -1;
-
-	error = handshake_req(&clispc, NULL, 0, false);
+	error = handshake_req(&clispc, hstype, NULL, 0, false);
 	if (error) {
 		pthread_mutex_destroy(&clispc.spc_mtx);
 		pthread_cond_destroy(&clispc.spc_cv);
 		if (clispc.spc_fd != -1)
 			host_close(clispc.spc_fd);
 		errno = error;
-		return -1;
+		goto out;
 	}
+	rv = 0;
 
-	return 0;
+ out:
+	if (rv == -1)
+		init_done = 0;
+	return rv;
 }
 
 struct rumpclient_fork {
@@ -836,7 +847,8 @@
 	if (doconnect(false) == -1)
 		return -1;
 
-	error = handshake_req(&clispc, rpf->fork_auth, 0, false);
+	error = handshake_req(&clispc, HANDSHAKE_FORK, rpf->fork_auth,
+	    0, false);
 	if (error) {
 		pthread_mutex_destroy(&clispc.spc_mtx);
 		pthread_cond_destroy(&clispc.spc_cv);

Index: src/lib/librumpuser/rumpuser_sp.c
diff -u src/lib/librumpuser/rumpuser_sp.c:1.40 src/lib/librumpuser/rumpuser_sp.c:1.41
--- src/lib/librumpuser/rumpuser_sp.c:1.40	Tue Feb  8 11:21:22 2011
+++ src/lib/librumpuser/rumpuser_sp.c	Tue Feb 15 10:37:07 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpuser_sp.c,v 1.40 2011/02/08 11:21:22 pooka Exp $	*/
+/*      $NetBSD: rumpuser_sp.c,v 1.41 2011/02/15 10:37:07 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: rumpuser_sp.c,v 1.40 2011/02/08 11:21:22 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.41 2011/02/15 10:37:07 pooka Exp $");
 
 #include <sys/types.h>
 #include <sys/atomic.h>
@@ -85,7 +85,7 @@
 static char banner[MAXBANNER];
 
 #define PROTOMAJOR 0
-#define PROTOMINOR 2
+#define PROTOMINOR 3
 
 struct prefork {
 	uint32_t pf_auth[AUTHLEN];
@@ -195,6 +195,14 @@
 
 	return p;
 }
+static void
+lwproc_execnotify(const char *comm)
+{
+
+	spops.spop_schedule();
+	spops.spop_execnotify(comm);
+	spops.spop_unschedule();
+}
 
 static void
 lwproc_procexit(void)
@@ -770,11 +778,13 @@
 {
 	struct sysbouncearg *sba;
 	pthread_t pt;
+	uint64_t reqno;
 	int retries, error, i;
 
+	reqno = spc->spc_hdr.rsp_reqno;
 	if (__predict_false(spc->spc_state == SPCSTATE_NEW)) {
 		if (spc->spc_hdr.rsp_type != RUMPSP_HANDSHAKE) {
-			send_error_resp(spc, spc->spc_hdr.rsp_reqno, EAUTH);
+			send_error_resp(spc, reqno, EAUTH);
 			shutdown(spc->spc_fd, SHUT_RDWR);
 			spcfreebuf(spc);
 			return;
@@ -799,15 +809,13 @@
 
 			spc->spc_mainlwp = lwproc_curlwp();
 
-			send_handshake_resp(spc, spc->spc_hdr.rsp_reqno, 0);
+			send_handshake_resp(spc, reqno, 0);
 		} else if (spc->spc_hdr.rsp_handshake == HANDSHAKE_FORK) {
 			struct lwp *tmpmain;
 			struct prefork *pf;
 			struct handshake_fork *rfp;
-			uint64_t reqno;
 			int cancel;
 
-			reqno = spc->spc_hdr.rsp_reqno;
 			if (spc->spc_off-HDRSZ != sizeof(*rfp)) {
 				send_error_resp(spc, reqno, EINVAL);
 				shutdown(spc->spc_fd, SHUT_RDWR);
@@ -880,11 +888,9 @@
 
 	if (__predict_false(spc->spc_hdr.rsp_type == RUMPSP_PREFORK)) {
 		struct prefork *pf;
-		uint64_t reqno;
 		uint32_t auth[AUTHLEN];
 
 		DPRINTF(("rump_sp: prefork handler executing for %p\n", spc));
-		reqno = spc->spc_hdr.rsp_reqno;
 		spcfreebuf(spc);
 
 		pf = malloc(sizeof(*pf));
@@ -925,8 +931,31 @@
 		return;
 	}
 
+	if (__predict_false(spc->spc_hdr.rsp_type == RUMPSP_HANDSHAKE)) {
+		char *comm = (char *)spc->spc_buf;
+		size_t commlen = spc->spc_hdr.rsp_len - HDRSZ;
+
+		if (spc->spc_hdr.rsp_handshake != HANDSHAKE_EXEC) {
+			send_error_resp(spc, reqno, EINVAL);
+			spcfreebuf(spc);
+			return;
+		}
+
+		/* ensure it's 0-terminated */
+		/* XXX make sure it contains sensible chars? */
+		comm[commlen] = '\0';
+
+		lwproc_switch(spc->spc_mainlwp);
+		lwproc_execnotify(comm);
+		lwproc_switch(NULL);
+
+		send_handshake_resp(spc, reqno, 0);
+		spcfreebuf(spc);
+		return;
+	}
+
 	if (__predict_false(spc->spc_hdr.rsp_type != RUMPSP_SYSCALL)) {
-		send_error_resp(spc, spc->spc_hdr.rsp_reqno, EINVAL);
+		send_error_resp(spc, reqno, EINVAL);
 		spcfreebuf(spc);
 		return;
 	}
@@ -934,7 +963,7 @@
 	retries = 0;
 	while ((sba = malloc(sizeof(*sba))) == NULL) {
 		if (nworker == 0 || retries > 10) {
-			send_error_resp(spc, spc->spc_hdr.rsp_reqno, EAGAIN);
+			send_error_resp(spc, reqno, EAGAIN);
 			spcfreebuf(spc);
 			return;
 		}

Index: src/lib/librumpuser/sp_common.c
diff -u src/lib/librumpuser/sp_common.c:1.27 src/lib/librumpuser/sp_common.c:1.28
--- src/lib/librumpuser/sp_common.c:1.27	Mon Feb 14 14:56:23 2011
+++ src/lib/librumpuser/sp_common.c	Tue Feb 15 10:37:07 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: sp_common.c,v 1.27 2011/02/14 14:56:23 pooka Exp $	*/
+/*      $NetBSD: sp_common.c,v 1.28 2011/02/15 10:37:07 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -91,7 +91,7 @@
 	RUMPSP_PREFORK,
 	RUMPSP_RAISE };
 
-enum { HANDSHAKE_GUEST, HANDSHAKE_AUTH, HANDSHAKE_FORK };
+enum { HANDSHAKE_GUEST, HANDSHAKE_AUTH, HANDSHAKE_FORK, HANDSHAKE_EXEC };
 
 #define AUTHLEN 4 /* 128bit fork auth */
 

Reply via email to