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 */