From 976d91a45e112ea103892cf0d90b652dd0640ba3 Mon Sep 17 00:00:00 2001 From: rd235 Date: Fri, 22 Aug 2008 17:46:42 +0000 Subject: [PATCH] vdetaplib: port/mode/group can be set up git-svn-id: https://vde.svn.sourceforge.net/svnroot/vde/trunk@312 d37a7db1-d92d-0410-89df-f68f52f87b57 --- vde-2/src/vdetaplib/libvdetap.c | 32 ++++++++++++++++++++++++++------ vde-2/src/vdetaplib/vdetap.c | 15 ++++++++++++--- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/vde-2/src/vdetaplib/libvdetap.c b/vde-2/src/vdetaplib/libvdetap.c index 3a01468..ade75d7 100644 --- a/vde-2/src/vdetaplib/libvdetap.c +++ b/vde-2/src/vdetaplib/libvdetap.c @@ -112,9 +112,8 @@ int open(const char *path, int flags, ...) va_end(ap); if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) { - if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) { + if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) return tapfd[0]; - } else return -1; @@ -132,9 +131,8 @@ int open64(const char *path, int flags, ...) va_end(ap); if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) { - if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) { + if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) return tapfd[0]; - } else return -1; @@ -142,12 +140,27 @@ int open64(const char *path, int flags, ...) return native_open64(path, flags | O_LARGEFILE, data); } +static char *getvdeopt(struct ifreq *ifr,char *suffix) +{ + static char buf[16]; + char *rv; + snprintf(buf,16,"%s_%s",ifr->ifr_name,suffix); + if ((rv=getenv(buf)) != NULL) + return rv; + snprintf(buf,16,"VDEALLTAP_%s",ifr->ifr_name,suffix); + if ((rv=getenv(buf)) != NULL) + return rv; + else + return ""; +} + int ioctl(int fd, unsigned long int command, ...) { va_list ap; char *data; char *vdesock; int pid; + int callerpid=getpid(); va_start(ap, command); data = va_arg(ap, char *); @@ -158,6 +171,7 @@ int ioctl(int fd, unsigned long int command, ...) struct ifreq *ifr = (struct ifreq *) data; char num[5]; char name[10]; + char scallerpid[6]; ifr->ifr_name[IFNAMSIZ-1] = '\0'; if (ifr->ifr_name[0] == 0) { @@ -175,7 +189,7 @@ int ioctl(int fd, unsigned long int command, ...) /* from env: single interface or VDEALLTAP */ ((vdesock=getenv(ifr->ifr_name)) != NULL) || (vdesock=getenv(VDEALLTAP)) != NULL) - ){ + ){ if ((pid=fork()) < 0) { close(tapfd[1]); errno=EINVAL; @@ -193,7 +207,13 @@ int ioctl(int fd, unsigned long int command, ...) plh=NULL; close(tapfd[0]); sprintf(num,"%d",tapfd[1]); - return execlp(VDETAPEXEC,"-",num,vdesock,name,(char *) 0); + sprintf(scallerpid,"%d",callerpid); + return execlp(VDETAPEXEC,"-",num,vdesock,ifr->ifr_name, + scallerpid, + getvdeopt(ifr,"port"), + getvdeopt(ifr,"group"), + getvdeopt(ifr,"mode"), + (char *) 0); } } else /*roll back to the native tuntap*/ diff --git a/vde-2/src/vdetaplib/vdetap.c b/vde-2/src/vdetaplib/vdetap.c index d02c882..23d3b5d 100644 --- a/vde-2/src/vdetaplib/vdetap.c +++ b/vde-2/src/vdetaplib/vdetap.c @@ -1,6 +1,7 @@ /* Copyright 2004 Renzo Davoli * Reseased under the GPLv2 */ +#define _GNU_SOURCE #include #include #include @@ -34,10 +35,11 @@ int main(int argc,char *argv[]) int result,nx; register int i; struct vde_open_args open_args={.port=0,.group=NULL,.mode=0700}; + char *descr; /*printf("argc = %d\n",argc); for (i=0;i