X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fapp-framework-binder.git;a=blobdiff_plain;f=src%2Fafb-ws-client.c;h=d1cea8c71d06defdd28b024fa3f68855b672b8de;hp=e1d3277e46ec9bbef45d08041d4836c915514ee6;hb=65353dce81a629e042800bb7b86fcd869a76727e;hpb=0033c7c16a48819447b3a5273ebb2be99be74352 diff --git a/src/afb-ws-client.c b/src/afb-ws-client.c index e1d3277e..d1cea8c7 100644 --- a/src/afb-ws-client.c +++ b/src/afb-ws-client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016, 2017 "IoT.bzh" + * Copyright (C) 2015-2020 "IoT.bzh" * Author: José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,6 +29,7 @@ #include #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; } - -