struct peer *p; /* Pointer to my peer */
};
-/* --- @t_ifname@ --- *
- *
- * Arguments: @tunnel *t@ = pointer to tunnel block
- *
- * Returns: A pointer to the tunnel's interface name.
- */
-
-static const char *t_ifname(tunnel *t)
-{
- static char b[UNET_NAMEMAX];
- struct unet_info uni;
- if (ioctl(t->f.fd, UNIOCGINFO, &uni)) {
- a_warn("TUN", "-", "unet", "getinfo-error", "?ERRNO", A_END);
- return ("<error>");
- }
- if (strlen(uni.uni_ifname) + 1 > sizeof(b)) {
- a_warn("TUN", "-", "unet", "ifname-too-long", A_END);
- return ("<error>");
- }
- strcpy(b, uni.uni_ifname);
- return (b);
-}
-
/* --- @t_read@ --- *
*
* Arguments: @int fd@ = file descriptor to read
n = read(fd, buf_i, sizeof(buf_i));
if (n < 0) {
- a_warn("TUN", "%s", t_ifname(t), "read-error", "?ERRNO", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "read-error", "?ERRNO", A_END);
return;
}
IF_TRACING(T_TUNNEL, {
*
* Arguments: @tunnel *t@ = pointer to tunnel block
* @peer *p@ = pointer to peer block
+ * @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)
+static tunnel *t_create(peer *p, 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);
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 ("<error>");
+ }
+ *ifn = xstrdup(uni.uni_ifname);
T( trace(T_TUNNEL, "tun-unet: attached interface %s to peer `%s'",
- t_ifname(t), p_name(p)); )
+ *ifn, p_name(p)); )
return (t);
}
"unet",
t_init,
t_create,
- t_ifname,
+ 0,
t_inject,
t_destroy
};