/* -*-c-*-
- *
- * $Id$
*
* Tunnel interface for 4.4BSD-derived systems
*
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@ --- *
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;
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);
}
*/
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,