Module Name:    src
Committed By:   pooka
Date:           Fri Jul 27 09:09:05 UTC 2012

Modified Files:
        src/lib/librumpuser: rumpuser.c rumpuser_daemonize.c rumpuser_dl.c
            rumpuser_net.c rumpuser_pth.c rumpuser_sp.c sp_common.c
Added Files:
        src/lib/librumpuser: rumpuser_port.h

Log Message:
Once again, make the rump kernel hypercall layer work on Linux.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/lib/librumpuser/rumpuser.c
cvs rdiff -u -r1.2 -r1.3 src/lib/librumpuser/rumpuser_daemonize.c \
    src/lib/librumpuser/rumpuser_net.c
cvs rdiff -u -r1.7 -r1.8 src/lib/librumpuser/rumpuser_dl.c \
    src/lib/librumpuser/rumpuser_pth.c
cvs rdiff -u -r0 -r1.1 src/lib/librumpuser/rumpuser_port.h
cvs rdiff -u -r1.46 -r1.47 src/lib/librumpuser/rumpuser_sp.c
cvs rdiff -u -r1.31 -r1.32 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/librumpuser/rumpuser.c
diff -u src/lib/librumpuser/rumpuser.c:1.17 src/lib/librumpuser/rumpuser.c:1.18
--- src/lib/librumpuser/rumpuser.c:1.17	Mon Jun 25 22:32:47 2012
+++ src/lib/librumpuser/rumpuser.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.c,v 1.17 2012/06/25 22:32:47 abs Exp $	*/
+/*	$NetBSD: rumpuser.c,v 1.18 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -25,30 +25,24 @@
  * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
+#include "rumpuser_port.h"
+
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser.c,v 1.17 2012/06/25 22:32:47 abs Exp $");
+__RCSID("$NetBSD: rumpuser.c,v 1.18 2012/07/27 09:09:05 pooka Exp $");
 #endif /* !lint */
 
-/* thank the maker for this */
-#ifdef __linux__
-#define _XOPEN_SOURCE 500
-#define _BSD_SOURCE
-#define _FILE_OFFSET_BITS 64
-#include <features.h>
-#endif
-
-#include <sys/param.h>
-#include <sys/event.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/uio.h>
+#include <sys/stat.h>
+#include <sys/time.h>
 
 #ifdef __NetBSD__
 #include <sys/disk.h>
 #include <sys/disklabel.h>
 #include <sys/dkio.h>
 #include <sys/sysctl.h>
+#include <sys/event.h>
 #endif
 
 #include <assert.h>
@@ -256,10 +250,16 @@ rumpuser_anonmmap(void *prefaddr, size_t
 	void *rv;
 	int prot;
 
+#ifndef MAP_ALIGNED
+#define MAP_ALIGNED(a) 0
+	if (alignbit)
+		fprintf(stderr, "rumpuser_anonmmap: warning, requested "
+		    "alignment not supported by hypervisor\n");
+#endif
+
 	prot = PROT_READ|PROT_WRITE;
 	if (exec)
 		prot |= PROT_EXEC;
-	/* XXX: MAP_ALIGNED() is not portable */
 	rv = mmap(prefaddr, size, prot,
 	    MAP_ANON | MAP_ALIGNED(alignbit), -1, 0);
 	if (rv == MAP_FAILED) {
@@ -500,7 +500,24 @@ int
 rumpuser_getenv(const char *name, char *buf, size_t blen, int *error)
 {
 
+#ifdef __linux__
+	char *tmp;
+
+	*error = 0;
+	if ((tmp = getenv(name)) != NULL) {
+		if (strlen(tmp) >= blen) {
+			*error = ERANGE;
+			return -1;
+		}
+		strcpy(buf, tmp);
+		return 0;
+	} else {
+		*error = ENOENT;
+		return -1;
+	}
+#else
 	DOCALL(int, getenv_r(name, buf, blen));
+#endif
 }
 
 int
@@ -550,6 +567,7 @@ rumpuser_seterrno(int error)
 	errno = error;
 }
 
+#ifdef __NetBSD__
 int
 rumpuser_writewatchfile_setup(int kq, int fd, intptr_t opaque, int *error)
 {
@@ -592,6 +610,7 @@ rumpuser_writewatchfile_wait(int kq, int
 		*opaque = kev.udata;
 	return rv;
 }
+#endif
 
 /*
  * This is meant for safe debugging prints from the kernel.
@@ -629,20 +648,39 @@ rumpuser_kill(int64_t pid, int sig, int 
 int
 rumpuser_getnhostcpu(void)
 {
-	int ncpu;
-	size_t sz = sizeof(ncpu);
+	int ncpu = 1;
 
 #ifdef __NetBSD__
-	if (sysctlbyname("hw.ncpu", &ncpu, &sz, NULL, 0) == -1)
-		return 1;
-	return ncpu;
-#else
-	return 1;
+	size_t sz = sizeof(ncpu);
+
+	sysctlbyname("hw.ncpu", &ncpu, &sz, NULL, 0);
+#elif __linux__
+	FILE *fp;
+	char *line = NULL;
+	size_t n = 0;
+
+	/* If anyone knows a better way, I'm all ears */
+	if ((fp = fopen("/proc/cpuinfo", "r")) != NULL) {
+		ncpu = 0;
+		while (getline(&line, &n, fp) != -1) {
+			if (strncmp(line,
+			    "processor", sizeof("processor")-1) == 0)
+			    	ncpu++;
+		}
+		if (ncpu == 0)
+			ncpu = 1;
+		free(line);
+		fclose(fp);
+	}
 #endif
+	
+	return ncpu;
 }
 
+/* XXX: this hypercall needs a better name */
 uint32_t
 rumpuser_arc4random(void)
 {
+
 	return arc4random();
 }

Index: src/lib/librumpuser/rumpuser_daemonize.c
diff -u src/lib/librumpuser/rumpuser_daemonize.c:1.2 src/lib/librumpuser/rumpuser_daemonize.c:1.3
--- src/lib/librumpuser/rumpuser_daemonize.c:1.2	Sat Jan 22 14:18:55 2011
+++ src/lib/librumpuser/rumpuser_daemonize.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_daemonize.c,v 1.2 2011/01/22 14:18:55 pooka Exp $	*/
+/*	$NetBSD: rumpuser_daemonize.c,v 1.3 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -25,9 +25,10 @@
  * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
+#include "rumpuser_port.h"
+
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_daemonize.c,v 1.2 2011/01/22 14:18:55 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_daemonize.c,v 1.3 2012/07/27 09:09:05 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
Index: src/lib/librumpuser/rumpuser_net.c
diff -u src/lib/librumpuser/rumpuser_net.c:1.2 src/lib/librumpuser/rumpuser_net.c:1.3
--- src/lib/librumpuser/rumpuser_net.c:1.2	Mon Nov 15 15:23:32 2010
+++ src/lib/librumpuser/rumpuser_net.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_net.c,v 1.2 2010/11/15 15:23:32 pooka Exp $	*/
+/*	$NetBSD: rumpuser_net.c,v 1.3 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -25,9 +25,14 @@
  * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
+/*
+ * Purely to satisfy compilation.  This module is not expected to work on
+ * non-NetBSD due to type conflicts.
+ */
+#include "rumpuser_port.h"
+
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_net.c,v 1.2 2010/11/15 15:23:32 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_net.c,v 1.3 2012/07/27 09:09:05 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>

Index: src/lib/librumpuser/rumpuser_dl.c
diff -u src/lib/librumpuser/rumpuser_dl.c:1.7 src/lib/librumpuser/rumpuser_dl.c:1.8
--- src/lib/librumpuser/rumpuser_dl.c:1.7	Tue Mar 22 22:27:33 2011
+++ src/lib/librumpuser/rumpuser_dl.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpuser_dl.c,v 1.7 2011/03/22 22:27:33 pooka Exp $	*/
+/*      $NetBSD: rumpuser_dl.c,v 1.8 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -30,13 +30,16 @@
  * Called during rump bootstrap.
  */
 
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: rumpuser_dl.c,v 1.7 2011/03/22 22:27:33 pooka Exp $");
+#include "rumpuser_port.h"
+
+#if !defined(lint)
+__RCSID("$NetBSD: rumpuser_dl.c,v 1.8 2012/07/27 09:09:05 pooka Exp $");
+#endif /* !lint */
 
 #include <sys/types.h>
 #include <sys/time.h>
-
 #include <assert.h>
+
 #include <dlfcn.h>
 #include <elf.h>
 #include <errno.h>
@@ -50,7 +53,7 @@ __RCSID("$NetBSD: rumpuser_dl.c,v 1.7 20
 #include <rump/rumpuser.h>
 
 #if defined(__ELF__) && (defined(__NetBSD__) || defined(__FreeBSD__)	\
-    || (defined(__sun__) && defined(__svr4__)))
+    || (defined(__sun__) && defined(__svr4__))) || defined(__linux__)
 static size_t symtabsize = 0, strtabsize = 0;
 static size_t symtaboff = 0, strtaboff = 0;
 static uint8_t *symtab = NULL;
@@ -62,6 +65,12 @@ static unsigned char eident;
 #define Elf_Symindx uint32_t
 #endif
 
+/*
+ * Linux ld.so requires a valid handle for dlinfo(), so use the main
+ * handle.  We initialize this variable in rumpuser_dl_bootstrap()
+ */
+static void *mainhandle;
+
 static void *
 reservespace(void *store, size_t *storesize,
 	size_t storeoff, size_t required)
@@ -130,6 +139,18 @@ do {									\
 
 #define SYM_GETSIZE() ((eident==ELFCLASS32)?sizeof(Elf32_Sym):sizeof(Elf64_Sym))
 
+/*
+ * On NetBSD, the dynamic section pointer values seem to be relative to
+ * the address the dso is mapped at.  On Linux, they seem to contain
+ * the absolute address.  I couldn't find anything definite from a quick
+ * read of the standard and therefore I will not go and figure beyond ifdef.
+ */
+#ifdef __linux__
+#define adjptr(_map_, _ptr_) ((void *)(_ptr_))
+#else
+#define adjptr(_map_, _ptr_) ((void *)(_map_->l_addr + (_ptr_)))
+#endif
+
 static int
 getsymbols(struct link_map *map)
 {
@@ -142,7 +163,7 @@ getsymbols(struct link_map *map)
 	unsigned i;
 
 	if (map->l_addr) {
-		if (memcmp(map->l_addr, ELFMAG, SELFMAG) != 0)
+		if (memcmp((void *)map->l_addr, ELFMAG, SELFMAG) != 0)
 			return ENOEXEC;
 		eident = *(unsigned char *)(map->l_addr + EI_CLASS);
 		if (eident != ELFCLASS32 && eident != ELFCLASS64)
@@ -176,11 +197,11 @@ getsymbols(struct link_map *map)
 		switch (ed_tag) {
 		case DT_SYMTAB:
 			DYNn_GETMEMBER(ed_base, i, d_un.d_ptr, edptr);
-			syms_base = map->l_addr + edptr;
+			syms_base = adjptr(map, edptr);
 			break;
 		case DT_STRTAB:
 			DYNn_GETMEMBER(ed_base, i, d_un.d_ptr, edptr);
-			str_base = map->l_addr + edptr;
+			str_base = adjptr(map, edptr);
 			break;
 		case DT_STRSZ:
 			DYNn_GETMEMBER(ed_base, i, d_un.d_val, edval);
@@ -188,7 +209,7 @@ getsymbols(struct link_map *map)
 			break;
 		case DT_HASH:
 			DYNn_GETMEMBER(ed_base, i, d_un.d_ptr, edptr);
-			hashtab = (Elf_Symindx *)(map->l_addr + edptr);
+			hashtab = (Elf_Symindx *)adjptr(map, edptr);
 			cursymcount = hashtab[1];
 			break;
 		case DT_SYMENT:
@@ -307,7 +328,8 @@ rumpuser_dl_bootstrap(rump_modinit_fn do
 	struct link_map *map, *origmap;
 	int error;
 
-	if (dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &origmap) == -1) {
+	mainhandle = dlopen(NULL, RTLD_NOW);
+	if (dlinfo(mainhandle, RTLD_DI_LINKMAP, &origmap) == -1) {
 		fprintf(stderr, "warning: rumpuser module bootstrap "
 		    "failed: %s\n", dlerror());
 		return;
@@ -329,7 +351,7 @@ rumpuser_dl_bootstrap(rump_modinit_fn do
 		if (strstr(map->l_name, "librump") != NULL)
 			error = getsymbols(map);
 		/* this should be the main object */
-		else if (map->l_addr == NULL && map->l_prev == NULL)
+		else if (!map->l_addr && map->l_prev == NULL)
 			error = getsymbols(map);
 	}
 
@@ -372,7 +394,7 @@ rumpuser_dl_component_init(int type, rum
 {
 	struct link_map *map;
 
-	if (dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map) == -1) {
+	if (dlinfo(mainhandle, RTLD_DI_LINKMAP, &map) == -1) {
 		fprintf(stderr, "warning: rumpuser module bootstrap "
 		    "failed: %s\n", dlerror());
 		return;
Index: src/lib/librumpuser/rumpuser_pth.c
diff -u src/lib/librumpuser/rumpuser_pth.c:1.7 src/lib/librumpuser/rumpuser_pth.c:1.8
--- src/lib/librumpuser/rumpuser_pth.c:1.7	Sat Feb  5 13:51:56 2011
+++ src/lib/librumpuser/rumpuser_pth.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_pth.c,v 1.7 2011/02/05 13:51:56 yamt Exp $	*/
+/*	$NetBSD: rumpuser_pth.c,v 1.8 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -25,19 +25,15 @@
  * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
+#include "rumpuser_port.h"
+
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth.c,v 1.7 2011/02/05 13:51:56 yamt Exp $");
+__RCSID("$NetBSD: rumpuser_pth.c,v 1.8 2012/07/27 09:09:05 pooka Exp $");
 #endif /* !lint */
 
-#ifdef __linux__
-#define _XOPEN_SOURCE 500
-#define _BSD_SOURCE
-#define _FILE_OFFSET_BITS 64
-#endif
-
 #include <assert.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <pthread.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -186,6 +182,21 @@ rumpuser_biothread(void *arg)
 void
 rumpuser_thrinit(kernel_lockfn lockfn, kernel_unlockfn unlockfn, int threads)
 {
+#ifdef __linux__
+	/* XXX: there's no rumpuser_bootstrap, so do this here */
+	uint32_t rv;
+	int fd;
+
+	if ((fd = open("/dev/urandom", O_RDONLY)) == -1) {
+		srandom(time(NULL));
+	} else {
+		if (read(fd, &rv, sizeof(rv)) != sizeof(rv))
+			srandom(time(NULL));
+		else
+			srandom(rv);
+		close(fd);
+	}
+#endif
 
 	pthread_mutex_init(&rumpuser_aio_mtx.pthmtx, NULL);
 	pthread_cond_init(&rumpuser_aio_cv.pthcv, NULL);

Index: src/lib/librumpuser/rumpuser_sp.c
diff -u src/lib/librumpuser/rumpuser_sp.c:1.46 src/lib/librumpuser/rumpuser_sp.c:1.47
--- src/lib/librumpuser/rumpuser_sp.c:1.46	Fri Mar  9 21:03:09 2012
+++ src/lib/librumpuser/rumpuser_sp.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: rumpuser_sp.c,v 1.46 2012/03/09 21:03:09 joerg Exp $	*/
+/*      $NetBSD: rumpuser_sp.c,v 1.47 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -34,11 +34,13 @@
  * work correctly from one hardware architecture to another.
  */
 
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: rumpuser_sp.c,v 1.46 2012/03/09 21:03:09 joerg Exp $");
+#include "rumpuser_port.h"
+
+#if !defined(lint)
+__RCSID("$NetBSD: rumpuser_sp.c,v 1.47 2012/07/27 09:09:05 pooka Exp $");
+#endif /* !lint */
 
 #include <sys/types.h>
-#include <sys/atomic.h>
 #include <sys/mman.h>
 #include <sys/socket.h>
 
@@ -59,6 +61,7 @@ __RCSID("$NetBSD: rumpuser_sp.c,v 1.46 2
 
 #include <rump/rump.h> /* XXX: for rfork flags */
 #include <rump/rumpuser.h>
+
 #include "rumpuser_int.h"
 
 #include "sp_common.c"
@@ -87,6 +90,42 @@ static char banner[MAXBANNER];
 #define PROTOMAJOR 0
 #define PROTOMINOR 3
 
+
+/* how to use atomic ops on Linux? */
+#ifdef __linux__
+static pthread_mutex_t discomtx = PTHREAD_MUTEX_INITIALIZER;
+
+static void
+signaldisco(void)
+{
+
+	pthread_mutex_lock(&discomtx);
+	disco++;
+	pthread_mutex_unlock(&discomtx);
+}
+
+static unsigned int
+getdisco(void)
+{
+	unsigned int discocnt;
+
+	pthread_mutex_lock(&discomtx);
+	discocnt = disco;
+	disco = 0;
+	pthread_mutex_unlock(&discomtx);
+
+	return discocnt;
+}
+
+#else /* NetBSD */
+
+#include <sys/atomic.h>
+#define signaldisco() atomic_inc_uint(&disco)
+#define getdisco() atomic_swap_uint(&disco, 0)
+
+#endif
+
+
 struct prefork {
 	uint32_t pf_auth[AUTHLEN];
 	struct lwp *pf_lwp;
@@ -505,7 +544,7 @@ spcrelease(struct spclient *spc)
 	spc->spc_fd = -1;
 	spc->spc_state = SPCSTATE_NEW;
 
-	atomic_inc_uint(&disco);
+	signaldisco();
 }
 
 static void
@@ -908,7 +947,7 @@ handlereq(struct spclient *spc)
 	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, reqno, EAUTH);
+			send_error_resp(spc, reqno, EACCES);
 			shutdown(spc->spc_fd, SHUT_RDWR);
 			spcfreebuf(spc);
 			return;
@@ -999,7 +1038,7 @@ handlereq(struct spclient *spc)
 
 			send_handshake_resp(spc, reqno, 0);
 		} else {
-			send_error_resp(spc, reqno, EAUTH);
+			send_error_resp(spc, reqno, EACCES);
 			shutdown(spc->spc_fd, SHUT_RDWR);
 			spcfreebuf(spc);
 			return;
@@ -1158,7 +1197,7 @@ spserver(void *arg)
 		int discoed;
 
 		/* g/c hangarounds (eventually) */
-		discoed = atomic_swap_uint(&disco, 0);
+		discoed = getdisco();
 		while (discoed--) {
 			nfds--;
 			idx = maxidx;
@@ -1288,7 +1327,7 @@ rumpuser_sp_init(const char *url, const 
 	/* sloppy error recovery */
 
 	/*LINTED*/
-	if (bind(s, sap, sap->sa_len) == -1) {
+	if (bind(s, sap, parsetab[idx].slen) == -1) {
 		fprintf(stderr, "rump_sp: server bind failed\n");
 		return errno;
 	}

Index: src/lib/librumpuser/sp_common.c
diff -u src/lib/librumpuser/sp_common.c:1.31 src/lib/librumpuser/sp_common.c:1.32
--- src/lib/librumpuser/sp_common.c:1.31	Tue Mar  8 15:34:37 2011
+++ src/lib/librumpuser/sp_common.c	Fri Jul 27 09:09:05 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: sp_common.c,v 1.31 2011/03/08 15:34:37 pooka Exp $	*/
+/*      $NetBSD: sp_common.c,v 1.32 2012/07/27 09:09:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -29,14 +29,13 @@
  * Common client/server sysproxy routines.  #included.
  */
 
-#include <sys/cdefs.h>
+#include "rumpuser_port.h"
 
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/queue.h>
 #include <sys/socket.h>
 #include <sys/un.h>
-#include <sys/syslimits.h>
 
 #include <arpa/inet.h>
 #include <netinet/in.h>
@@ -46,6 +45,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <limits.h>
 #include <poll.h>
 #include <pthread.h>
 #include <stdarg.h>
@@ -55,6 +55,14 @@
 #include <string.h>
 #include <unistd.h>
 
+/*
+ * XXX: NetBSD's __unused collides with Linux headers, so we cannot
+ * define it before we've included everything.
+ */
+#if !defined(__unused) && defined(__GNUC__)
+#define __unused __attribute__((__unused__))
+#endif
+
 //#define DEBUG
 #ifdef DEBUG
 #define DPRINTF(x) mydprintf x
@@ -502,7 +510,7 @@ tcp_parse(const char *addr, struct socka
 	int port;
 
 	memset(&sin, 0, sizeof(sin));
-	sin.sin_len = sizeof(sin);
+	SA_SETLEN(&sin, sizeof(sin));
 	sin.sin_family = AF_INET;
 
 	p = strchr(addr, ':');
@@ -593,7 +601,7 @@ unix_parse(const char *addr, struct sock
 	size_t slen;
 	int savepath = 0;
 
-	if (strlen(addr) > sizeof(sun.sun_path))
+	if (strlen(addr) >= sizeof(sun.sun_path))
 		return ENAMETOOLONG;
 
 	/*
@@ -612,16 +620,20 @@ unix_parse(const char *addr, struct sock
 			fprintf(stderr, "warning: cannot determine cwd, "
 			    "omitting socket cleanup\n");
 		} else {
-			if (strlen(addr) + strlen(mywd) > sizeof(sun.sun_path))
+			if (strlen(addr)+strlen(mywd)+1 >= sizeof(sun.sun_path))
 				return ENAMETOOLONG;
-			strlcpy(sun.sun_path, mywd, sizeof(sun.sun_path));
-			strlcat(sun.sun_path, "/", sizeof(sun.sun_path));
+			strcpy(sun.sun_path, mywd);
+			strcat(sun.sun_path, "/");
 			savepath = 1;
 		}
 	}
-	strlcat(sun.sun_path, addr, sizeof(sun.sun_path));
+	strcat(sun.sun_path, addr);
+#ifdef __linux__
+	slen = sizeof(sun);
+#else
 	sun.sun_len = SUN_LEN(&sun);
 	slen = sun.sun_len+1; /* get the 0 too */
+#endif
 
 	if (savepath && *parsedurl == '\0') {
 		snprintf(parsedurl, sizeof(parsedurl),
@@ -668,14 +680,18 @@ success(void)
 struct {
 	const char *id;
 	int domain;
+	socklen_t slen;
 	addrparse_fn ap;
 	connecthook_fn connhook;
 	cleanup_fn cleanup;
 } parsetab[] = {
-	{ "tcp", PF_INET, tcp_parse, tcp_connecthook, (cleanup_fn)success },
-	{ "unix", PF_LOCAL, unix_parse, (connecthook_fn)success, unix_cleanup },
-	{ "tcp6", PF_INET6, (addrparse_fn)notsupp, (connecthook_fn)success,
-			    (cleanup_fn)success },
+	{ "tcp", PF_INET, sizeof(struct sockaddr_in),
+	    tcp_parse, tcp_connecthook, (cleanup_fn)success },
+	{ "unix", PF_LOCAL, sizeof(struct sockaddr_un),
+	    unix_parse, (connecthook_fn)success, unix_cleanup },
+	{ "tcp6", PF_INET6, sizeof(struct sockaddr_in6),
+	    (addrparse_fn)notsupp, (connecthook_fn)success,
+	    (cleanup_fn)success },
 };
 #define NPARSE (sizeof(parsetab)/sizeof(parsetab[0]))
 

Added files:

Index: src/lib/librumpuser/rumpuser_port.h
diff -u /dev/null src/lib/librumpuser/rumpuser_port.h:1.1
--- /dev/null	Fri Jul 27 09:09:05 2012
+++ src/lib/librumpuser/rumpuser_port.h	Fri Jul 27 09:09:05 2012
@@ -0,0 +1,76 @@
+/*	$NetBSD: rumpuser_port.h,v 1.1 2012/07/27 09:09:05 pooka Exp $	*/
+
+/*
+ * Portability header for non-NetBSD platforms.
+ * Quick & dirty.
+ * Maybe should try to use the infrastructure in tools/compat instead?
+ */
+
+/*
+ * XXX:
+ * There is currently no errno translation for the error values reported
+ * by the hypercall layer.
+ */
+
+#ifndef _LIB_LIBRUMPUSER_RUMPUSER_PORT_H_
+#define _LIB_LIBRUMPUSER_RUMPUSER_PORT_H_
+
+#ifdef __NetBSD__
+#include <sys/cdefs.h>
+#endif
+
+#ifdef __linux__
+#define _XOPEN_SOURCE 600
+#define _BSD_SOURCE
+#define _FILE_OFFSET_BITS 64
+#define _GNU_SOURCE
+#include <features.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+#ifndef __RCSID
+#define __RCSID(a)
+#endif
+
+#ifndef INFTIM
+#define INFTIM (-1)
+#endif
+
+#ifndef _DIAGASSERT
+#define _DIAGASSERT(_p_)
+#endif
+
+#ifdef __linux__
+#define SA_SETLEN(a,b)
+#else /* BSD */
+#define SA_SETLEN(_sa_, _len_) ((struct sockaddr *)_sa_)->sa_len = _len_
+#endif
+
+#ifndef __predict_true
+#define __predict_true(a) a
+#define __predict_false(a) a
+#endif
+
+#ifndef __dead
+#define __dead
+#endif
+
+#ifndef __printflike
+#define __printflike(a,b)
+#endif
+
+#ifndef __arraycount
+#define __arraycount(_ar_) (sizeof(_ar_)/sizeof(_ar_[0]))
+#endif
+
+#ifndef __UNCONST
+#define __UNCONST(_a_) ((void *)(unsigned long)(const void *)(_a_))
+#endif
+
+#ifdef __linux__
+#define arc4random() random()
+#endif
+
+#endif /* _LIB_LIBRUMPUSER_RUMPUSER_PORT_H_ */

Reply via email to