staging: usbip: rebased userspace patches
cover staging: usbip: rebased userspace patches
Hi greg,
Here are the patches that didn't apply rebased onto your staging-next branch. There were only three, but I have included a few other small patches.
Thanks,
matt
matt mooney (7):
staging: usbip: userspace: usbipd: major cleanup of daemon
staging: usbip: userspace: add new prefix for usbip network code
staging: usbip: userspace: fix header installation bug
staging: usbip: userspace: usbip_list.c: modify exportable device
output
staging: usbip: userspace: usbip: modify `list' help message
staging: usbip: userspace: README: update example output
staging: usbip: userspace: usbip-utils 1.1.1
drivers/staging/usbip/userspace/Makefile.am | 2 +- drivers/staging/usbip/userspace/README | 53 +- drivers/staging/usbip/userspace/configure.ac | 4 +- drivers/staging/usbip/userspace/libsrc/Makefile.am | 6 +- drivers/staging/usbip/userspace/src/Makefile.am | 6 +- drivers/staging/usbip/userspace/src/usbip.c | 2 +- drivers/staging/usbip/userspace/src/usbip_attach.c | 10 +- drivers/staging/usbip/userspace/src/usbip_list.c | 36 +- .../staging/usbip/userspace/src/usbip_network.c | 56 +- .../staging/usbip/userspace/src/usbip_network.h | 39 +- drivers/staging/usbip/userspace/src/usbipd.c | 695 ++++++++++---------- 11 files changed, 456 insertions(+), 453 deletions(-)
Signature · 1 line
1.7.6
PATCH 1/7 staging: usbip: userspace: usbipd: major cleanup of daemon
Reorganize, rename [for clarity and to remove stub_driver references], modify output messages, and cleanup coding style; nevertheless, the actual implementation is pretty much untouched.
--- drivers/staging/usbip/userspace/src/usbipd.c | 691 +++++++++++++------------- 1 files changed, 344 insertions(+), 347 deletions(-)
drivers/staging/usbip/userspace/src/usbipd.c +344 -347
@@ -1,6 +1,19 @@/* +* Copyright (C) 2011 matt mooney <[email protected]> +* 2005-2007 Takahiro Hirofuchi * -* Copyright (C) 2005-2007 Takahiro Hirofuchi +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifdef HAVE_CONFIG_H
@@ -31,62 +44,153 @@#include "usbip_common.h" #include "usbip_network.h" -static const char version[] =PACKAGE_STRING ; +#undef PROGNAME +#define PROGNAME "usbipd" +#define MAXSOCKFD 20 + +GMainLoop *main_loop; -static int send_reply_devlist (int sockfd) +static const char usbip_version_string[] =PACKAGE_STRING ; + +static const char usbipd_help_string[] = +"usage: usbipd [options] \n" +" -D, --daemon \n" +" Run as a daemon process. \n" +" \n" +" -d, --debug \n" +" Print debugging information. \n" +" \n" +" -h, --help \n" +" Print this help. \n" +" \n" +" -v, --version \n" +" Show version. \n" ; + +static void usbipd_help (void ) { -int ret; +printf ("%s\n" , usbipd_help_string); +} + +static int recv_request_import (int sockfd) +{ +struct op_import_request req; +struct op_common reply;struct usbip_exported_device *edev; -struct op_devlist_reply reply; +struct usbip_usb_device pdu_udev; +int found =0 ; +int error =0 ; +int rc; +memset (&req,0 ,sizeof (req)); +memset (&reply,0 ,sizeof (reply)); - reply.ndev =0 ; + rc =usbip_recv (sockfd, &req,sizeof (req)); +if (rc <0 ) { +dbg ("usbip_recv failed: import request" ); +return -1 ; + } +PACK_OP_IMPORT_REQUEST (0 , &req); -/* how many devices are exported ? */ - dlist_for_each_data(host_driver->edev_list, edev, struct usbip_exported_device) { - reply.ndev +=1 ; +dlist_for_each_data (host_driver->edev_list, edev, + struct usbip_exported_device) { +if (!strncmp (req.busid, edev->udev.busid,SYSFS_BUS_ID_SIZE )) { +info ("found requested device: %s" , req.busid); + found =1 ; +break ; + } } -dbg ("%d devices are exported" , reply.ndev); +if (found) { +/* should set TCP_NODELAY for usbip */ +usbip_set_nodelay (sockfd); - ret =usbip_send_op_common (sockfd,OP_REP_DEVLIST ,ST_OK ); -if (ret <0 ) { -err ("send op_common" ); -return ret; +/* export device needs a TCP/IP socket descriptor */ + rc =usbip_host_export_device (edev, sockfd); +if (rc <0 ) + error =1 ; + }else { +info ("requested device not found: %s" , req.busid); + error =1 ; } -PACK_OP_DEVLIST_REPLY (1 , &reply); - ret =usbip_send (sockfd, (void *) &reply,sizeof (reply)); -if (ret <0 ) { -err ("send op_devlist_reply" ); -return ret; + rc =usbip_send_op_common (sockfd,OP_REP_IMPORT , + (!error ?ST_OK :ST_NA )); +if (rc <0 ) { +dbg ("usbip_send_op_common failed: %#0x" ,OP_REP_IMPORT ); +return -1 ; + } + +if (error) { +dbg ("import request busid %s: failed" , req.busid); +return -1 ; + } + +memcpy (&pdu_udev, &edev->udev,sizeof (pdu_udev)); +pack_usb_device (1 , &pdu_udev); + + rc =usbip_send (sockfd, &pdu_udev,sizeof (pdu_udev)); +if (rc <0 ) { +dbg ("usbip_send failed: devinfo" ); +return -1 ; } - dlist_for_each_data(host_driver->edev_list, edev, struct usbip_exported_device) { -struct usbip_usb_device pdu_udev; +dbg ("import request busid %s: complete" , req.busid); + +return 0 ; +} +static int send_reply_devlist (int connfd) +{ +struct usbip_exported_device *edev; +struct usbip_usb_device pdu_udev; +struct usbip_usb_interface pdu_uinf; +struct op_devlist_reply reply; +int i; +int rc; + + reply.ndev =0 ; +/* number of exported devices */ +dlist_for_each_data (host_driver->edev_list, edev, + struct usbip_exported_device) { + reply.ndev +=1 ; + } +info ("exportable devices: %d" , reply.ndev); + + rc =usbip_send_op_common (connfd,OP_REP_DEVLIST ,ST_OK ); +if (rc <0 ) { +dbg ("usbip_send_op_common failed: %#0x" ,OP_REP_DEVLIST ); +return -1 ; + } +PACK_OP_DEVLIST_REPLY (1 , &reply); + + rc =usbip_send (connfd, &reply,sizeof (reply)); +if (rc <0 ) { +dbg ("usbip_send failed: %#0x" ,OP_REP_DEVLIST ); +return -1 ; + } + +dlist_for_each_data (host_driver->edev_list, edev, + struct usbip_exported_device) {dump_usb_device (&edev->udev);memcpy (&pdu_udev, &edev->udev,sizeof (pdu_udev));pack_usb_device (1 , &pdu_udev); - ret =usbip_send (sockfd, (void *) &pdu_udev,sizeof (pdu_udev)); -if (ret <0 ) { -err ("send pdu_udev" ); -return ret; + rc =usbip_send (connfd, &pdu_udev,sizeof (pdu_udev)); +if (rc <0 ) { +dbg ("usbip_send failed: pdu_udev" ); +return -1 ; } -for (int i=0 ; i < edev->udev.bNumInterfaces; i++) { -struct usbip_usb_interface pdu_uinf; - +for (i =0 ; i < edev->udev.bNumInterfaces; i++) {dump_usb_interface (&edev->uinf[i]);memcpy (&pdu_uinf, &edev->uinf[i],sizeof (pdu_uinf));pack_usb_interface (1 , &pdu_uinf); - ret =usbip_send (sockfd, (void *) &pdu_uinf,sizeof (pdu_uinf)); -if (ret <0 ) { -err ("send pdu_uinf" ); -return ret; + rc =usbip_send (connfd, &pdu_uinf,sizeof (pdu_uinf)); +if (rc <0 ) { +dbg ("usbip_send failed: pdu_uinf" ); +return -1 ; } } }
@@ -94,283 +198,227 @@ static int send_reply_devlist(int sockfd)return 0 ; } - -static int recv_request_devlist (int sockfd) +static int recv_request_devlist (int connfd) { -int ret;struct op_devlist_request req; +int rc;memset (&req,0 ,sizeof (req)); - ret =usbip_recv (sockfd, (void *) &req,sizeof (req)); -if (ret <0 ) { -err ("recv devlist request" ); + rc =usbip_recv (connfd, &req,sizeof (req)); +if (rc <0 ) { +dbg ("usbip_recv failed: devlist request" );return -1 ; } - ret =send_reply_devlist (sockfd); -if (ret <0 ) { -err ("send devlist reply" ); + rc =send_reply_devlist (connfd); +if (rc <0 ) { +dbg ("send_reply_devlist failed" );return -1 ; }return 0 ; } - -static int recv_request_import (int sockfd) +static int recv_pdu (int connfd) { +uint16_t code =OP_UNSPEC ;int ret; -struct op_import_request req; -struct op_common reply; -struct usbip_exported_device *edev; -int found =0 ; -int error =0 ; -memset (&req,0 ,sizeof (req)); -memset (&reply,0 ,sizeof (reply)); - - ret =usbip_recv (sockfd, (void *) &req,sizeof (req)); + ret =usbip_recv_op_common (connfd, &code);if (ret <0 ) { -err ("recv import request" ); +dbg ("could not receive opcode: %#0x" , code);return -1 ; } -PACK_OP_IMPORT_REQUEST (0 , &req); - - dlist_for_each_data(host_driver->edev_list, edev, struct usbip_exported_device) { -if (!strncmp (req.busid, edev->udev.busid,SYSFS_BUS_ID_SIZE )) { -dbg ("found requested device %s" , req.busid); - found =1 ; -break ; - } + ret =usbip_host_refresh_device_list (); +if (ret <0 ) { +dbg ("could not refresh device list: %d" , ret); +return -1 ; } -if (found) { -/* should set TCP_NODELAY for usbip */ -usbip_set_nodelay (sockfd); - -/* export_device needs a TCP/IP socket descriptor */ - ret =usbip_host_export_device (edev, sockfd); -if (ret <0 ) - error =1 ; - }else { -info ("not found requested device %s" , req.busid); - error =1 ; +info ("received request: %#0x(%d)" , code, connfd); +switch (code) { +case OP_REQ_DEVLIST : + ret =recv_request_devlist (connfd); +break ; +case OP_REQ_IMPORT : + ret =recv_request_import (connfd); +break ; +case OP_REQ_DEVINFO : +case OP_REQ_CRYPKEY : +default : +err ("received an unknown opcode: %#0x" , code); + ret =-1 ; } +if (ret ==0 ) +info ("request %#0x(%d): complete" , code, connfd); +else +info ("request %#0x(%d): failed" , code, connfd); - ret =usbip_send_op_common (sockfd,OP_REP_IMPORT , (!error ?ST_OK :ST_NA )); -if (ret <0 ) { -err ("send import reply" ); -return -1 ; - } - -if (!error) { -struct usbip_usb_device pdu_udev; +return ret; +} -memcpy (&pdu_udev, &edev->udev,sizeof (pdu_udev)); -pack_usb_device (1 , &pdu_udev); +#ifdef HAVE_LIBWRAP +static int tcpd_auth (int connfd) +{ +struct request_info request; +int rc; - ret =usbip_send (sockfd, (void *) &pdu_udev,sizeof (pdu_udev)); -if (ret <0 ) { -err ("send devinfo" ); -return -1 ; - } - } +request_init (&request,RQ_DAEMON ,PROGNAME ,RQ_FILE , connfd,0 ); +fromhost (&request); + rc =hosts_access (&request); +if (rc ==0 ) +return -1 ;return 0 ; } +#endif - - -static int recv_pdu (int sockfd) +static int do_accept (int listenfd) { -int ret; -uint16_t code =OP_UNSPEC ; +int connfd; +struct sockaddr_storage ss; +socklen_t len =sizeof (ss); +char host[NI_MAXHOST ], port[NI_MAXSERV ]; +int rc; +memset (&ss,0 ,sizeof (ss)); - ret =usbip_recv_op_common (sockfd, &code); -if (ret <0 ) { -err ("recv op_common, %d" , ret); -return ret; + connfd =accept (listenfd, (struct sockaddr *) &ss, &len); +if (connfd <0 ) { +err ("failed to accept connection" ); +return -1 ; } + rc =getnameinfo ((struct sockaddr *) &ss, len, host,sizeof (host), + port,sizeof (port),NI_NUMERICHOST |NI_NUMERICSERV ); +if (rc) +err ("getnameinfo: %s" ,gai_strerror (rc)); - ret =usbip_host_refresh_device_list (); -if (ret <0 ) +#ifdef HAVE_LIBWRAP + rc =tcpd_auth (connfd); +if (rc <0 ) { +info ("denied access from %s" , host); +close (connfd);return -1 ; + } +#endif +info ("connection from %s:%s" , host, port); -switch (code) { -case OP_REQ_DEVLIST : - ret =recv_request_devlist (sockfd); -break ; +return connfd; +} -case OP_REQ_IMPORT : - ret =recv_request_import (sockfd); -break ; +gboolean process_request (GIOChannel *gio,GIOCondition condition, +gpointer unused_data) +{ +int listenfd; +int connfd; -case OP_REQ_DEVINFO : -case OP_REQ_CRYPKEY : + (void ) unused_data; -default : -err ("unknown op_code, %d" , code); - ret =-1 ; +if (condition & (G_IO_ERR |G_IO_HUP |G_IO_NVAL )) { +err ("unknown condition" ); +BUG (); } +if (condition &G_IO_IN ) { + listenfd =g_io_channel_unix_get_fd (gio); + connfd =do_accept (listenfd); +if (connfd <0 ) +return TRUE; -return ret; -} - - +recv_pdu (connfd); +close (connfd); + } +return TRUE; +}static void log_addrinfo (struct addrinfo *ai) { -int ret;char hbuf[NI_MAXHOST ];char sbuf[NI_MAXSERV ]; +int rc; - ret =getnameinfo (ai->ai_addr, ai->ai_addrlen, hbuf,sizeof (hbuf), - sbuf,sizeof (sbuf),NI_NUMERICHOST |NI_NUMERICSERV ); -if (ret) -err ("getnameinfo, %s" ,gai_strerror (ret)); - -info ("listen at [%s]:%s" , hbuf, sbuf); -} - -static struct addrinfo *my_getaddrinfo (char *host,int ai_family) -{ -int ret; -struct addrinfo hints, *ai_head; - -memset (&hints,0 ,sizeof (hints)); - - hints.ai_family = ai_family; - hints.ai_socktype =SOCK_STREAM ; - hints.ai_flags =AI_PASSIVE ; - - ret =getaddrinfo (host,USBIP_PORT_STRING , &hints, &ai_head); -if (ret) { -err ("%s: %s" ,USBIP_PORT_STRING ,gai_strerror (ret)); -return NULL ; - } + rc =getnameinfo (ai->ai_addr, ai->ai_addrlen, hbuf,sizeof (hbuf), + sbuf,sizeof (sbuf),NI_NUMERICHOST |NI_NUMERICSERV ); +if (rc) +err ("getnameinfo: %s" ,gai_strerror (rc)); -return ai_head; +info ("listening on %s:%s" , hbuf, sbuf); } -#define MAXSOCK 20 -static int listen_all_addrinfo (struct addrinfo *ai_head,int lsock[]) +static int listen_all_addrinfo (struct addrinfo *ai_head,int sockfdlist[]) {struct addrinfo *ai; -int n =0 ;/* number of sockets */ - -for (ai = ai_head; ai && n <MAXSOCK ; ai = ai->ai_next) { -int ret; +int ret, nsockfd =0 ; - lsock[n] =socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); -if (lsock[n] <0 ) +for (ai = ai_head; ai && nsockfd <MAXSOCKFD ; ai = ai->ai_next) { + sockfdlist[nsockfd] =socket (ai->ai_family, ai->ai_socktype, + ai->ai_protocol); +if (sockfdlist[nsockfd] <0 )continue ; -usbip_set_reuseaddr (lsock[n]); -usbip_set_nodelay (lsock[n]); +usbip_set_reuseaddr (sockfdlist[nsockfd]); +usbip_set_nodelay (sockfdlist[nsockfd]); -if (lsock[n] >=FD_SETSIZE ) { -close (lsock[n]); - lsock[n] =-1 ; +if (sockfdlist[nsockfd] >=FD_SETSIZE ) { +close (sockfdlist[nsockfd]); + sockfdlist[nsockfd] =-1 ;continue ; } - ret =bind (lsock[n], ai->ai_addr, ai->ai_addrlen); + ret =bind (sockfdlist[nsockfd], ai->ai_addr, ai->ai_addrlen);if (ret <0 ) { -close (lsock[n]); - lsock[n] =-1 ; +close (sockfdlist[nsockfd]); + sockfdlist[nsockfd] =-1 ;continue ; } - ret =listen (lsock[n],SOMAXCONN ); + ret =listen (sockfdlist[nsockfd],SOMAXCONN );if (ret <0 ) { -close (lsock[n]); - lsock[n] =-1 ; +close (sockfdlist[nsockfd]); + sockfdlist[nsockfd] =-1 ;continue ; }log_addrinfo (ai); - -/* next if succeed */ - n++; + nsockfd++; } -if (n ==0 ) { -err ("no socket to listen to" ); +if (nsockfd ==0 )return -1 ; - } - -dbg ("listen %d address%s" , n, (n==1 )?"" :"es" ); - -return n; -} - -#ifdef HAVE_LIBWRAP -static int tcpd_auth (int csock) -{ -int ret; -struct request_info request; - -request_init (&request,RQ_DAEMON ,"usbipd" ,RQ_FILE , csock,0 ); - -fromhost (&request); - ret =hosts_access (&request); -if (!ret) -return -1 ; +dbg ("listening on %d address%s" , nsockfd, (nsockfd ==1 ) ?"" :"es" ); -return 0 ; +return nsockfd; } -#endif -static int my_accept (int lsock) +static struct addrinfo *do_getaddrinfo (char *host,int ai_family) { -int csock; -struct sockaddr_storage ss; -socklen_t len =sizeof (ss); -char host[NI_MAXHOST ], port[NI_MAXSERV ]; -int ret; - -memset (&ss,0 ,sizeof (ss)); - - csock =accept (lsock, (struct sockaddr *) &ss, &len); -if (csock <0 ) { -err ("accept" ); -return -1 ; - } +struct addrinfo hints, *ai_head; +int rc; - ret =getnameinfo ((struct sockaddr *) &ss, len, - host,sizeof (host), port,sizeof (port), - (NI_NUMERICHOST |NI_NUMERICSERV )); -if (ret) -err ("getnameinfo, %s" ,gai_strerror (ret)); +memset (&hints,0 ,sizeof (hints)); + hints.ai_family = ai_family; + hints.ai_socktype =SOCK_STREAM ; + hints.ai_flags =AI_PASSIVE ; -#ifdef HAVE_LIBWRAP - ret =tcpd_auth (csock); -if (ret <0 ) { -info ("deny access from %s" , host); -close (csock); -return -1 ; + rc =getaddrinfo (host,USBIP_PORT_STRING , &hints, &ai_head); +if (rc) { +err ("failed to get a network address %s: %s" ,USBIP_PORT_STRING , +gai_strerror (rc)); +return NULL ; } -#endif -info ("connected from %s:%s" , host, port); - -return csock; +return ai_head; } - -GMainLoop *main_loop; -static void signal_handler (int i) { -dbg ("signal catched, code %d" , i); +dbg ("received signal: code %d" , i);if (main_loop)g_main_loop_quit (main_loop);
@@ -387,184 +435,133 @@ static void set_signal(void)sigaction (SIGINT , &act,NULL ); } - -gboolean process_comming_request (GIOChannel *gio,GIOCondition condition, -gpointer data __attribute__((unused))) -{ -int ret; - -if (condition & (G_IO_ERR |G_IO_HUP |G_IO_NVAL )) -g_error ("unknown condition" ); - - -if (condition &G_IO_IN ) { -int lsock; -int csock; - - lsock =g_io_channel_unix_get_fd (gio); - - csock =my_accept (lsock); -if (csock <0 ) -return TRUE; - - ret =recv_pdu (csock); -if (ret <0 ) -err ("process received pdu" ); - -close (csock); - } - -return TRUE; -} - - -static void do_standalone_mode (gboolean daemonize) +static int do_standalone_mode (gboolean daemonize) { -int ret; -int lsock[MAXSOCK ];struct addrinfo *ai_head; -int n; +int sockfdlist[MAXSOCKFD ]; +int nsockfd; +int i; +if (usbip_names_init (USBIDS_FILE )) +err ("failed to open %s" ,USBIDS_FILE ); - - ret =usbip_names_init (USBIDS_FILE ); -if (ret) -err ("open usb.ids" ); - - ret =usbip_host_driver_open (); -if (ret <0 ) -g_error ("driver open failed" ); +if (usbip_host_driver_open ()) { +err ("please load " USBIP_CORE_MOD_NAME ".ko and " +USBIP_HOST_DRV_NAME ".ko!" ); +return -1 ; + }if (daemonize) { -if (daemon (0 ,0 ) <0 ) -g_error ("daemonizing failed: %s" ,g_strerror (errno)); +if (daemon (0 ,0 ) <0 ) { +err ("daemonizing failed: %s" ,strerror (errno)); +return -1 ; + } usbip_use_syslog =1 ; } -set_signal (); - ai_head =my_getaddrinfo (NULL ,PF_UNSPEC ); + ai_head =do_getaddrinfo (NULL ,PF_UNSPEC );if (!ai_head) -return ; +return -1 ; - n =listen_all_addrinfo (ai_head, lsock); -if (n <=0 ) -g_error ("no socket to listen to" ); +info ("starting " PROGNAME " (%s)" , usbip_version_string); -for (int i =0 ; i < n; i++) { + nsockfd =listen_all_addrinfo (ai_head, sockfdlist); +if (nsockfd <=0 ) { +err ("failed to open a listening socket" ); +return -1 ; + } + +for (i =0 ; i < nsockfd; i++) {GIOChannel *gio; - gio =g_io_channel_unix_new (lsock[i]); + gio =g_io_channel_unix_new (sockfdlist[i]);g_io_add_watch (gio, (G_IO_IN |G_IO_ERR |G_IO_HUP |G_IO_NVAL ), - process_comming_request,NULL ); + process_request,NULL ); } - -info ("usbipd start (%s)" , version); - - main_loop =g_main_loop_new (FALSE, FALSE);g_main_loop_run (main_loop); -info ("shutdown" ); +info ("shutting down " PROGNAME );freeaddrinfo (ai_head); -usbip_names_free ();usbip_host_driver_close (); +usbip_names_free (); -return ; -} - - -static const char help_message[] ="\ -Usage: usbipd [options] \n\ --D, --daemon \n\ -Run as a daemon process. \n\ -\n\ --d, --debug \n\ -Print debugging information. \n\ -\n\ --v, --version \n\ -Show version. \n\ -\n\ --h, --help \n\ -Print this help. \n" ; - -static void show_help (void ) -{ -printf ("%s" , help_message); +return 0 ; } -static const struct option longopts[] = { - {"daemon" , no_argument,NULL ,'D' }, - {"debug" , no_argument,NULL ,'d' }, - {"version" , no_argument,NULL ,'v' }, - {"help" , no_argument,NULL ,'h' }, - {NULL ,0 ,NULL ,0 } -}; -int main (int argc,char *argv[]) { -gboolean daemonize = FALSE; +static const struct option longopts[] = { + {"daemon" , no_argument,NULL ,'D' }, + {"debug" , no_argument,NULL ,'d' }, + {"help" , no_argument,NULL ,'h' }, + {"version" , no_argument,NULL ,'v' }, + {NULL ,0 ,NULL ,0 } + };enum { cmd_standalone_mode =1 , cmd_help, cmd_version - } cmd = cmd_standalone_mode; + } cmd; +gboolean daemonize = FALSE; +int opt, rc =-1 ; usbip_use_stderr =1 ; usbip_use_syslog =0 ;if (geteuid () !=0 ) -g_warning ("running non-root?" ); +err ("not running as root?" ); + cmd = cmd_standalone_mode;for (;;) { -int c; -int index =0 ; + opt =getopt_long (argc, argv,"Ddhv" , longopts,NULL ); - c =getopt_long (argc, argv,"vhdD" , longopts, &index); - -if (c ==-1 ) +if (opt ==-1 )break ; -switch (c) { -case 'd' : - usbip_use_debug =1 ; -continue ; -case 'v' : - cmd = cmd_version; -break ; -case 'h' : - cmd = cmd_help; -break ; -case 'D' : - daemonize = TRUE; -break ; -case '?' : -show_help (); -exit (EXIT_FAILURE ); -default : -err ("getopt" ); - } - } - -switch (cmd) { -case cmd_standalone_mode: -do_standalone_mode (daemonize); +switch (opt) { +case 'D' : + daemonize = TRUE; +break ; +case 'd' : + usbip_use_debug =1 ;break ; -case cmd_version: -printf ("%s\n" , version); +case 'h' : + cmd = cmd_help;break ; -case cmd_help: -show_help (); +case 'v' : + cmd = cmd_version;break ; +case '?' : +usbipd_help ();default : -info ("unknown cmd" ); -show_help (); + goto err_out; + } } -return 0 ; +switch (cmd) { +case cmd_standalone_mode: + rc =do_standalone_mode (daemonize); +break ; +case cmd_version: +printf (PROGNAME " (%s)\n" , usbip_version_string); + rc =0 ; +break ; +case cmd_help: +usbipd_help (); + rc =0 ; +break ; +default : +usbipd_help (); + goto err_out; + } + +err_out: +return (rc >-1 ?EXIT_SUCCESS :EXIT_FAILURE ); }
Signature · 1 line
1.7.6
PATCH 2/7 staging: usbip: userspace: add new prefix for usbip network code
In reply to matt mooneyChange and add new usbip_net_ prefix to every function in the network code for easier identification.
--- drivers/staging/usbip/userspace/src/usbip_attach.c | 10 ++-- drivers/staging/usbip/userspace/src/usbip_list.c | 26 +++++---- .../staging/usbip/userspace/src/usbip_network.c | 56 ++++++++++--------- .../staging/usbip/userspace/src/usbip_network.h | 39 +++++++------- drivers/staging/usbip/userspace/src/usbipd.c | 50 +++++++++--------- 5 files changed, 92 insertions(+), 89 deletions(-)
drivers/staging/usbip/userspace/src/usbip_attach.c +5 -5
@@ -115,7 +115,7 @@ static int query_import_device(int sockfd, char *busid)memset (&reply,0 ,sizeof (reply));/* send a request */ - rc =usbip_send_op_common (sockfd,OP_REQ_IMPORT ,0 ); + rc =usbip_net_send_op_common (sockfd,OP_REQ_IMPORT ,0 );if (rc <0 ) {err ("send op_common" );return -1 ;
@@ -125,20 +125,20 @@ static int query_import_device(int sockfd, char *busid)PACK_OP_IMPORT_REQUEST (0 , &request); - rc =usbip_send (sockfd, (void *) &request,sizeof (request)); + rc =usbip_net_send (sockfd, (void *) &request,sizeof (request));if (rc <0 ) {err ("send op_import_request" );return -1 ; } -/* receive a reply */ - rc =usbip_recv_op_common (sockfd, &code); +/* recieve a reply */ + rc =usbip_net_recv_op_common (sockfd, &code);if (rc <0 ) {err ("recv op_common" );return -1 ; } - rc =usbip_recv (sockfd, (void *) &reply,sizeof (reply)); + rc =usbip_net_recv (sockfd, (void *) &reply,sizeof (reply));if (rc <0 ) {err ("recv op_import_reply" );return -1 ;
drivers/staging/usbip/userspace/src/usbip_list.c +14 -12
@@ -56,22 +56,22 @@ static int get_exported_devices(char *host, int sockfd)unsigned int i;int j, rc; - rc =usbip_send_op_common (sockfd,OP_REQ_DEVLIST ,0 ); + rc =usbip_net_send_op_common (sockfd,OP_REQ_DEVLIST ,0 );if (rc <0 ) { -dbg ("usbip_send_op_common failed" ); +dbg ("usbip_net_send_op_common failed" );return -1 ; } - rc =usbip_recv_op_common (sockfd, &code); + rc =usbip_net_recv_op_common (sockfd, &code);if (rc <0 ) { -dbg ("usbip_recv_op_common failed" ); +dbg ("usbip_net_recv_op_common failed" );return -1 ; }memset (&reply,0 ,sizeof (reply)); - rc =usbip_recv (sockfd, &reply,sizeof (reply)); + rc =usbip_net_recv (sockfd, &reply,sizeof (reply));if (rc <0 ) { -dbg ("usbip_recv_op_devlist failed" ); +dbg ("usbip_net_recv_op_devlist failed" );return -1 ; }PACK_OP_DEVLIST_REPLY (0 , &reply);
@@ -88,12 +88,12 @@ static int get_exported_devices(char *host, int sockfd)for (i =0 ; i < reply.ndev; i++) {memset (&udev,0 ,sizeof (udev)); - rc =usbip_recv (sockfd, &udev,sizeof (udev)); + rc =usbip_net_recv (sockfd, &udev,sizeof (udev));if (rc <0 ) { -dbg ("usbip_recv failed: usbip_usb_device[%d]" , i); +dbg ("usbip_net_recv failed: usbip_usb_device[%d]" , i);return -1 ; } -pack_usb_device (0 , &udev); +usbip_net_pack_usb_device (0 , &udev);usbip_names_get_product (product_name,sizeof (product_name), udev.idVendor, udev.idProduct);
@@ -105,12 +105,14 @@ static int get_exported_devices(char *host, int sockfd)printf ("%8s: %s\n" ,"" , class_name);for (j =0 ; j < udev.bNumInterfaces; j++) { - rc =usbip_recv (sockfd, &uintf,sizeof (uintf)); + rc =usbip_net_recv (sockfd, &uintf,sizeof (uintf));if (rc <0 ) { -dbg ("usbip_recv failed: usbip_usb_intf[%d]" , j); +dbg ("usbip_net_recv failed: usbip_usb_intf[%d]" , + j); +return -1 ; } -pack_usb_interface (0 , &uintf); +usbip_net_pack_usb_interface (0 , &uintf); usbip_names_get_class(class_name, sizeof(class_name), uintf.bInterfaceClass,
drivers/staging/usbip/userspace/src/usbip_network.c +29 -27
139 lines not on this page · raw message
drivers/staging/usbip/userspace/src/usbip_network.h +19 -20
@@ -34,9 +34,9 @@ struct op_common { } __attribute__((packed));#define PACK_OP_COMMON (pack, op_common) do {\ - pack_uint16_t(pack, &(op_common)->version);\ - pack_uint16_t(pack, &(op_common)->code );\ - pack_uint32_t(pack, &(op_common)->status );\ + usbip_net_pack_uint16_t(pack, &(op_common)->version);\ + usbip_net_pack_uint16_t(pack, &(op_common)->code );\ + usbip_net_pack_uint32_t(pack, &(op_common)->status );\ } while (0)/* ---------------------------------------------------------------------- */
@@ -79,7 +79,7 @@ struct op_import_reply { } while (0)#define PACK_OP_IMPORT_REPLY (pack, reply) do {\ - pack_usb_device(pack, &(reply)->udev);\ + usbip_net_pack_usb_device(pack, &(reply)->udev);\ } while (0)/* ---------------------------------------------------------------------- */
@@ -98,7 +98,7 @@ struct op_export_reply {#define PACK_OP_EXPORT_REQUEST (pack, request) do {\ - pack_usb_device(pack, &(request)->udev);\ + usbip_net_pack_usb_device(pack, &(request)->udev);\ } while (0)#define PACK_OP_EXPORT_REPLY (pack, reply) do {\
@@ -119,7 +119,7 @@ struct op_unexport_reply { } __attribute__((packed));#define PACK_OP_UNEXPORT_REQUEST (pack, request) do {\ - pack_usb_device(pack, &(request)->udev);\ + usbip_net_pack_usb_device(pack, &(request)->udev);\ } while (0)#define PACK_OP_UNEXPORT_REPLY (pack, reply) do {\
@@ -164,22 +164,21 @@ struct op_devlist_reply_extra { } while (0)#define PACK_OP_DEVLIST_REPLY (pack, reply) do {\ - pack_uint32_t(pack, &(reply)->ndev);\ + usbip_net_pack_uint32_t(pack, &(reply)->ndev);\ } while (0) -void pack_uint32_t (int pack,uint32_t *num); -void pack_uint16_t (int pack,uint16_t *num); -void pack_usb_device (int pack,struct usbip_usb_device *udev); -void pack_usb_interface (int pack,struct usbip_usb_interface *uinf); - -ssize_t usbip_recv (int sockfd,void *buff,size_t bufflen); -ssize_t usbip_send (int sockfd,void *buff,size_t bufflen); -int usbip_send_op_common (int sockfd,uint32_t code,uint32_t status); -int usbip_recv_op_common (int sockfd,uint16_t *code); -int usbip_set_reuseaddr (int sockfd); -int usbip_set_nodelay (int sockfd); -int usbip_set_keepalive (int sockfd); - +void usbip_net_pack_uint32_t (int pack,uint32_t *num); +void usbip_net_pack_uint16_t (int pack,uint16_t *num); +void usbip_net_pack_usb_device (int pack,struct usbip_usb_device *udev); +void usbip_net_pack_usb_interface (int pack,struct usbip_usb_interface *uinf); + +ssize_t usbip_net_recv (int sockfd,void *buff,size_t bufflen); +ssize_t usbip_net_send (int sockfd,void *buff,size_t bufflen); +int usbip_net_send_op_common (int sockfd,uint32_t code,uint32_t status); +int usbip_net_recv_op_common (int sockfd,uint16_t *code); +int usbip_net_set_reuseaddr (int sockfd); +int usbip_net_set_nodelay (int sockfd); +int usbip_net_set_keepalive (int sockfd);int usbip_net_tcp_connect (char *hostname,char *port);#endif /* __USBIP_NETWORK_H */
drivers/staging/usbip/userspace/src/usbipd.c +25 -25
125 lines not on this page · raw message
Signature · 1 line
1.7.6
PATCH 3/7 staging: usbip: userspace: fix header installation bug
In reply to matt mooneyA bug that I created due to using simply expanding variables in the makefiles. Although only unexpanded paths are at issue here, I decided to use recursively expanding variables on all of the parameterized values.
--- drivers/staging/usbip/userspace/Makefile.am | 2 +- drivers/staging/usbip/userspace/libsrc/Makefile.am | 6 +++--- drivers/staging/usbip/userspace/src/Makefile.am | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-)
drivers/staging/usbip/userspace/Makefile.am +1 -1
@@ -1,5 +1,5 @@ SUBDIRS := libsrc src -includedir := @includedir@/usbip +includedir = @includedir@/usbip include_HEADERS := $(addprefix libsrc/, \ usbip_common.h vhci_driver.h usbip_host_driver.h)
drivers/staging/usbip/userspace/libsrc/Makefile.am +3 -3
@@ -1,6 +1,6 @@ -libusbip_la_CPPFLAGS := -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"' -libusbip_la_CFLAGS := @EXTRA_CFLAGS@ -libusbip_la_LDFLAGS := -version-info @LIBUSBIP_VERSION@ +libusbip_la_CPPFLAGS = -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"' +libusbip_la_CFLAGS = @EXTRA_CFLAGS@ +libusbip_la_LDFLAGS = -version-info @LIBUSBIP_VERSION@ lib_LTLIBRARIES := libusbip.la libusbip_la_SOURCES := names.c names.h usbip_host_driver.c usbip_host_driver.h \
drivers/staging/usbip/userspace/src/Makefile.am +3 -3
@@ -1,6 +1,6 @@ -AM_CPPFLAGS := -I$(top_srcdir)/libsrc -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"' -AM_CFLAGS := @EXTRA_CFLAGS@ @PACKAGE_CFLAGS@ -LDADD := $(top_builddir)/libsrc/libusbip.la @PACKAGE_LIBS@ +AM_CPPFLAGS = -I$(top_srcdir)/libsrc -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"' +AM_CFLAGS = @EXTRA_CFLAGS@ @PACKAGE_CFLAGS@ +LDADD = $(top_builddir)/libsrc/libusbip.la @PACKAGE_LIBS@ sbin_PROGRAMS := usbip usbipd
Signature · 1 line
1.7.6
PATCH 4/7 staging: usbip: userspace: usbip_list.c: modify exportable device output
In reply to matt mooneyChange spacing to provide better indentation for readability.
--- drivers/staging/usbip/userspace/src/usbip_list.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
drivers/staging/usbip/userspace/src/usbip_list.c +4 -4
@@ -100,9 +100,9 @@ static int get_exported_devices(char *host, int sockfd)usbip_names_get_class (class_name,sizeof (class_name), udev.bDeviceClass, udev.bDeviceSubClass, udev.bDeviceProtocol); -printf ("%8s: %s\n" , udev.busid, product_name); -printf ("%8s: %s\n" ,"" , udev.path); -printf ("%8s: %s\n" ,"" , class_name); +printf ("%11s: %s\n" , udev.busid, product_name); +printf ("%11s: %s\n" ,"" , udev.path); +printf ("%11s: %s\n" ,"" , class_name);for (j =0 ; j < udev.bNumInterfaces; j++) { rc =usbip_net_recv (sockfd, &uintf,sizeof (uintf));
@@ -118,7 +118,7 @@ static int get_exported_devices(char *host, int sockfd) uintf.bInterfaceClass, uintf.bInterfaceSubClass, uintf.bInterfaceProtocol); -printf ("%8s: %2d - %s\n" ,"" , j, class_name); +printf ("%11s: %2d - %s\n" ,"" , j, class_name); }printf ("\n" ); }
Signature · 1 line
1.7.6
PATCH 5/7 staging: usbip: userspace: usbip: modify `list' help message
In reply to matt mooneyThe remote devices listed are, technically, exportable and not necessarily exported.
--- drivers/staging/usbip/userspace/src/usbip.c | 2 +- drivers/staging/usbip/userspace/src/usbip_list.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/staging/usbip/userspace/src/usbip.c +1 -1
@@ -77,7 +77,7 @@ static const struct command cmds[] = { { .name = "list", .fn = usbip_list, - .help = "List exported or local USB devices", + .help = "List exportable or local USB devices", .usage = usbip_list_usage }, {
drivers/staging/usbip/userspace/src/usbip_list.c +1 -1
@@ -37,7 +37,7 @@static const char usbip_list_usage_string[] ="usbip list [-p|--parsable] <args>\n" " -p, --parsable Parsable list format\n" -" -r, --remote=<host> List the exported USB devices on <host>\n" +" -r, --remote=<host> List the exportable USB devices on <host>\n" " -l, --local List the local USB devices\n" ;void usbip_list_usage (void )
Signature · 1 line
1.7.6
PATCH 6/7 staging: usbip: userspace: README: update example output
In reply to matt mooneyChange a missed reference to the list' command, and update the output from usbip bind ...' and `usbip list -r ...'
--- drivers/staging/usbip/userspace/README | 53 +++++++++++++++++--------------- 1 files changed, 28 insertions(+), 25 deletions(-)
drivers/staging/usbip/userspace/README +28 -25
@@ -79,7 +79,7 @@ Physically attach your USB devices to this host. In another terminal, let's look up what USB devices are physically attached to this host. - trois:# usbip_bind_driver --list + trois:# usbip list -l Local USB devices ================= - busid 1-1 (05a9:a511)
@@ -115,8 +115,9 @@ Mark the device of busid 3-3.2 as exportable: trois:# usbip --debug bind --busid 3-3.2 ... - usbip dbg: utils.c: 52 (modify_match_busid) write "add 3-3.2" to... - usbip dbg: usbip_bind.c: 231 (use_device_by_usbip) bind 3-3.2 complete! + usbip debug: usbip_bind.c:162:[unbind_other] 3-3.2:1.0 -> usb-storage + ... + bind device on busid 3-3.2: complete trois:# usbip list -l Local USB devices
@@ -137,28 +138,30 @@ exportable on the host. deux:# insmod path/to/vhci-hcd.ko deux:# usbip list --remote 10.0.0.3 - - 10.0.0.3 - 1-1: Prolific Technology, Inc. : unknown product (067b:3507) - : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-1 - : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) - : 0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50) - - 1-2.2.1: Apple Computer, Inc. : unknown product (05ac:0203) - : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2.2/1-2.2.1 - : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) - : 0 - Human Interface Devices / Boot Interface Subclass / Keyboard (03/01/01) - - 1-2.2.3: OmniVision Technologies, Inc. : OV511+ WebCam (05a9:a511) - : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2.2/1-2.2.3 - : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) - : 0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00) - - 3-1: Logitech, Inc. : QuickCam Pro 4000 (046d:08b2) - : /sys/devices/pci0000:00/0000:00:1e.0/0000:02:0a.0/usb3/3-1 - : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) - : 0 - Data / unknown subclass / unknown protocol (0a/ff/00) - : 1 - Audio / Control Device / unknown protocol (01/01/00) - : 2 - Audio / Streaming / unknown protocol (01/02/00) + Exportable USB devices + ====================== + - 10.0.0.3 + 1-1: Prolific Technology, Inc. : unknown product (067b:3507) + : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-1 + : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) + : 0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50) + + 1-2.2.1: Apple Computer, Inc. : unknown product (05ac:0203) + : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2.2/1-2.2.1 + : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) + : 0 - Human Interface Devices / Boot Interface Subclass / Keyboard (03/01/01) + + 1-2.2.3: OmniVision Technologies, Inc. : OV511+ WebCam (05a9:a511) + : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2.2/1-2.2.3 + : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) + : 0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00) + + 3-1: Logitech, Inc. : QuickCam Pro 4000 (046d:08b2) + : /sys/devices/pci0000:00/0000:00:1e.0/0000:02:0a.0/usb3/3-1 + : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) + : 0 - Data / unknown subclass / unknown protocol (0a/ff/00) + : 1 - Audio / Control Device / unknown protocol (01/01/00) + : 2 - Audio / Streaming / unknown protocol (01/02/00) Attach a remote USB device:
Signature · 1 line
1.7.6
PATCH 7/7 staging: usbip: userspace: usbip-utils 1.1.1
In reply to matt mooneyBump package revision number!
--- drivers/staging/usbip/userspace/configure.ac | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/staging/usbip/userspace/configure.ac +2 -2
@@ -1,8 +1,8 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([usbip-utils], [1.1.0], [[email protected]]) -AC_DEFINE([USBIP_VERSION], [0x00000100], [binary-coded decimal version number]) +AC_INIT([usbip-utils], [1.1.1], [[email protected]]) +AC_DEFINE([USBIP_VERSION], [0x00000111], [binary-coded decimal version number]) CURRENT=0 REVISION=1
Signature · 1 line
1.7.6