sock_connect() - if first char of hostname is '/' assume it is a unix domain socket...
authorArt Cancro <ajc@uncensored.citadel.org>
Mon, 23 May 2011 17:30:13 +0000 (13:30 -0400)
committerArt Cancro <ajc@uncensored.citadel.org>
Mon, 23 May 2011 17:30:13 +0000 (13:30 -0400)
citadel/clientsocket.c

index 95e8e7c6c6c89244a3959a9ffaeb04a77cd8e973..d28e31ce106c64c15a130c0ceb0d927dd42d4ce8 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <sys/un.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <string.h>
 #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);