Module Name:    src
Committed By:   pooka
Date:           Wed Jan 19 11:27:01 UTC 2011

Modified Files:
        src/lib/librumphijack: hijack.c

Log Message:
Do the standard dance for sendto/recvfrom since nspluginwrapper
wants to use them.  XXX: need to fold the dance sequence into a
common routine.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/lib/librumphijack/hijack.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/librumphijack/hijack.c
diff -u src/lib/librumphijack/hijack.c:1.15 src/lib/librumphijack/hijack.c:1.16
--- src/lib/librumphijack/hijack.c:1.15	Tue Jan 18 23:43:21 2011
+++ src/lib/librumphijack/hijack.c	Wed Jan 19 11:27:01 2011
@@ -1,4 +1,4 @@
-/*      $NetBSD: hijack.c,v 1.15 2011/01/18 23:43:21 pooka Exp $	*/
+/*      $NetBSD: hijack.c,v 1.16 2011/01/19 11:27:01 pooka Exp $	*/
 
 /*-
  * Copyright (c) 2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: hijack.c,v 1.15 2011/01/18 23:43:21 pooka Exp $");
+__RCSID("$NetBSD: hijack.c,v 1.16 2011/01/19 11:27:01 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -116,6 +116,9 @@
 static pid_t	(*host_fork)(void);
 static int	(*host_dup2)(int, int);
 static int	(*host_shutdown)(int, int);
+/* XXX */
+static void	*host_sendto;
+static void	*host_recvfrom;
 
 static void *rumpcalls[RUMPCALL__NUM];
 
@@ -189,6 +192,8 @@
 	host_fork = dlsym(RTLD_NEXT, "fork");
 	host_dup2 = dlsym(RTLD_NEXT, "dup2");
 	host_shutdown = dlsym(RTLD_NEXT, "shutdown");
+	host_sendto = dlsym(RTLD_NEXT, "sendto");
+	host_recvfrom = dlsym(RTLD_NEXT, "recvfrom");
 
 	for (i = 0; i < RUMPCALL__NUM; i++) {
 		rumpcalls[i] = dlsym(hand, sysnames[i]);
@@ -401,9 +406,14 @@
 	    struct sockaddr *, socklen_t *);
 
 	DPRINTF(("recvfrom\n"));
-	assertfd(s);
-	rc_recvfrom = rumpcalls[RUMPCALL_RECVFROM];
-	return rc_recvfrom(fd_host2rump(s), buf, len, flags, from, fromlen);
+	if (fd_isrump(s)) {
+		rc_recvfrom = rumpcalls[RUMPCALL_RECVFROM];
+		s = fd_host2rump(s);
+	} else {
+		rc_recvfrom = host_recvfrom;
+	}
+
+	return rc_recvfrom(s, buf, len, flags, from, fromlen);
 }
 
 ssize_t
@@ -433,11 +443,15 @@
 
 	if (s == -1)
 		return len;
-
 	DPRINTF(("sendto\n"));
-	assertfd(s);
-	rc_sendto = rumpcalls[RUMPCALL_SENDTO];
-	return rc_sendto(fd_host2rump(s), buf, len, flags, to, tolen);
+
+	if (fd_isrump(s)) {
+		rc_sendto = rumpcalls[RUMPCALL_SENDTO];
+		s = fd_host2rump(s);
+	} else {
+		rc_sendto = host_sendto;
+	}
+	return rc_sendto(s, buf, len, flags, to, tolen);
 }
 
 ssize_t

Reply via email to