X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/53a941d3f97a50964587c6e9533b1e43e74a57a8..8187950bc47575533beff8a9492c1c2f5e08cba3:/server/tun-bsd.c diff --git a/server/tun-bsd.c b/server/tun-bsd.c index 12765e5d..2c872997 100644 --- a/server/tun-bsd.c +++ b/server/tun-bsd.c @@ -38,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@ --- * @@ -60,7 +59,8 @@ static void t_read(int fd, unsigned mode, void *v) n = read(fd, buf_i, sizeof(buf_i)); if (n < 0) { - a_warn("TUN", "%s", p_ifname(t->p), "read-error", "?ERRNO", A_END); + a_warn("TUN", "%s", p_ifname(t->p), "bsd", + "read-error", "?ERRNO", A_END); return; } IF_TRACING(T_TUNNEL, { @@ -86,6 +86,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. @@ -93,42 +94,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; - unsigned n; tunnel *t; - char buf[16]; - - n = 0; - for (;;) { - sprintf(buf, "/dev/tun%u", n); - if ((fd = open(buf, O_RDWR)) >= 0) - break; - switch (errno) { - case EBUSY: - T( trace(T_TUNNEL, "tunnel device %u busy: skipping", n); ) - break; - case ENOENT: - a_warn("TUN", "-", "bsd", "no-tunnel-devices", A_END); - return (0); - default: - a_warn("TUN", "-", "open-error", "%s", buf, "?ERRNO", A_END); - break; - } - n++; - } + 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); } @@ -148,7 +123,7 @@ static void t_inject(tunnel *t, buf *b) trace(T_TUNNEL, "tun-bsd: inject decrypted packet"); trace_block(T_PACKET, "tun-bsd: packet contents", BBASE(b), BLEN(b)); }) - write(t->f.fd, BBASE(b), BLEN(b)); + IGNORE(write(t->f.fd, BBASE(b), BLEN(b))); } /* --- @t_destroy@ --- * @@ -161,14 +136,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_bsd = { "bsd", + TUNF_PRIVOPEN, t_init, t_create, 0,