diff options
Diffstat (limited to 'net/vde2/files/patch-vdetaplib::libvdetap.c')
-rw-r--r-- | net/vde2/files/patch-vdetaplib::libvdetap.c | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/net/vde2/files/patch-vdetaplib::libvdetap.c b/net/vde2/files/patch-vdetaplib::libvdetap.c new file mode 100644 index 000000000000..7c304913b035 --- /dev/null +++ b/net/vde2/files/patch-vdetaplib::libvdetap.c @@ -0,0 +1,260 @@ +--- vdetaplib/libvdetap.c Sat Jan 29 15:02:08 2005 ++++ vdetaplib/libvdetap.c Sun Jan 30 13:29:07 2005 +@@ -5,26 +5,39 @@ + #include <sys/socket.h> + #include <sys/syscall.h> + #include <sys/stat.h> ++#include <limits.h> ++#include <dlfcn.h> + #include <stdarg.h> + #include <string.h> + #include <unistd.h> + #include <stdlib.h> +-#define __USE_LARGEFILE64 + #include <fcntl.h> + #include <errno.h> + #include <signal.h> +-#include <linux/ioctl.h> +-#include <linux/if.h> +-#include <linux/if_tun.h> ++#include <stdio.h> ++#include <sys/ioctl.h> ++#include <net/if.h> ++#include <net/if_tun.h> + +-#define TUNTAPPATH "/dev/net/tun" ++#define TUNTAPPATH "/dev/tap" + #define VDETAPEXEC "vdetap" + #define VDEALLTAP "VDEALLTAP" + #define MAX 10 + ++#if defined(RTLD_NEXT) ++#define REAL_LIBC RTLD_NEXT ++#else ++#define REAL_LIBC ((void *) -1L) ++#endif ++ ++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__bsdi__) ++typedef unsigned long request_t; ++#else ++typedef int request_t; ++#endif ++ + int tapfd[2] = {-1,-1}; + static int tapcount=0; +-static int tuncount=0; + + static struct pidlist { + pid_t pid; +@@ -39,11 +52,6 @@ + return rv; + } + +-static void plfree (struct pidlist *el) { +- el->next=flh; +- flh=el; +-} +- + static int addpid(int pid) { + struct pidlist *plp; + if ((plp=plmalloc ()) != NULL) { +@@ -74,105 +82,41 @@ + } + } + +- int +-native_open(const char *pathname, int flags, mode_t data) +-{ +- return (syscall(SYS_open, pathname, flags, data)); +-} +- +- int +-native_ioctl(int fd, unsigned long int command, char *data) +-{ +- return (syscall(SYS_ioctl, fd, command, data)); +-} +- +- + int open(const char *path, int flags, ...) + { +- static char buf[PATH_MAX]; ++ static int (*func) (const char *, int, mode_t) = NULL; ++ char *vdesock; ++ int pid; + va_list ap; + mode_t data; + +- va_start(ap, flags); +- data = va_arg(ap, mode_t); +- va_end(ap); +- +- if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) { +- if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) { +- return tapfd[0]; +- } +- else +- return -1; +- +- } else +- return native_open(path, flags, data); +-} +- +-int open64(const char *path, int flags, ...) +-{ +- static char buf[PATH_MAX]; +- va_list ap; +- mode_t data; ++ if (!func) ++ func = (int (*) (const char *, int, mode_t)) ++ dlsym (REAL_LIBC, "open"); + + va_start(ap, flags); +- data = va_arg(ap, mode_t); ++ data = va_arg(ap, int); + va_end(ap); + + if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) { + if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) { +- return tapfd[0]; +- } +- else +- return -1; +- +- } else +- return native_open(path, flags | O_LARGEFILE, data); +-} +- +-int ioctl(int fd, unsigned long int command, ...) +-{ +- va_list ap; +- char *data; +- char *vdesock; +- int pid; +- +- va_start(ap, command); +- data = va_arg(ap, char *); +- va_end(ap); +- +- if (fd == tapfd[0]) { +- if (command == TUNSETIFF) { +- struct ifreq *ifr = (struct ifreq *) data; + char num[5]; + char name[10]; +- +- ifr->ifr_name[IFNAMSIZ-1] = '\0'; +- if (ifr->ifr_name[0] == 0) { +- if (ifr->ifr_flags & IFF_TAP) +- sprintf(name,"tap%d",tapcount++); +- else +- sprintf(name,"tun%d",tuncount++); +- strncpy(ifr->ifr_name,name,IFNAMSIZ); +- } +- else if (strchr(ifr->ifr_name, '%') != NULL) { +- sprintf(name,ifr->ifr_name,tapcount++); +- strncpy(ifr->ifr_name,name,IFNAMSIZ); +- } +- if (ifr->ifr_flags & IFF_TAP && +- ((vdesock=getenv(ifr->ifr_name)) != NULL) +- ||(vdesock=getenv(VDEALLTAP)) != NULL){ ++ sprintf(name,"tap%d",tapcount++); ++ if (((vdesock=getenv(name)) != NULL) ++ ||(vdesock=getenv(VDEALLTAP)) != NULL){ + if ((pid=fork()) < 0) { + close(tapfd[1]); + errno=EINVAL; + return -1; + } else if (pid > 0) { /*father*/ +- if(pid=addpid(pid) < 0) { ++ if((pid=addpid(pid)) < 0) { + close(tapfd[0]); + close(tapfd[1]); + return -1; + } else { + close(tapfd[1]); +- return 0; ++ return tapfd[0]; + } + } else { /*son*/ + plh=NULL; +@@ -181,34 +125,53 @@ + execlp(VDETAPEXEC,"-",num,vdesock,(char *) 0); + } + } +- else /*roll back to the native tuntap*/ +- { +- int newfd; +- int saverrno; +- int resultioctl; +- close(tapfd[1]); +- if ((newfd=native_open(TUNTAPPATH, O_RDWR, 0)) < 0) { +- saverrno=errno; +- close(tapfd[0]); +- errno=saverrno; +- return -1; +- } else +- { +- resultioctl=native_ioctl(fd, command, data); +- if (resultioctl < 0) { +- saverrno=errno; +- close(tapfd[0]); +- errno=saverrno; +- return -1; +- } else { +- dup2(newfd,tapfd[0]); +- return resultioctl; +- } +- } +- } +- } else +- return 0; ++ return tapfd[0]; ++ } ++ else ++ return -1; ++ + } else +- return (native_ioctl(fd, command, data)); ++ return (*func)(path, flags, data); ++} ++ ++int ioctl(int fd, unsigned long int command, ...) ++{ ++ static int (*func) (int, request_t, void *) = NULL; ++ int dummy; ++ va_list ap; ++ char *data; ++ struct ifstat *ifs; ++ ++ if (!func) ++ func = (int (*) (int, request_t, void *)) ++ dlsym (REAL_LIBC, "ioctl"); ++ ++ va_start(ap, command); ++ data = va_arg(ap, char *); ++ va_end(ap); ++ ++ if (fd == tapfd[0]) { ++ switch(command) { ++ case SIOCSIFFLAGS: ++ case SIOCADDMULTI: ++ case SIOCDELMULTI: ++ break; ++ ++ case SIOCGIFSTATUS: ++ ifs = (struct ifstat *)data; ++ dummy = strlen(ifs->ascii); ++ if(plh && dummy < sizeof(ifs->ascii)) ++ snprintf(ifs->ascii + dummy, ++ sizeof(ifs->ascii) - dummy, ++ "\tOpened by PID %d\n", ++ plh[0].pid); ++ break; ++ ++ default: ++ return (*func) (fd, command, data); ++ } ++ } ++ ++ return (*func) (fd, command, data); + } + |