Revision: 439
          http://vde.svn.sourceforge.net/vde/?rev=439&view=rev
Author:   rd235
Date:     2010-08-04 14:42:59 +0000 (Wed, 04 Aug 2010)

Log Message:
-----------
stream mgmt to libvdeplug_dyn and vde_plug2tap added

Modified Paths:
--------------
    trunk/vde-2/include/libvdeplug_dyn.h
    trunk/vde-2/man/vde_plug2tap.1
    trunk/vde-2/src/vde_plug2tap.c

Modified: trunk/vde-2/include/libvdeplug_dyn.h
===================================================================
--- trunk/vde-2/include/libvdeplug_dyn.h        2010-07-25 18:32:30 UTC (rev 
438)
+++ trunk/vde-2/include/libvdeplug_dyn.h        2010-08-04 14:42:59 UTC (rev 
439)
@@ -58,9 +58,11 @@
 #define LIBVDEPLUG_INTERFACE_VERSION 1
 
 struct vdeconn;
-
 typedef struct vdeconn VDECONN;
 
+struct vdestream;
+typedef struct vdestream VDESTREAM;
+
 /* Open a VDE connection.
  * vde_open_options:
  *   port: connect to a specific port of the switch (0=any)
@@ -89,12 +91,27 @@
        int (* vde_datafd)(VDECONN *conn);
        int (* vde_ctlfd)(VDECONN *conn);
        int (* vde_close)(VDECONN *conn);
+       VDESTREAM * (* vdestream_open)(void *opaque, int fdout,
+                       ssize_t (* frecv)(void *opaque, void *buf, size_t 
count),
+                       void (* ferr)(void *opaque, int type, char *format, ...)
+                       );
+       ssize_t (* vdestream_send)(VDESTREAM *vdestream, const void *buf, 
size_t len);
+       void (* vdestream_recv)(VDESTREAM *vdestream, unsigned char *buf, 
size_t len);
+       void (* vdestream_close)(VDESTREAM *vdestream);
 };
 
 typedef VDECONN * (* VDE_OPEN_REAL_T)(const char *vde_switch,char *descr,int 
interface_version, struct vde_open_args *open_args);
 typedef size_t (* VDE_RECV_T)(VDECONN *conn,void *buf,size_t len,int flags);
 typedef size_t (* VDE_SEND_T)(VDECONN *conn,const void *buf,size_t len,int 
flags);
 typedef int (* VDE_INT_FUN)(VDECONN *conn);
+typedef VDESTREAM * (* VDESTREAM_OPEN_T)(void *opaque, int fdout,
+                       ssize_t (* frecv)(void *opaque, void *buf, size_t 
count),
+                       void (* ferr)(void *opaque, int type, char *format, ...)
+                       );              
+typedef ssize_t (* VDESTREAM_SEND_T)(VDESTREAM *vdestream, const void *buf, 
size_t len);
+typedef void (* VDESTREAM_RECV_T)(VDESTREAM *vdestream, unsigned char *buf, 
size_t len);
+typedef void (* VDESTREAM_CLOSE_T)(VDESTREAM *vdestream);
+
 #define libvdeplug_dynopen(x) ({ \
        (x).dl_handle=dlopen("libvdeplug.so",RTLD_NOW); \
        if ((x).dl_handle) { \
@@ -104,11 +121,19 @@
                (x).vde_datafd=(VDE_INT_FUN) dlsym((x).dl_handle,"vde_datafd"); 
\
                (x).vde_ctlfd=(VDE_INT_FUN) dlsym((x).dl_handle,"vde_ctlfd"); \
                (x).vde_close=(VDE_INT_FUN) dlsym((x).dl_handle,"vde_close"); \
+               (x).vdestream_open=(VDESTREAM_OPEN_T) 
dlsym((x).dl_handle,"vdestream_open"); \
+               (x).vdestream_send=(VDESTREAM_SEND_T) 
dlsym((x).dl_handle,"vdestream_send"); \
+               (x).vdestream_recv=(VDESTREAM_RECV_T) 
dlsym((x).dl_handle,"vdestream_recv"); \
+               (x).vdestream_close=(VDESTREAM_CLOSE_T) 
dlsym((x).dl_handle,"vdestream_close"); \
                } else { \
                (x).vde_open_real=NULL; \
                (x).vde_send= NULL; \
                (x).vde_recv= NULL; \
                (x).vde_datafd= (x).vde_ctlfd= (x).vde_close= NULL; \
+               (x).vdestream_open= NULL; \
+               (x).vdestream_send= NULL; \
+               (x).vdestream_recv= NULL; \
+               (x).vdestream_close= NULL; \
                }\
                })
 

Modified: trunk/vde-2/man/vde_plug2tap.1
===================================================================
--- trunk/vde-2/man/vde_plug2tap.1      2010-07-25 18:32:30 UTC (rev 438)
+++ trunk/vde-2/man/vde_plug2tap.1      2010-08-04 14:42:59 UTC (rev 439)
@@ -11,6 +11,13 @@
 All the data that is catched by the plug is sent to the tap interface 
 .I tap_name 
 and everything from that interface is injected in the switch.
+.br
+Example:
+.in +2
+.B vde_plug2tap tap4
+.in -2
+.br
+connects the default switch (/var/run/vde.ctl) to the tap4 interface.
 
 .SH OPTIONS
 .TP
@@ -35,7 +42,16 @@
 .TP
 \fB\-s\fP, \fB\-\-sock\fP=\fIsocket\fP
 specify the UNIX socket to be used by local programs for joining the VDE.
-The default value is "/tmp/vde.ctl".
+The default value is "/var/run/vde.ctl".
+When '-' is used in place of the VDE switch directory, \fBvde_plug2tap\fP
+works as a plug (see vde_plug(1)).
+The command:
+.br
+.in +2
+.B dpipe vde_plug = ssh remote.machine.org vde_plug2tap -s - tapx
+.in -2
+.br
+connects the default local switch to a remote tapx interface.
 .TP
 \fB\-d\fP, \fB\-\-daemon\fP
 start vde_plug2tap as a background process

Modified: trunk/vde-2/src/vde_plug2tap.c
===================================================================
--- trunk/vde-2/src/vde_plug2tap.c      2010-07-25 18:32:30 UTC (rev 438)
+++ trunk/vde-2/src/vde_plug2tap.c      2010-08-04 14:42:59 UTC (rev 439)
@@ -1,5 +1,7 @@
 /* Copyright 2006 Renzo Davoli 
  * from vde_plug Davoli Gardenghi
+ * Modified 2010 Renzo Davoli, vdestream added
+ * Licensed under the GPLv2
  */
 
 #include <stdio.h>
@@ -50,6 +52,7 @@
 #endif
 
 VDECONN *conn;
+VDESTREAM *vdestream;
 
 char *prog;
 int logok;
@@ -78,7 +81,10 @@
                printlog(LOG_WARNING,"Couldn't remove pidfile '%s': %s", 
pidfile, strerror(errno));
        }
 
-       vde_close(conn);
+       if (vdestream != NULL)
+               vdestream_close(vdestream);
+       if (conn != NULL)
+               vde_close(conn);
 }
 
 static void sig_handler(int sig)
@@ -128,8 +134,6 @@
                        perror("Setting handler");
 }
 
-struct pollfd 
pollv[]={{0,POLLIN|POLLHUP},{0,POLLIN|POLLHUP},{0,POLLIN|POLLHUP}};
-
 static void usage(void) {
        fprintf(stderr, "Usage: %s [OPTION]... tap_name\n\n", prog);
        fprintf(stderr, "  -p, --port=portnum          Port number in the VDE 
switch\n"
@@ -227,6 +231,12 @@
        fclose(f);
 }
 
+static ssize_t vde_plug2tap_recv(void *opaque, void *buf, size_t count)
+{
+       int *tapfdp=opaque;
+       return write(*tapfdp,buf,count);
+}
+
 int main(int argc, char **argv)
 {
        static char *sockname=NULL;
@@ -237,6 +247,11 @@
        register ssize_t nx;
        struct vde_open_args open_args={.port=0,.group=NULL,.mode=0700};
        int c;
+       static struct pollfd pollv[]={{0,POLLIN|POLLHUP},
+               {0,POLLIN|POLLHUP},
+               {0,POLLIN|POLLHUP}};
+       int npollv;
+
        prog=argv[0];
        while (1) {
                int option_index = 0;
@@ -324,18 +339,27 @@
        tapfd=open_tap(tapname);
        if(tapfd<0)
                exit(1);
-       conn=vde_open(sockname,"vde_plug:",&open_args);
-       if (conn == NULL)
-               exit(1);
-
        pollv[0].fd=tapfd;
-       pollv[1].fd=vde_datafd(conn);
-       pollv[2].fd=vde_ctlfd(conn);
 
+       if (sockname==NULL || strcmp(sockname,"-") != 0) {
+               conn=vde_open(sockname,"vde_plug:",&open_args);
+               if (conn == NULL)
+                       exit(1);
+               pollv[1].fd=vde_datafd(conn);
+               pollv[2].fd=vde_ctlfd(conn);
+               npollv=3;
+       } else {
+               
vdestream=vdestream_open(&tapfd,STDOUT_FILENO,vde_plug2tap_recv,NULL);
+               if (vdestream == NULL)
+                       exit(1);
+               pollv[1].fd=STDIN_FILENO;
+               npollv=2;
+       }
+
        for(;;) {
                result=poll(pollv,3,-1);
                if ((pollv[0].revents | pollv[1].revents | pollv[2].revents) & 
POLLHUP ||
-                               pollv[2].revents & POLLIN) 
+                               (npollv > 2 && pollv[2].revents & POLLIN)) 
                        break;
                if (pollv[0].revents & POLLIN) {
                        nx=read(tapfd,bufin,sizeof(bufin));
@@ -344,13 +368,23 @@
                        //fprintf(stderr,"%s: RECV %d %x %x 
\n",prog,nx,bufin[0],bufin[1]);
                        if (nx<=0)
                                break;
-                       vde_send(conn,bufin,nx,0);
+                       if (conn != NULL)
+                               vde_send(conn,bufin,nx,0);
+                       else
+                               vdestream_send(vdestream, bufin, nx);
                }
                if (pollv[1].revents & POLLIN) {
-                       nx=vde_recv(conn,bufin,sizeof(bufin),0);
-                       if (nx<=0)
-                               break;
-                       write(tapfd,bufin,nx);
+                       if (conn != NULL) {
+                               nx=vde_recv(conn,bufin,sizeof(bufin),0);
+                               if (nx<=0)
+                                       break;
+                               write(tapfd,bufin,nx);
+                       } else {
+                               nx=read(STDIN_FILENO,bufin,sizeof(bufin));
+                               if (nx<=0)
+                                       break;
+                               vdestream_recv(vdestream,bufin,nx);
+                       }
                        //fprintf(stderr,"%s: SENT %d %x %x 
\n",prog,nx,bufin[0],bufin[1]);
                }
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share
of $1 Million in cash or HP Products. Visit us here for more details:
http://p.sf.net/sfu/dev2dev-palm
_______________________________________________
vde-users mailing list
vde-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vde-users

Reply via email to