[Vtun-Commit] CVS: The file 'vtun/linux/tun_dev.c' has been modified.
Status: Inactive
Brought to you by:
mtbishop
|
From: Bishop <mtb...@us...> - 2006-12-11 10:45:35
|
The following file was modified in vtun/linux:
Name Old version New version Comment
---- ----------- ----------- -------
tun_dev.c 1.3 1.4=20=20=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
more cleanup from the massive merge.
The diff of the modified file(s):
--- tun_dev.c 22 Jan 2002 09:53:00 -0000 1.3
+++ tun_dev.c 11 Dec 2006 10:45:35 -0000 1.4
@@ -17,7 +17,7 @@
*/
=20
/*
- * tun_dev.c,v 1.2 2001/09/20 06:26:41 talby Exp
+ * $Id$
*/
=20
#include "config.h"
@@ -41,47 +41,57 @@
* Allocate TUN device, returns opened fd.=20
* Stores dev name in the first arg(must be large enough).
*/
-int tun_open_old(char *dev)
+static int tun_open_common0(char *dev, int istun)
{
char tunname[14];
- int i, fd;
+ int i, fd, err;
=20
if (*dev) {
sprintf(tunname, "/dev/%s", dev);
return open(tunname, O_RDWR);
}
=20
+ sprintf(tunname, "/dev/%s", istun ? "tun" : "tap");
+ err =3D 0;
for (i =3D 0; i < 255; i++) {
- sprintf(tunname, "/dev/tun%d", i);
+ sprintf(tunname + 8, "%d", i);
/* Open device */
if ((fd =3D open(tunname, O_RDWR)) > 0) {
- sprintf(dev, "tun%d", i);
+ strcpy(dev, tunname + 5);
return fd;
}
+ else if (errno !=3D ENOENT)
+ err =3D errno;
+ else if (i) /* don't try all 256 devices */
+ break;
}
+ if (err)
+ errno =3D err;
return -1;
}
=20
#ifdef HAVE_LINUX_IF_TUN_H /* New driver support */
#include <linux/if_tun.h>
=20
+#ifndef OTUNSETNOCSUM
/* pre 2.4.6 compatibility */
#define OTUNSETNOCSUM (('T'<< 8) | 200)
#define OTUNSETDEBUG (('T'<< 8) | 201)
#define OTUNSETIFF (('T'<< 8) | 202)
#define OTUNSETPERSIST (('T'<< 8) | 203)
#define OTUNSETOWNER (('T'<< 8) | 204)
+#endif
=20
-int tun_open(char *dev)
+static int tun_open_common(char *dev, int istun)
{
struct ifreq ifr;
int fd;
=20
if ((fd =3D open("/dev/net/tun", O_RDWR)) < 0)
- return tun_open_old(dev);
+ return tun_open_common0(dev, istun);
=20
memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_flags =3D IFF_TUN | IFF_NO_PI;
+ ifr.ifr_flags =3D (istun ? IFF_TUN : IFF_TAP) | IFF_NO_PI;
if (*dev)
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
=20
@@ -103,24 +113,20 @@
}
=20
#else
-int tun_open(char *dev)
-{
- return tun_open_old(dev);
-}
+
+# define tun_open_common(dev, type) tun_open_common0(dev, type)
+
#endif /* New driver support */
=20
-int tun_close(int fd, char *dev)
-{
- return close(fd);
-}
+int tun_open(char *dev) { return tun_open_common(dev, 1); }
+int tap_open(char *dev) { return tun_open_common(dev, 0); }
+
+int tun_close(int fd, char *dev) { return close(fd); }
+int tap_close(int fd, char *dev) { return close(fd); }
=20
/* Read/write frames from TUN device */
-int tun_write(int fd, char *buf, int len)
-{
- return write(fd, buf, len);
-}
+int tun_write(int fd, char *buf, int len) { return write(fd, buf, len); }
+int tap_write(int fd, char *buf, int len) { return write(fd, buf, len); }
=20
-int tun_read(int fd, char *buf, int len)
-{
- return read(fd, buf, len);
-}
+int tun_read(int fd, char *buf, int len) { return read(fd, buf, len); }
+int tap_read(int fd, char *buf, int len) { return read(fd, buf, len); }
|