Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/librumphijack Networked X11 clients have the annoying pr...
details: https://anonhg.NetBSD.org/src/rev/189953aa7441
branches: trunk
changeset: 760634:189953aa7441
user: pooka <pooka%NetBSD.org@localhost>
date: Sun Jan 09 19:56:33 2011 +0000
description:
Networked X11 clients have the annoying property that they need to
contact the X server. Since most of the useful cases these days
are local, add a toggle which forwards PF_LOCAL sockets to the host
and all other protocol families to the rump kernel.
This makes an unmodified firefox work with a rump TCP/IP stack.
I'm sure someone will find applications for being able to run
multiple web browser profiles on one OS with each browser having
a different IP address in the same subnet ...
diffstat:
lib/librumphijack/hijack.c | 131 +++++++++++++++++++++++++++++++++-----------
1 files changed, 98 insertions(+), 33 deletions(-)
diffs (272 lines):
diff -r d748bfe0ce30 -r 189953aa7441 lib/librumphijack/hijack.c
--- a/lib/librumphijack/hijack.c Sun Jan 09 16:55:59 2011 +0000
+++ b/lib/librumphijack/hijack.c Sun Jan 09 19:56:33 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: hijack.c,v 1.6 2011/01/09 14:15:06 pooka Exp $ */
+/* $NetBSD: hijack.c,v 1.7 2011/01/09 19:56:33 pooka Exp $ */
/*-
* Copyright (c) 2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: hijack.c,v 1.6 2011/01/09 14:15:06 pooka Exp $");
+__RCSID("$NetBSD: hijack.c,v 1.7 2011/01/09 19:56:33 pooka Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -91,6 +91,15 @@
"__pollts50",
};
+static int (*host_socket)(int, int, int);
+static int (*host_connect)(int, const struct sockaddr *, socklen_t);
+static int (*host_bind)(int, const struct sockaddr *, socklen_t);
+static int (*host_listen)(int, int);
+static int (*host_accept)(int, struct sockaddr *, socklen_t *);
+static int (*host_getpeername)(int, struct sockaddr *, socklen_t *);
+static int (*host_getsockname)(int, struct sockaddr *, socklen_t *);
+static int (*host_setsockopt)(int, int, int, const void *, socklen_t);
+
static ssize_t (*host_read)(int, void *, size_t);
static ssize_t (*host_readv)(int, const struct iovec *, int);
static ssize_t (*host_write)(int, const void *, size_t);
@@ -116,6 +125,9 @@
return dlsym(handle, symbol);
}
+/* low calorie sockets? */
+static bool hostlocalsockets = false;
+
static void __attribute__((constructor))
rcinit(void)
{
@@ -133,6 +145,15 @@
rumpcdlsym = dlsym(hand, "rumpclient_dlsym");
*rumpcdlsym = hijackdlsym;
+ host_socket = dlsym(RTLD_NEXT, "__socket30");
+ host_listen = dlsym(RTLD_NEXT, "listen");
+ host_connect = dlsym(RTLD_NEXT, "connect");
+ host_bind = dlsym(RTLD_NEXT, "bind");
+ host_accept = dlsym(RTLD_NEXT, "accept");
+ host_getpeername = dlsym(RTLD_NEXT, "getpeername");
+ host_getsockname = dlsym(RTLD_NEXT, "getsockname");
+ host_setsockopt = dlsym(RTLD_NEXT, "setsockopt");
+
host_read = dlsym(RTLD_NEXT, "read");
host_readv = dlsym(RTLD_NEXT, "readv");
host_write = dlsym(RTLD_NEXT, "write");
@@ -228,13 +249,21 @@
{
int (*rc_socket)(int, int, int);
int fd;
+ bool dohost;
- rc_socket = rumpcalls[RUMPCALL_SOCKET];
+ dohost = hostlocalsockets && (domain == AF_LOCAL);
+
+ if (dohost)
+ rc_socket = host_socket;
+ else
+ rc_socket = rumpcalls[RUMPCALL_SOCKET];
fd = rc_socket(domain, type, protocol);
- DPRINTF(("socket <- %d\n", fd_rump2host(fd)));
+ if (!dohost)
+ fd = fd_rump2host(fd);
+ DPRINTF(("socket <- %d\n", fd));
- return fd_rump2host(fd);
+ return fd;
}
int
@@ -242,14 +271,24 @@
{
int (*rc_accept)(int, struct sockaddr *, socklen_t *);
int fd;
+ bool isrump;
+
+ isrump = fd_isrump(s);
DPRINTF(("accept -> %d", s));
- assertfd(s);
- rc_accept = rumpcalls[RUMPCALL_ACCEPT];
- fd = rc_accept(fd_host2rump(s), addr, addrlen);
- DPRINTF((" <- %d\n", fd_rump2host(fd)));
+ if (isrump) {
+ rc_accept = rumpcalls[RUMPCALL_ACCEPT];
+ s = fd_host2rump(s);
+ } else {
+ rc_accept = host_accept;
+ }
+ fd = rc_accept(s, addr, addrlen);
+ if (fd != -1 && isrump)
+ fd = fd_rump2host(fd);
- return fd_rump2host(fd);
+ DPRINTF((" <- %d\n", fd));
+
+ return fd;
}
int
@@ -258,10 +297,13 @@
int (*rc_bind)(int, const struct sockaddr *, socklen_t);
DPRINTF(("bind -> %d\n", s));
- assertfd(s);
- rc_bind = rumpcalls[RUMPCALL_BIND];
-
- return rc_bind(fd_host2rump(s), name, namelen);
+ if (fd_isrump(s)) {
+ rc_bind = rumpcalls[RUMPCALL_BIND];
+ s = fd_host2rump(s);
+ } else {
+ rc_bind = host_bind;
+ }
+ return rc_bind(s, name, namelen);
}
int
@@ -270,10 +312,14 @@
int (*rc_connect)(int, const struct sockaddr *, socklen_t);
DPRINTF(("connect -> %d\n", s));
- assertfd(s);
- rc_connect = rumpcalls[RUMPCALL_CONNECT];
+ if (fd_isrump(s)) {
+ rc_connect = rumpcalls[RUMPCALL_CONNECT];
+ s = fd_host2rump(s);
+ } else {
+ rc_connect = host_connect;
+ }
- return rc_connect(fd_host2rump(s), name, namelen);
+ return rc_connect(s, name, namelen);
}
int
@@ -282,9 +328,13 @@
int (*rc_getpeername)(int, struct sockaddr *, socklen_t *);
DPRINTF(("getpeername -> %d\n", s));
- assertfd(s);
- rc_getpeername = rumpcalls[RUMPCALL_GETPEERNAME];
- return rc_getpeername(fd_host2rump(s), name, namelen);
+ if (fd_isrump(s)) {
+ rc_getpeername = rumpcalls[RUMPCALL_GETPEERNAME];
+ s = fd_host2rump(s);
+ } else {
+ rc_getpeername = host_getpeername;
+ }
+ return rc_getpeername(s, name, namelen);
}
int
@@ -293,9 +343,13 @@
int (*rc_getsockname)(int, struct sockaddr *, socklen_t *);
DPRINTF(("getsockname -> %d\n", s));
- assertfd(s);
- rc_getsockname = rumpcalls[RUMPCALL_GETSOCKNAME];
- return rc_getsockname(fd_host2rump(s), name, namelen);
+ if (fd_isrump(s)) {
+ rc_getsockname = rumpcalls[RUMPCALL_GETSOCKNAME];
+ s = fd_host2rump(s);
+ } else {
+ rc_getsockname = host_getsockname;
+ }
+ return rc_getsockname(s, name, namelen);
}
int
@@ -304,9 +358,13 @@
int (*rc_listen)(int, int);
DPRINTF(("listen -> %d\n", s));
- assertfd(s);
- rc_listen = rumpcalls[RUMPCALL_LISTEN];
- return rc_listen(fd_host2rump(s), backlog);
+ if (fd_isrump(s)) {
+ rc_listen = rumpcalls[RUMPCALL_LISTEN];
+ s = fd_host2rump(s);
+ } else {
+ rc_listen = host_listen;
+ }
+ return rc_listen(s, backlog);
}
ssize_t
@@ -379,7 +437,7 @@
{
int (*rc_getsockopt)(int, int, int, void *, socklen_t *);
- DPRINTF(("getsockopt\n"));
+ DPRINTF(("getsockopt -> %d\n", s));
assertfd(s);
rc_getsockopt = rumpcalls[RUMPCALL_GETSOCKOPT];
return rc_getsockopt(fd_host2rump(s), level, optname, optval, optlen);
@@ -390,10 +448,14 @@
{
int (*rc_setsockopt)(int, int, int, const void *, socklen_t);
- DPRINTF(("setsockopt\n"));
- assertfd(s);
- rc_setsockopt = rumpcalls[RUMPCALL_SETSOCKOPT];
- return rc_setsockopt(fd_host2rump(s), level, optname, optval, optlen);
+ DPRINTF(("setsockopt -> %d\n", s));
+ if (fd_isrump(s)) {
+ rc_setsockopt = rumpcalls[RUMPCALL_SETSOCKOPT];
+ s = fd_host2rump(s);
+ } else {
+ rc_setsockopt = host_setsockopt;
+ }
+ return rc_setsockopt(s, level, optname, optval, optlen);
}
int
@@ -401,7 +463,7 @@
{
int (*rc_shutdown)(int, int);
- DPRINTF(("shutdown\n"));
+ DPRINTF(("shutdown -> %d\n", s));
assertfd(s);
rc_shutdown = rumpcalls[RUMPCALL_SHUTDOWN];
return rc_shutdown(fd_host2rump(s), how);
@@ -496,6 +558,7 @@
{
int (*op_readv)(int, const struct iovec *, int);
+ DPRINTF(("readv %d\n", fd));
if (fd_isrump(fd)) {
fd = fd_host2rump(fd);
op_readv = rumpcalls[RUMPCALL_READV];
@@ -503,7 +566,6 @@
op_readv = host_readv;
}
- DPRINTF(("readv\n"));
return op_readv(fd, iov, iovcnt);
}
@@ -527,6 +589,7 @@
{
int (*op_writev)(int, const struct iovec *, int);
+ DPRINTF(("writev %d\n", fd));
if (fd_isrump(fd)) {
fd = fd_host2rump(fd);
op_writev = rumpcalls[RUMPCALL_WRITEV];
@@ -604,6 +667,8 @@
nfds_t i, j, realnfds;
int rv, incr;
+ DPRINTF(("select\n"));
+
/*
* Well, first we must scan the fds to figure out how many
* fds there really are. This is because up to and including
Home |
Main Index |
Thread Index |
Old Index