/* -*-c-*-
*
- * $Id: tun-unet.c,v 1.1 2001/02/03 20:26:37 mdw Exp $
+ * $Id$
*
* Tunnel interface based on Linux Usernet
*
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: tun-unet.c,v $
- * Revision 1.1 2001/02/03 20:26:37 mdw
- * Initial checkin.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include "tripe.h"
#include <sys/ioctl.h>
+#include <net/if.h>
#include <unet.h>
/*----- Main code ---------------------------------------------------------*/
+#if TUN_TYPE != TUN_UNET
+# error "Tunnel type mismatch: fix the Makefile"
+#endif
+
/* --- @t_read@ --- *
*
* Arguments: @int fd@ = file descriptor to read
* Use: Reads data from the tunnel.
*/
-void t_read(int fd, unsigned mode, void *v)
+static void t_read(int fd, unsigned mode, void *v)
{
tunnel *t = v;
ssize_t n;
n = read(fd, buf_i, sizeof(buf_i));
if (n < 0) {
- a_warn("tunnel read failed (%s): %s", tun_ifname(t), strerror(errno));
+ a_warn("TUN %s read-error -- %s", tun_ifname(t), strerror(errno));
return;
}
IF_TRACING(T_TUNNEL, {
int tun_create(tunnel *t, peer *p)
{
int fd;
+ int f;
if ((fd = open("/dev/unet", O_RDWR)) < 0) {
- a_warn("open `/dev/unet' failed: %s", strerror(errno));
+ a_warn("TUN - open-error /dev/unet -- %s", strerror(errno));
+ return (-1);
+ }
+ 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 -- %s", strerror(errno));
+ close(fd);
return (-1);
}
t->p = p;
static char b[UNET_NAMEMAX];
struct unet_info uni;
if (ioctl(t->f.fd, UNIOCGINFO, &uni)) {
- a_warn("ioctl(UNIOCGINFO) failed: %s", strerror(errno));
+ a_warn("TUN - unet getinfo-error -- %s", strerror(errno));
return ("<error>");
}
if (strlen(uni.uni_ifname) + 1 > sizeof(b)) {
- a_warn("interface name too long!");
+ a_warn("TUN - unet ifname-too-long");
return ("<error>");
}
strcpy(b, uni.uni_ifname);