/* -*-c-*-
*
- * $Id: tun-unet.c,v 1.1 2001/02/03 20:26:37 mdw Exp $
+ * $Id: tun-unet.c,v 1.5 2002/01/13 14:57:05 mdw Exp $
*
* Tunnel interface based on Linux Usernet
*
/*----- Revision history --------------------------------------------------*
*
* $Log: tun-unet.c,v $
+ * Revision 1.5 2002/01/13 14:57:05 mdw
+ * Make @t_read@ be static, as it always should have been.
+ *
+ * Revision 1.4 2001/02/19 19:10:45 mdw
+ * Set unet devices to be point-to-point.
+ *
+ * Revision 1.3 2001/02/05 19:55:00 mdw
+ * Guard against inappropriate compilation.
+ *
+ * Revision 1.2 2001/02/04 17:10:58 mdw
+ * Make file descriptors be nonblocking and close-on-exec.
+ *
* Revision 1.1 2001/02/03 20:26:37 mdw
* Initial checkin.
*
#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;
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));
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("couldn't set point-to-point flag: %s", strerror(errno));
+ close(fd);
+ return (-1);
+ }
t->p = p;
sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t);
sel_addfile(&t->f);