X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/e04c2d50fd96f3f31bc96851c55c6efecc10469c..7f73baaff6c35768a1357c4b102b1aed51fd78d8:/server/tun-bsd.c diff --git a/server/tun-bsd.c b/server/tun-bsd.c index 3a45b1e9..200b5d93 100644 --- a/server/tun-bsd.c +++ b/server/tun-bsd.c @@ -1,6 +1,4 @@ /* -*-c-*- - * - * $Id$ * * Tunnel interface for 4.4BSD-derived systems * @@ -40,7 +38,6 @@ struct tunnel { const tunnel_ops *ops; /* Pointer to operations */ sel_file f; /* Selector for tunnel device */ struct peer *p; /* Pointer to my peer */ - unsigned n; /* Number of my tunnel device */ }; /* --- @t_read@ --- * @@ -85,21 +82,20 @@ static void t_read(int fd, unsigned mode, void *v) static void t_init(void) { return; } -/* --- @t_create@ --- * +/* --- @t_open@ --- * * - * Arguments: @peer *p@ = pointer to peer block - * @char **ifn@ = where to put the interface name + * Arguments: @char **ifn@ = where to put the interface name * - * Returns: A tunnel block if it worked, or null on failure. + * Returns: A file descriptor, or @-1@ on failure. * - * Use: Initializes a new tunnel. + * Use: Opens a tunnel device. This will run with root privileges + * even if the rest of the server has dropped them. */ -static tunnel *t_create(peer *p, char **ifn) +static int t_open(char **ifn) { int fd; unsigned n; - tunnel *t; char buf[16]; n = 0; @@ -109,28 +105,41 @@ static tunnel *t_create(peer *p, char **ifn) break; switch (errno) { case EBUSY: - T( trace(T_TUNNEL, "tunnel device %u busy: skipping", n); ) - break; + T( trace(T_TUNNEL, "tunnel device %u busy: skipping", n); ) + break; case ENOENT: - a_warn("TUN", "-", "bsd", "no-tunnel-devices", A_END); - return (0); + a_warn("TUN", "-", "bsd", "no-tunnel-devices", A_END); + return (-1); default: - a_warn("TUN", "-", "open-error", "%s", buf, "?ERRNO", A_END); - break; + a_warn("TUN", "-", "open-error", "%s", buf, "?ERRNO", A_END); + break; } n++; } + return (fd); +} +/* --- @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. + * + * Use: Initializes a new tunnel. + */ + +static tunnel *t_create(peer *p, int fd, char **ifn) +{ + tunnel *t; + + fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); t = CREATE(tunnel); t->ops = &tun_bsd; - fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); t->p = p; - t->n = n; sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t); sel_addfile(&t->f); - *ifn = xstrdup(buf + 5); - T( trace(T_TUNNEL, "tun-bsd: attached interface %s to peer `%s'", - *ifn, p_name(p)); ) return (t); } @@ -163,15 +172,12 @@ 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_bsd = { "bsd", t_init, + t_open, t_create, 0, t_inject,