rendered paste bodydiff -x CVS -x .svn -x 'Makefile*' -Nu /home/matteo/src/virtual-square-svn/vde_svn/slirpvde/misc.c ./misc.c--- /home/matteo/src/virtual-square-svn/vde_svn/slirpvde/misc.c 2007-11-11 19:24:10.000000000 +0100+++ ./misc.c 2007-11-11 04:41:24.000000000 +0100@@ -78,6 +78,20 @@ lprint("Redirection failed: %s\r\n", strerror(errno)); } +void redir_udp(inaddr, port, lport)+ u_int32_t inaddr;+ int port;+ int lport;+{+ struct socket *so;++ if ((so=udp_listen(htons(lport), inaddr, htons(port), 0)) != NULL) {+ lprint("Redirecting UDP port %d to %s:%d\r\n",+ ntohs(so->so_fport), inet_ntoa(so->so_laddr), port);+ } else+ lprint("Redirection failed: %s\r\n", strerror(errno));+}+ #ifndef HAVE_INET_ATON int inet_aton(cp, ia)diff -x CVS -x .svn -x 'Makefile*' -Nu /home/matteo/src/virtual-square-svn/vde_svn/slirpvde/misc.h ./misc.h--- /home/matteo/src/virtual-square-svn/vde_svn/slirpvde/misc.h 2007-11-11 19:24:10.000000000 +0100+++ ./misc.h 2007-11-11 03:46:36.000000000 +0100@@ -72,6 +72,7 @@ int show_x _P((void)); void redir_x _P((u_int32_t, int, int, int)); void redir_tcp _P((u_int32_t, int, int));+void redir_udp _P((u_int32_t, int, int)); void getouraddr _P((void)); inline void slirp_insque _P((void *, void *));diff -x CVS -x .svn -x 'Makefile*' -Nu /home/matteo/src/virtual-square-svn/vde_svn/slirpvde/slirpvde.c ./slirpvde.c--- /home/matteo/src/virtual-square-svn/vde_svn/slirpvde/slirpvde.c 2007-11-11 19:24:10.000000000 +0100+++ ./slirpvde.c 2007-11-11 19:35:17.000000000 +0100@@ -214,6 +214,13 @@ struct redirtcp *next; }; +struct redirudp {+ u_int32_t inaddr;+ int port;+ int lport;+ struct redirudp *next;+};+ static struct redirtcp *parse_redir_tcp(struct redirtcp *head, char *buff) { u_int32_t inaddr=0;@@ -259,6 +266,51 @@ } } +static struct redirudp *parse_redir_udp(struct redirudp *head, char *buff)+{+ u_int32_t inaddr=0; // OK+ int port=0; // OK+ int lport=0; // OK+ char *ipaddrstr=NULL; // OK+ char *portstr=NULL; // OK+ struct redirudp *new; ++ if ((ipaddrstr = strchr(buff, ':'))) {+ *ipaddrstr++ = 0;+ if (*ipaddrstr == 0) {+ fprintf(stderr,"redir UDP syntax error\n");+ return head;+ }+ }+ if ((portstr = strchr(ipaddrstr, ':'))) {+ *portstr++ = 0;+ if (*portstr == 0) {+ fprintf(stderr,"redir UDP syntax error\n");+ return head;+ }+ }++ sscanf(buff,"%d",&lport);+ sscanf(portstr,"%d",&port);+ if (ipaddrstr) + inaddr = inet_addr(ipaddrstr);++ if (!inaddr) {+ fprintf(stderr,"UDP redirection error: an IP address must be specified\r\n");+ return head;+ }++ if ((new=malloc(sizeof(struct redirudp)))==NULL)+ return head;+ else {+ new->inaddr=inaddr;+ new->port=port;+ new->lport=lport;+ new->next=head;+ return new;+ }+}+ static struct redirx *parse_redir_x(struct redirx *head, char *buff) { char *ptr=NULL;@@ -328,6 +380,15 @@ } } +static void do_redir_udp(struct redirudp *head)+{+ if (head) {+ do_redir_udp(head->next);+ redir_udp(head->inaddr,head->port,head->lport);+ free(head);+ }+}+ static void do_redir_x(struct redirx *head) { if (head) {@@ -344,8 +405,8 @@ "\t [-L host_port:guest_addr:guest_port] [-X guest_addr[:display[.screen]]] \n" "\t [-x portno:unix_socket_path]\n" " %s [-s vdesock] [-D] [-d] [-n netaddr]\n"- "\t [-L host_port:guest_addr:guest_port] [-X guest_addr[:display[.screen]]] \n" - "\t [-x portno:unix_socket_path]\n"+ "\t [-T host_tcp_port:guest_addr:guest_tcp_port] [-U host_udp_port:guest_addr:guest_udp_port]\n"+ "\t [-X guest_addr[:display[.screen]]] [-x portno:unix_socket_path]\n" ,name,name); exit(-1); }@@ -373,14 +434,15 @@ fd_set rs,ws,xs; int opt,longindx; char *netw=NULL;- int daemonize=0;- struct redirtcp *rtcp=NULL;- struct redirx *rx=NULL;- struct vde_open_args open_args={.port=0,.group=NULL,.mode=0700};+ int daemonize=0;+ struct redirtcp *rtcp=NULL;+ struct redirudp *rudp=NULL;+ struct redirx *rx=NULL;+ struct vde_open_args open_args={.port=0,.group=NULL,.mode=0700}; prog=basename(argv[0]); - while ((opt=GETOPT_LONG(argc,argv,"s:n:p:g:m:L:X:x:dD",slirpvdeopts,&longindx)) > 0) {+ while ((opt=GETOPT_LONG(argc,argv,"s:n:p:g:m:T:U:X:x:dD",slirpvdeopts,&longindx)) > 0) { switch (opt) { case 's' : sockname=optarg; break;@@ -398,8 +460,10 @@ break; case 'P' : open_args.port=atoi(optarg); break;- case 'L': rtcp=parse_redir_tcp(rtcp,optarg);+ case 'T': rtcp=parse_redir_tcp(rtcp,optarg); break;+ case 'U': rudp=parse_redir_udp(rudp, optarg);+ break; case 'X': rx=parse_redir_x(rx,optarg); break; case 'x': parse_redir_locx(optarg);@@ -431,6 +495,7 @@ slirp_init(netw); do_redir_tcp(rtcp);+ do_redir_udp(rudp); do_redir_x(rx); for(;;) {