X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fsocket-util.c;h=4933fe08e2ae20c0c83bd94d0aa62fdf3d3a33b9;hb=bcb161b0230fdd1faf9176f95fee76a7db6afd59;hp=39b6142e88493565683a30baa3746bf68c212bdf;hpb=641906e9366891e0ad3e6e38b7396a427678c4cf;p=elogind.git diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c index 39b6142e8..4933fe08e 100644 --- a/src/shared/socket-util.c +++ b/src/shared/socket-util.c @@ -38,6 +38,7 @@ #include "path-util.h" #include "socket-util.h" #include "missing.h" +#include "fileio.h" int socket_address_parse(SocketAddress *a, const char *s) { int r; @@ -67,7 +68,7 @@ int socket_address_parse(SocketAddress *a, const char *s) { errno = 0; if (inet_pton(AF_INET6, n, &a->sockaddr.in6.sin6_addr) <= 0) { free(n); - return errno != 0 ? -errno : -EINVAL; + return errno > 0 ? -errno : -EINVAL; } free(n); @@ -203,7 +204,7 @@ int socket_address_parse_netlink(SocketAddress *a, const char *s) { errno = 0; if (sscanf(s, "%ms %u", &sfamily, &group) < 1) - return errno ? -errno : -EINVAL; + return errno > 0 ? -errno : -EINVAL; family = netlink_family_from_string(sfamily); if (family < 0) @@ -564,6 +565,45 @@ bool socket_address_matches_fd(const SocketAddress *a, int fd) { return false; } +int make_socket_fd(const char* address, int flags) { + SocketAddress a; + int fd, r; + char _cleanup_free_ *p = NULL; + + r = socket_address_parse(&a, address); + if (r < 0) { + log_error("failed to parse socket: %s", strerror(-r)); + return r; + } + + fd = socket(socket_address_family(&a), flags, 0); + if (fd < 0) { + log_error("socket(): %m"); + return -errno; + } + + r = socket_address_print(&a, &p); + if (r < 0) { + log_error("socket_address_print(): %s", strerror(-r)); + return r; + } + log_info("Listening on %s", p); + + r = bind(fd, &a.sockaddr.sa, a.size); + if (r < 0) { + log_error("bind to %s: %m", address); + return -errno; + } + + r = listen(fd, SOMAXCONN); + if (r < 0) { + log_error("listen on %s: %m", address); + return -errno; + } + + return fd; +} + static const char* const netlink_family_table[] = { [NETLINK_ROUTE] = "route", [NETLINK_FIREWALL] = "firewall",