#ifdef TUN_UNET
# include <sys/ioctl.h>
-# include <net/if.h>
+# include <linux/if.h>
# include <unet.h>
#endif
/* --- @t_create@ --- *
*
- * Arguments: @tunnel *t@ = pointer to tunnel block
- * @peer *p@ = pointer to peer block
- * @char *ifn@ = where to put the interface name
+ * 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, char **ifn)
+static tunnel *t_create(peer *p, int fd, char **ifn)
{
- int fd;
tunnel *t;
- int f;
- struct unet_info uni;
- if ((fd = open("/dev/unet", O_RDWR)) < 0) {
- a_warn("TUN", "-", "unet", "open-error", "/dev/unet", "?ERRNO", A_END);
- return (0);
- }
fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
- if ((f = ioctl(fd, UNIOCGIFFLAGS)) < 0 ||
- ioctl(fd, UNIOCSIFFLAGS, f | IFF_POINTOPOINT)) {
- a_warn("TUN", "-", "unet", "config-error", "?ERRNO", A_END);
- close(fd);
- return (0);
- }
t = CREATE(tunnel);
t->ops = &tun_unet;
t->p = p;
sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t);
sel_addfile(&t->f);
-
- if (ioctl(t->f.fd, UNIOCGINFO, &uni)) {
- a_warn("TUN", "-", "unet", "getinfo-error", "?ERRNO", A_END);
- return (0);
- }
- *ifn = xstrdup(uni.uni_ifname);
- T( trace(T_TUNNEL, "tun-unet: 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_unet = {
"unet",
+ TUNF_PRIVOPEN,
t_init,
t_create,
0,