X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/e04c2d50fd96f3f31bc96851c55c6efecc10469c..388e0319a0faf48193658c82228133bd1ea24eb6:/server/tun-linux.c diff --git a/server/tun-linux.c b/server/tun-linux.c index 53f1978b..b8705802 100644 --- a/server/tun-linux.c +++ b/server/tun-linux.c @@ -1,6 +1,4 @@ /* -*-c-*- - * - * $Id$ * * Tunnel interface based on Linux TUN/TAP driver * @@ -93,6 +91,7 @@ static void t_init(void) { return; } /* --- @t_create@ --- * * * Arguments: @peer *p@ = pointer to peer block + * @int fd@ = file descriptor of tunnel device * @char **ifn@ = where to put the interface name * * Returns: A tunnel block if it worked, or null on failure. @@ -100,37 +99,16 @@ static void t_init(void) { return; } * Use: Initializes a new tunnel. */ -static tunnel *t_create(peer *p, char **ifn) +static tunnel *t_create(peer *p, int fd, char **ifn) { - int fd; - int f; - struct ifreq iff; tunnel *t; - if ((fd = open("/dev/net/tun", O_RDWR)) < 0) { - a_warn("TUN", "-", "linux", - "open-error", "/dev/net/tun", "?ERRNO", - A_END); - return (0); - } fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); - memset(&iff, 0, sizeof(iff)); - iff.ifr_name[0] = 0; - iff.ifr_flags = IFF_TUN | IFF_NO_PI; - if ((f = ioctl(fd, TUNSETIFF, &iff)) < 0) { - a_warn("TUN", "-", "linux", "config-error", "?ERRNO", A_END); - close(fd); - return (0); - } t = CREATE(tunnel); t->ops = &tun_linux; t->p = p; sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); sel_addfile(&t->f); - iff.ifr_name[IFNAMSIZ - 1] = 0; - *ifn = xstrdup(iff.ifr_name); - T( trace(T_TUNNEL, "tun-linux: attached interface %s to peer `%s'", - *ifn, p_name(p)); ) return (t); } @@ -163,14 +141,11 @@ static void t_inject(tunnel *t, buf *b) */ static void t_destroy(tunnel *t) -{ - sel_rmfile(&t->f); - close(t->f.fd); - DESTROY(t); -} + { sel_rmfile(&t->f); close(t->f.fd); DESTROY(t); } const tunnel_ops tun_linux = { "linux", + TUNF_PRIVOPEN, t_init, t_create, 0,