To introduce some application protocols like WebSocket, this patch allows to 
substitute connection establishment and termination. In combination with 
previous patch, both connection and transmission can be replaced.

usbip_connection_operations_t includes open and close operation. Open method 
returns usbip_sock_t which includes send, receive and close method. Then, 
transmission methods are replaced at the same time. 

Succeeding WebSocket patch uses this feature.

Signed-off-by: Nobuo Iwata <nobuo.iw...@fujixerox.co.jp>
---
 tools/usb/usbip/libsrc/usbip_common.c  | 10 ++++++++++
 tools/usb/usbip/libsrc/usbip_common.h  | 11 +++++++++++
 tools/usb/usbip/src/usbip.c            |  1 +
 tools/usb/usbip/src/usbip_attach.c     |  6 +++---
 tools/usb/usbip/src/usbip_connect.c    |  6 +++---
 tools/usb/usbip/src/usbip_disconnect.c |  6 +++---
 tools/usb/usbip/src/usbip_list.c       |  6 +++---
 tools/usb/usbip/src/usbip_network.c    |  9 +++++++--
 tools/usb/usbip/src/usbip_network.h    |  3 +--
 9 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/tools/usb/usbip/libsrc/usbip_common.c 
b/tools/usb/usbip/libsrc/usbip_common.c
index dc0712c..54efa10 100644
--- a/tools/usb/usbip/libsrc/usbip_common.c
+++ b/tools/usb/usbip/libsrc/usbip_common.c
@@ -297,3 +297,13 @@ void usbip_sock_init(usbip_sock_t *sock, int fd, void *arg,
        sock->shutdown = shutdown;
 }
 
+usbip_connection_operations_t usbip_conn_ops = {NULL, NULL};
+
+void usbip_conn_init(
+       usbip_sock_t *(*open)(char *host, char *port),
+       void (*close)(usbip_sock_t *sock))
+{
+       usbip_conn_ops.open = open;
+       usbip_conn_ops.close = close;
+}
+
diff --git a/tools/usb/usbip/libsrc/usbip_common.h 
b/tools/usb/usbip/libsrc/usbip_common.h
index 0dcbd99..07c411f 100644
--- a/tools/usb/usbip/libsrc/usbip_common.h
+++ b/tools/usb/usbip/libsrc/usbip_common.h
@@ -148,4 +148,15 @@ void usbip_sock_init(usbip_sock_t *sock, int fd, void *arg,
        ssize_t (*recv)(void *arg, void *buf, size_t len, int wait_all),
        void (*shutdown)(void *arg));
 
+typedef struct usbip_connection_operations {
+       usbip_sock_t *(*open)(char *host, char *port);
+       void (*close)(usbip_sock_t *sock);
+} usbip_connection_operations_t;
+
+extern usbip_connection_operations_t usbip_conn_ops;
+
+void usbip_conn_init(
+       usbip_sock_t *(*open)(char *host, char *port),
+       void (*close)(usbip_sock_t *sock));
+
 #endif /* __USBIP_COMMON_H */
diff --git a/tools/usb/usbip/src/usbip.c b/tools/usb/usbip/src/usbip.c
index e743d82..cc83455a 100644
--- a/tools/usb/usbip/src/usbip.c
+++ b/tools/usb/usbip/src/usbip.c
@@ -251,6 +251,7 @@ int main(int argc, char *argv[])
                                argc -= optind;
                                argv += optind;
                                optind = 0;
+                               usbip_net_tcp_conn_init();
                                rc = run_command(&cmds[i], argc, argv);
                                goto out;
                        }
diff --git a/tools/usb/usbip/src/usbip_attach.c 
b/tools/usb/usbip/src/usbip_attach.c
index fe037de..e1c298e 100644
--- a/tools/usb/usbip/src/usbip_attach.c
+++ b/tools/usb/usbip/src/usbip_attach.c
@@ -135,7 +135,7 @@ static int attach_device(char *host, char *busid)
        int rc;
        int rhport;
 
-       sock = usbip_net_tcp_connect(host, usbip_port_string);
+       sock = usbip_conn_ops.open(host, usbip_port_string);
        if (!sock) {
                err("tcp connect");
                goto err0;
@@ -164,13 +164,13 @@ static int attach_device(char *host, char *busid)
                usbip_ux_join(ux);
        }
        usbip_ux_cleanup(&ux);
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 
        return 0;
 err2:
        usbip_ux_cleanup(&ux);
 err1:
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 err0:
        return -1;
 }
diff --git a/tools/usb/usbip/src/usbip_connect.c 
b/tools/usb/usbip/src/usbip_connect.c
index 4511990..ae8104b 100644
--- a/tools/usb/usbip/src/usbip_connect.c
+++ b/tools/usb/usbip/src/usbip_connect.c
@@ -150,7 +150,7 @@ static int connect_device(char *host, char *busid)
                goto err0;
        }
 
-       sock = usbip_net_tcp_connect(host, usbip_port_string);
+       sock = usbip_conn_ops.open(host, usbip_port_string);
        if (!sock) {
                err("tcp connect");
                goto err1;
@@ -174,13 +174,13 @@ static int connect_device(char *host, char *busid)
                usbip_unbind_device(busid);
        }
        usbip_ux_cleanup(&ux);
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 
        return 0;
 err3:
        usbip_ux_cleanup(&ux);
 err2:
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 err1:
        usbip_unbind_device(busid);
 err0:
diff --git a/tools/usb/usbip/src/usbip_disconnect.c 
b/tools/usb/usbip/src/usbip_disconnect.c
index 8da1717..1bda962 100644
--- a/tools/usb/usbip/src/usbip_disconnect.c
+++ b/tools/usb/usbip/src/usbip_disconnect.c
@@ -136,7 +136,7 @@ static int disconnect_device(char *host, char *busid)
        usbip_sock_t *sock;
        int rc;
 
-       sock = usbip_net_tcp_connect(host, usbip_port_string);
+       sock = usbip_conn_ops.open(host, usbip_port_string);
        if (!sock) {
                err("tcp connect");
                return -1;
@@ -145,11 +145,11 @@ static int disconnect_device(char *host, char *busid)
        rc = unexport_device(busid, sock);
        if (rc < 0) {
                err("unexport");
-               usbip_net_tcp_close(sock);
+               usbip_conn_ops.close(sock);
                return -1;
        }
 
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 
        if (!usbip_ux_installed()) {
                rc = usbip_unbind_device(busid);
diff --git a/tools/usb/usbip/src/usbip_list.c b/tools/usb/usbip/src/usbip_list.c
index b62a6df..9fb0bb9 100644
--- a/tools/usb/usbip/src/usbip_list.c
+++ b/tools/usb/usbip/src/usbip_list.c
@@ -133,7 +133,7 @@ static int list_importable_devices(char *host)
        int rc;
        usbip_sock_t *sock;
 
-       sock = usbip_net_tcp_connect(host, usbip_port_string);
+       sock = usbip_conn_ops.open(host, usbip_port_string);
        if (!sock) {
                err("could not connect to %s:%s: %s", host,
                    usbip_port_string, gai_strerror(sock->fd));
@@ -144,11 +144,11 @@ static int list_importable_devices(char *host)
        rc = get_importable_devices(host, sock);
        if (rc < 0) {
                err("failed to get device list from %s", host);
-               usbip_net_tcp_close(sock);
+               usbip_conn_ops.close(sock);
                return -1;
        }
 
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 
        return 0;
 }
diff --git a/tools/usb/usbip/src/usbip_network.c 
b/tools/usb/usbip/src/usbip_network.c
index 39ed18c..f65d27d 100644
--- a/tools/usb/usbip/src/usbip_network.c
+++ b/tools/usb/usbip/src/usbip_network.c
@@ -287,7 +287,7 @@ int usbip_net_set_v6only(int sockfd)
 /*
  * IPv6 Ready
  */
-usbip_sock_t *usbip_net_tcp_connect(char *hostname, char *service)
+static usbip_sock_t *net_tcp_open(char *hostname, char *service)
 {
        struct addrinfo hints, *res, *rp;
        int sockfd;
@@ -362,7 +362,7 @@ usbip_sock_t *usbip_net_tcp_connect(char *hostname, char 
*service)
        return sock;
 }
 
-void usbip_net_tcp_close(usbip_sock_t *sock)
+static void net_tcp_close(usbip_sock_t *sock)
 {
 #ifdef USE_SSL
        if (usbip_use_ssl) {
@@ -374,3 +374,8 @@ void usbip_net_tcp_close(usbip_sock_t *sock)
        free(sock);
 }
 
+void usbip_net_tcp_conn_init(void)
+{
+       usbip_conn_init(net_tcp_open, net_tcp_close);
+}
+
diff --git a/tools/usb/usbip/src/usbip_network.h 
b/tools/usb/usbip/src/usbip_network.h
index 3f7d0d3..45fa0bb 100644
--- a/tools/usb/usbip/src/usbip_network.h
+++ b/tools/usb/usbip/src/usbip_network.h
@@ -184,7 +184,6 @@ int usbip_net_set_reuseaddr(int sockfd);
 int usbip_net_set_nodelay(int sockfd);
 int usbip_net_set_keepalive(int sockfd);
 int usbip_net_set_v6only(int sockfd);
-usbip_sock_t *usbip_net_tcp_connect(char *hostname, char *port);
-void usbip_net_tcp_close(usbip_sock_t *sock);
+void usbip_net_tcp_conn_init(void);
 
 #endif /* __USBIP_NETWORK_H */
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to