#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;
if ((host == NULL) || IsEmptyStr(host))
return (-1);
+
+ if (host[0] == '/') {
+ return uds_sock_connect(host);
+ }
+
if ((service == NULL) || IsEmptyStr(service))
return (-1);