> > From: Chen Hanxiao <chenhanxiao@xxxxxxxxx> > > We bind our listen address to in6addr_any, which may be > unsecure with multi network cards that belong to > internal or external networks. > > This patch introduces option -4 and -6 to bind a specific > address. > > Signed-off-by: Chen Hanxiao <chenhanxiao@xxxxxxxxx> > --- > v2: > replace strerror with perror > fix some copy-paste errors > > usbredirserver/usbredirserver.1 | 3 +- > usbredirserver/usbredirserver.c | 63 > ++++++++++++++++++++++++++++++++++------- > 2 files changed, 54 insertions(+), 12 deletions(-) > > diff --git a/usbredirserver/usbredirserver.1 > b/usbredirserver/usbredirserver.1 > index e857190..8bbce07 100644 > --- a/usbredirserver/usbredirserver.1 > +++ b/usbredirserver/usbredirserver.1 > @@ -3,7 +3,8 @@ > usbredirserver \- exporting an USB device for use from another (virtual) > machine > .SH SYNOPSIS > .B usbredirserver > -[\fI-p|--port <port>\fR] [\fI-v|--verbose <0-5>\fR] > \fI<busnum-devnum|vendorid:prodid>\fR > +[\fI-p|--port <port>\fR] [\fI-v|--verbose <0-5>\fR] [\fI-4 <ipv4_addr|I-6 > <ipv6_addr>] > +\fI<busnum-devnum|vendorid:prodid>\fR > .SH DESCRIPTION > usbredirserver is a small standalone server for exporting an USB device for > use from another (virtual) machine through the usbredir protocol. > diff --git a/usbredirserver/usbredirserver.c > b/usbredirserver/usbredirserver.c > index 13965dc..e2841b2 100644 > --- a/usbredirserver/usbredirserver.c > +++ b/usbredirserver/usbredirserver.c > @@ -36,6 +36,7 @@ > #include <sys/time.h> > #include <netdb.h> > #include <netinet/in.h> > +#include <arpa/inet.h> > #include "usbredirhost.h" > > > @@ -49,6 +50,8 @@ static struct usbredirhost *host; > static const struct option longopts[] = { > { "port", required_argument, NULL, 'p' }, > { "verbose", required_argument, NULL, 'v' }, > + { "ipv4", required_argument, NULL, '4' }, > + { "ipv6", required_argument, NULL, '6' }, > { "help", no_argument, NULL, 'h' }, > { NULL, 0, NULL, 0 } > }; > @@ -93,7 +96,9 @@ static int usbredirserver_write(void *priv, uint8_t *data, > int count) > static void usage(int exit_code, char *argv0) > { > fprintf(exit_code? stderr:stdout, > - "Usage: %s [-p|--port <port>] [-v|--verbose <0-5>] > <busnum-devnum|vendorid:prodid>\n", > + "Usage: %s [-p|--port <port>] [-v|--verbose <0-5>] " > + "[[-4|--ipv4 ipaddr]|[-6|--ipv6 ipaddr]] " > + "<busnum-devnum|vendorid:prodid>\n", > argv0); > exit(exit_code); > } > @@ -198,11 +203,13 @@ int main(int argc, char *argv[]) > int usbvendor = -1; > int usbproduct = -1; > int on = 1; > + char *ipv4_addr = NULL, *ipv6_addr = NULL; > + struct sockaddr_in serveraddr4; > struct sockaddr_in6 serveraddr; Would not be better to have a sort of union { struct sockaddr_in v4; struct sockaddr_in6 v6; } serveraddr; Here? This would allow some code to be reused (like memset and bind part). > struct sigaction act; > libusb_device_handle *handle = NULL; > > - while ((o = getopt_long(argc, argv, "hp:v:", longopts, NULL)) != -1) { > + while ((o = getopt_long(argc, argv, "hp:v:4:6:", longopts, NULL)) != -1) > { > switch (o) { > case 'p': > port = strtol(optarg, &endptr, 10); > @@ -218,6 +225,12 @@ int main(int argc, char *argv[]) > usage(1, argv[0]); > } > break; > + case '4': > + ipv4_addr = optarg; > + break; > + case '6': > + ipv6_addr = optarg; > + break; > case '?': > case 'h': > usage(o == '?', argv[0]); > @@ -272,9 +285,13 @@ int main(int argc, char *argv[]) > > libusb_set_debug(ctx, verbose); > > - server_fd = socket(AF_INET6, SOCK_STREAM, 0); > + if (ipv4_addr) { > + server_fd = socket(AF_INET, SOCK_STREAM, 0); > + } else { > + server_fd = socket(AF_INET6, SOCK_STREAM, 0); > + } > if (server_fd == -1) { > - perror("Error creating ipv6 socket"); > + perror("Error creating ip socket"); > exit(1); > } > > @@ -283,14 +300,38 @@ int main(int argc, char *argv[]) > exit(1); > } > > - memset(&serveraddr, 0, sizeof(serveraddr)); > - serveraddr.sin6_family = AF_INET6; > - serveraddr.sin6_port = htons(port); > - serveraddr.sin6_addr = in6addr_any; > + if (ipv4_addr) { > + memset(&serveraddr4, 0, sizeof(serveraddr4)); > + serveraddr4.sin_family = AF_INET; > + serveraddr4.sin_port = htons(port); > + if ((inet_pton(AF_INET, ipv4_addr, &serveraddr4.sin_addr)) != 1) { > + perror("Error convert ipv4 address"); > + exit(1); > + } > > - if (bind(server_fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) > { > - fprintf(stderr, "Error binding port %d: %s\n", port, > strerror(errno)); > - exit(1); > + if (bind(server_fd, (struct sockaddr *)&serveraddr4, > + sizeof(serveraddr4))) { > + perror("Error bind"); > + exit(1); > + } > + } else { > + memset(&serveraddr, 0, sizeof(serveraddr)); > + serveraddr.sin6_family = AF_INET6; > + serveraddr.sin6_port = htons(port); > + if (ipv6_addr) { > + if ((inet_pton(AF_INET6, ipv6_addr, &serveraddr.sin6_addr)) != > 1) { > + perror("Error convert ipv6 address"); > + exit(1); > + } > + } else { > + serveraddr.sin6_addr = in6addr_any; > + } > + > + if (bind(server_fd, (struct sockaddr *)&serveraddr, > + sizeof(serveraddr))) { > + perror("Error bind"); > + exit(1); > + } > } > > if (listen(server_fd, 1)) { Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel