X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-socket.c;h=485fae5b65d1b7b611472504a461962ff5440506;hb=13a5afe7dbd698b2d85212cf4275858a1734a49e;hp=f4ee7e1e6c3601050cd551386620c0e694c50748;hpb=efd6d20aee652b5868090e11504a7ba163a09ee3;p=src%2Fapp-framework-binder.git diff --git a/src/afb-socket.c b/src/afb-socket.c index f4ee7e1e..485fae5b 100644 --- a/src/afb-socket.c +++ b/src/afb-socket.c @@ -158,14 +158,14 @@ static int open_unix(const char *spec, int server) * * @return the file descriptor number of the socket or -1 in case of error */ -static int open_tcp(const char *spec, int server) +static int open_tcp(const char *spec, int server, int reuseaddr) { int rc, fd; const char *service, *host, *tail; struct addrinfo hint, *rai, *iai; /* scan the uri */ - tail = strchr(spec, '/'); + tail = strchrnul(spec, '/'); service = strchr(spec, ':'); if (tail == NULL || service == NULL || tail < service) { errno = EINVAL; @@ -178,6 +178,11 @@ static int open_tcp(const char *spec, int server) memset(&hint, 0, sizeof hint); hint.ai_family = AF_INET; hint.ai_socktype = SOCK_STREAM; + if (server) { + hint.ai_flags = AI_PASSIVE; + if (host[0] == 0 || (host[0] == '*' && host[1] == 0)) + host = NULL; + } rc = getaddrinfo(host, service, &hint, &rai); if (rc != 0) { errno = EINVAL; @@ -190,6 +195,10 @@ static int open_tcp(const char *spec, int server) fd = socket(iai->ai_family, iai->ai_socktype, iai->ai_protocol); if (fd >= 0) { if (server) { + if (reuseaddr) { + rc = 1; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &rc, sizeof rc); + } rc = bind(fd, iai->ai_addr, iai->ai_addrlen); } else { rc = connect(fd, iai->ai_addr, iai->ai_addrlen); @@ -262,7 +271,7 @@ static struct entry *get_entry(const char *uri, int *offset) */ static int open_uri(const char *uri, int server) { - int fd, rc, offset; + int fd, offset; struct entry *e; const char *api; @@ -281,7 +290,7 @@ static int open_uri(const char *uri, int server) fd = open_unix(uri, server); break; case Type_Inet: - fd = open_tcp(uri, server); + fd = open_tcp(uri, server, !e->noreuseaddr); break; case Type_Systemd: if (server) @@ -303,10 +312,6 @@ static int open_uri(const char *uri, int server) fcntl(fd, F_SETFD, FD_CLOEXEC); fcntl(fd, F_SETFL, O_NONBLOCK); if (server) { - if (!e->noreuseaddr) { - rc = 1; - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &rc, sizeof rc); - } if (!e->nolisten) listen(fd, BACKLOG); }