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 9d1468f..505e384 100644
--- a/tools/usb/usbip/src/usbip.c
+++ b/tools/usb/usbip/src/usbip.c
@@ -202,6 +202,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 ae0ca6e..c67e3d2 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 err_out;
@@ -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;
 err_cleanup_ux:
        usbip_ux_cleanup(&ux);
 err_close_conn:
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 err_out:
        return -1;
 }
diff --git a/tools/usb/usbip/src/usbip_connect.c 
b/tools/usb/usbip/src/usbip_connect.c
index 5f9505c..8dabd0b 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 err_out;
        }
 
-       sock = usbip_net_tcp_connect(host, usbip_port_string);
+       sock = usbip_conn_ops.open(host, usbip_port_string);
        if (!sock) {
                err("tcp connect");
                goto err_unbind_device;
@@ -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;
 err_cleanup_ux:
        usbip_ux_cleanup(&ux);
 err_close_conn:
-       usbip_net_tcp_close(sock);
+       usbip_conn_ops.close(sock);
 err_unbind_device:
        usbip_unbind_device(busid);
 err_out:
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 cc86132..64f143a 100644
--- a/tools/usb/usbip/src/usbip_list.c
+++ b/tools/usb/usbip/src/usbip_list.c
@@ -132,7 +132,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, usbip_net_gai_strerror(sock->fd));
@@ -143,11 +143,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 7673e1a..8906d92 100644
--- a/tools/usb/usbip/src/usbip_network.c
+++ b/tools/usb/usbip/src/usbip_network.c
@@ -268,7 +268,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;
@@ -321,12 +321,17 @@ 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)
 {
        close(sock->fd);
        free(sock);
 }
 
+void usbip_net_tcp_conn_init(void)
+{
+       usbip_conn_init(net_tcp_open, net_tcp_close);
+}
+
 static const char *s_unknown_error = "?";
 
 const char *usbip_net_gai_strerror(int errcode)
diff --git a/tools/usb/usbip/src/usbip_network.h 
b/tools/usb/usbip/src/usbip_network.h
index f84775e..7d9327d 100644
--- a/tools/usb/usbip/src/usbip_network.h
+++ b/tools/usb/usbip/src/usbip_network.h
@@ -181,8 +181,7 @@ 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);
 const char *usbip_net_gai_strerror(int errcode);
 
 #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