+
+/*
+ * 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.
+ */