From cb72b9d7474e2d5bb258660cc95327e43aee9367 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 23 May 2011 13:30:13 -0400 Subject: [PATCH] sock_connect() - if first char of hostname is '/' assume it is a unix domain socket and connect to that instead --- citadel/clientsocket.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/citadel/clientsocket.c b/citadel/clientsocket.c index a4b521864..4c8e20119 100644 --- a/citadel/clientsocket.c +++ b/citadel/clientsocket.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,40 @@ #include "clientsocket.h" #include "ctdl_module.h" + +/* + * Connect to a unix domain socket (normally called by sock_connect() passthru) + */ +int uds_sock_connect(char *sockpath) +{ + struct sockaddr_un addr; + int s; + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + safestrncpy(addr.sun_path, sockpath, sizeof addr.sun_path); + + s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s < 0) { + syslog(LOG_ERR, "socket() failed: %s", strerror(errno)); + return(-1); + } + + if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + syslog(LOG_ERR, "connect() failed: %s", strerror(errno)); + close(s); + return(-1); + } + + return s; +} + + +/* + * Connect to a service via a client socket. This supports both IPv4 and IPv6. + * If the first character of the host name/addr is "/" then we assume the caller + * is actually trying to connect to a unix domain socket and we do that instead. + */ int sock_connect(char *host, char *service) { struct in6_addr serveraddr; @@ -59,6 +94,11 @@ int sock_connect(char *host, char *service) if ((host == NULL) || IsEmptyStr(host)) return (-1); + + if (host[0] == '/') { + return uds_sock_connect(host); + } + if ((service == NULL) || IsEmptyStr(service)) return (-1); -- 2.39.2