diff --git a/src/box/iproto.cc b/src/box/iproto.cc index 42bc3102230253197903e2a22e91f9286d4da5ab..d2a84af638373a1052908581a8ce52db6d687879 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -2565,11 +2565,12 @@ net_send_greeting(struct cmsg *m) * Create a connection and start input. */ static int -iproto_on_accept(struct evio_service *service, int fd, +iproto_on_accept(struct evio_service *service, const struct uri *uri, int fd, struct sockaddr *addr, socklen_t addrlen) { - (void) addr; - (void) addrlen; + (void)uri; + (void)addr; + (void)addrlen; struct iproto_msg *msg; struct iproto_thread *iproto_thread = diff --git a/src/lib/core/coio.c b/src/lib/core/coio.c index 844f394971101850a389882672f519e736524004..2729d5afe6f4913d6e0f00a91057fce9ab7ae680 100644 --- a/src/lib/core/coio.c +++ b/src/lib/core/coio.c @@ -40,6 +40,7 @@ #include "iostream.h" #include "sio.h" #include "coio_task.h" /* coio_resolve() */ +#include "uri/uri.h" typedef void (*ev_stat_cb)(ev_loop *, ev_stat *, int); @@ -469,9 +470,10 @@ coio_writev_timeout(struct iostream *io, struct iovec *iov, int iovcnt, } static int -coio_service_on_accept(struct evio_service *evio_service, +coio_service_on_accept(struct evio_service *evio_service, const struct uri *uri, int fd, struct sockaddr *addr, socklen_t addrlen) { + (void)uri; struct coio_service *service = (struct coio_service *) evio_service->on_accept_param; diff --git a/src/lib/core/coio.h b/src/lib/core/coio.h index 4ca4760d6bdbadb970ef971d01568e3bd1824d62..6849f43aee30b498c7e4aefe79d6ae0202de921f 100644 --- a/src/lib/core/coio.h +++ b/src/lib/core/coio.h @@ -41,6 +41,7 @@ extern "C" { struct iostream; struct sockaddr; +struct uri_set; /** * Co-operative I/O diff --git a/src/lib/core/evio.c b/src/lib/core/evio.c index fe83c098b7dcedd24642502f00b237553ca9790c..9c463d1be4b9e562337f7b7c2adf3eb352d8db58 100644 --- a/src/lib/core/evio.c +++ b/src/lib/core/evio.c @@ -38,11 +38,11 @@ #include <trivia/util.h> #include "exception.h" +#include "uri/uri.h" struct evio_service_entry { - /** Bind host:service, useful for logging */ - char host[URI_MAXHOST]; - char serv[URI_MAXSERVICE]; + /** Bind URI */ + struct uri uri; /** Interface/port to bind to */ union { @@ -190,7 +190,7 @@ evio_service_entry_accept_cb(ev_loop *loop, ev_io *watcher, int events) if (evio_setsockopt_client(fd, entry->addr.sa_family, SOCK_STREAM) != 0) break; - if (entry->service->on_accept(entry->service, fd, + if (entry->service->on_accept(entry->service, &entry->uri, fd, (struct sockaddr *)&addr, addrlen) != 0) break; @@ -301,6 +301,7 @@ evio_service_entry_create(struct evio_service_entry *entry, struct evio_service *service) { memset(entry, 0, sizeof(struct evio_service_entry)); + uri_create(&entry->uri, NULL); /* * Initialize libev objects to be able to detect if they * are active or not in evio_service_entry_stop(). @@ -317,18 +318,17 @@ evio_service_entry_create(struct evio_service_entry *entry, static int evio_service_entry_bind(struct evio_service_entry *entry, const struct uri *u) { - entry->serv[0] = entry->host[0] = '\0'; assert(u->service != NULL); - strlcpy(entry->serv, u->service, sizeof(entry->serv)); - if (u->host != NULL && strcmp(u->host, "*") != 0) - strlcpy(entry->host, u->host, sizeof(entry->host)); - assert(! ev_is_active(&entry->ev)); + assert(!ev_is_active(&entry->ev)); - if (strcmp(entry->host, URI_HOST_UNIX) == 0) { + uri_destroy(&entry->uri); + uri_copy(&entry->uri, u); + + if (u->host != NULL && strcmp(u->host, URI_HOST_UNIX) == 0) { /* UNIX domain socket */ struct sockaddr_un *un = (struct sockaddr_un *) &entry->addr; entry->addr_len = sizeof(*un); - strlcpy(un->sun_path, entry->serv, sizeof(un->sun_path)); + strlcpy(un->sun_path, u->service, sizeof(un->sun_path)); un->sun_family = AF_UNIX; return evio_service_entry_bind_addr(entry); } @@ -340,9 +340,8 @@ evio_service_entry_bind(struct evio_service_entry *entry, const struct uri *u) hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE|AI_ADDRCONFIG; - /* make no difference between empty string and NULL for host */ - if (getaddrinfo(*entry->host ? entry->host : NULL, entry->serv, - &hints, &res) != 0 || res == NULL) { + if (getaddrinfo(u->host, u->service, &hints, &res) != 0 || + res == NULL) { diag_set(SocketError, sio_socketname(-1), "can't resolve uri for bind"); return -1; @@ -373,6 +372,7 @@ evio_service_entry_detach(struct evio_service_entry *entry) entry->addr_len = 0; } ev_io_set(&entry->ev, -1, 0); + uri_destroy(&entry->uri); } /** It's safe to stop a service entry which is not started yet. */ @@ -401,8 +401,8 @@ evio_service_entry_attach(struct evio_service_entry *dst, const struct evio_service_entry *src) { assert(!ev_is_active(&dst->ev)); - strcpy(dst->host, src->host); - strcpy(dst->serv, src->serv); + uri_destroy(&dst->uri); + uri_copy(&dst->uri, &src->uri); dst->addrstorage = src->addrstorage; dst->addr_len = src->addr_len; ev_io_set(&dst->ev, src->ev.fd, EV_READ); diff --git a/src/lib/core/evio.h b/src/lib/core/evio.h index 0266737f52556d16298717fdaec8a0495d5fcd51..53fd1fabdb9239798d954339a1f0c6d90093e084 100644 --- a/src/lib/core/evio.h +++ b/src/lib/core/evio.h @@ -37,7 +37,6 @@ #include <stdbool.h> #include "tarantool_ev.h" #include "sio.h" -#include "uri/uri.h" #if defined(__cplusplus) extern "C" { @@ -64,9 +63,12 @@ extern "C" { */ struct evio_service_entry; struct evio_service; +struct uri; +struct uri_set; -typedef int (*evio_accept_f)(struct evio_service *, int, struct sockaddr *, - socklen_t); +typedef int (*evio_accept_f)(struct evio_service *service, + const struct uri *uri, int fd, + struct sockaddr *addr, socklen_t addrlen); struct evio_service { /** Total count of services */