Update copyright dates
[src/app-framework-binder.git] / src / afb-ws-client.c
index e1d3277..d1cea8c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016, 2017 "IoT.bzh"
+ * Copyright (C) 2015-2020 "IoT.bzh"
  * Author: José Bollo <jose.bollo@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,7 @@
 #include <fcntl.h>
 
 #include "afb-wsj1.h"
+#include "fdev-systemd.h"
 
 /**************** WebSocket handshake ****************************/
 
@@ -320,6 +321,7 @@ struct afb_wsj1 *afb_ws_client_connect_wsj1(struct sd_event *eloop, const char *
        const char *path;
        struct addrinfo hint, *rai, *iai;
        struct afb_wsj1 *result;
+       struct fdev *fdev;
 
        /* scan the uri */
        rc = parse_uri(uri, &host, &service, &path);
@@ -354,10 +356,13 @@ struct afb_wsj1 *afb_ws_client_connect_wsj1(struct sd_event *eloop, const char *
                        if (rc == 0) {
                                rc = negociate(fd, proto_json1, path, xhost);
                                if (rc == 0) {
-                                       result = afb_wsj1_create(eloop, fd, itf, closure);
-                                       if (result != NULL) {
-                                               fcntl(fd, F_SETFL, O_NONBLOCK);
-                                               break;
+                                       fdev = fdev_systemd_create(eloop, fd);
+                                       if (fdev) {
+                                               result = afb_wsj1_create(fdev, itf, closure);
+                                               if (result != NULL) {
+                                                       fcntl(fd, F_SETFL, O_NONBLOCK);
+                                                       break;
+                                               }
                                        }
                                }
                        }
@@ -438,12 +443,12 @@ static int get_socket_inet(const char *uri)
        struct addrinfo hint, *rai, *iai;
 
        /* scan the uri */
-       api = strrchr(uri, '/');
        service = strrchr(uri, ':');
-       if (api == NULL || service == NULL || api < service) {
+       if (service == NULL) {
                errno = EINVAL;
                return -1;
        }
+       api = strchrnul(service, '/');
        host = strndupa(uri, service++ - uri);
        service = strndupa(service, api - service);
 
@@ -483,6 +488,9 @@ static int get_socket(const char *uri)
        if (0 == strncmp(uri, "unix:", 5))
                /* unix socket */
                fd = get_socket_unix(uri + 5);
+       else if (0 == strncmp(uri, "tcp:", 4))
+               /* unix socket */
+               fd = get_socket_inet(uri + 4);
        else
                /* inet socket */
                fd = get_socket_inet(uri);
@@ -494,27 +502,30 @@ static int get_socket(const char *uri)
        }
        return fd;
 }
+
 /*
  * Establish a websocket-like client connection to the API of 'uri' and if successful
- * instanciate a client afb_proto_ws websocket for this API using 'itf' and 'closure'.
+ * instantiate a client afb_proto_ws websocket for this API using 'itf' and 'closure'.
  * (see afb_proto_ws_create_client).
  * The systemd event loop 'eloop' is used to handle the websocket.
- * Returns NULL in case of failure with errno set appriately.
+ * Returns NULL in case of failure with errno set appropriately.
  */
 struct afb_proto_ws *afb_ws_client_connect_api(struct sd_event *eloop, const char *uri, struct afb_proto_ws_client_itf *itf, void *closure)
 {
        int fd;
        struct afb_proto_ws *pws;
+       struct fdev *fdev;
 
        fd = get_socket(uri);
        if (fd >= 0) {
-               pws = afb_proto_ws_create_client(eloop, fd, itf, closure);
-               if (pws)
-                       return pws;
+               fdev = fdev_systemd_create(eloop, fd);
+               if (fdev) {
+                       pws = afb_proto_ws_create_client(fdev, itf, closure);
+                       if (pws)
+                               return pws;
+               }
                close(fd);
        }
        return NULL;
 }
 
-
-