From d56a862467f2e7529486daa3d798a5f37bd03d31 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sun, 7 Feb 2010 10:46:00 -0500 Subject: [PATCH] Added AF_UNIX socket support. Signed-off-by: Brenden Matthews --- src/libmpdclient.cc | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/libmpdclient.cc b/src/libmpdclient.cc index df7a16a3..92156a13 100644 --- a/src/libmpdclient.cc +++ b/src/libmpdclient.cc @@ -52,6 +52,7 @@ # include # include # include +# include # include #endif @@ -119,6 +120,38 @@ static int do_connect_fail(mpd_Connection *connection, } #endif /* !WIN32 */ +static int uds_connect(mpd_Connection *connection, const char *host, + float timeout) +{ + struct sockaddr_un addr; + + strncpy(addr.sun_path, host, sizeof(addr.sun_path)-1); + addr.sun_family = AF_UNIX; + addr.sun_path[sizeof(addr.sun_path)-1] = 0; + connection->sock = socket(AF_UNIX, SOCK_STREAM, 0); + + if (connection->sock < 0) { + snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, + "problems creating socket: %s", strerror(errno)); + connection->error = MPD_ERROR_SYSTEM; + return -1; + } + + mpd_setConnectionTimeout(connection, timeout); + + /* connect stuff */ + if (do_connect_fail(connection, (struct sockaddr *)&addr, SUN_LEN(&addr))) { + snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, + "problems cconnecting socket: %s", strerror(errno)); + closesocket(connection->sock); + connection->sock = -1; + connection->error = MPD_ERROR_SYSTEM; + return -1; + } + + return 0; +} + #ifdef MPD_HAVE_GAI static int mpd_connect(mpd_Connection *connection, const char *host, int port, float timeout) @@ -129,6 +162,9 @@ static int mpd_connect(mpd_Connection *connection, const char *host, int port, struct addrinfo *res = NULL; struct addrinfo *addrinfo = NULL; + if (*host == '/') + return uds_connect(connection, host, timeout); + /* Setup hints */ hints.ai_flags = AI_ADDRCONFIG; hints.ai_family = AF_UNSPEC; @@ -200,6 +236,9 @@ static int mpd_connect(mpd_Connection *connection, const char *host, int port, int destlen; struct sockaddr_in sin; + if (*host == '/') + return uds_connect(connection, host, timeout); + #ifdef HAVE_GETHOSTBYNAME_R if (gethostbyname_r(rhost, &he, hostbuff, sizeof(hostbuff), &he_res, &he_errno)) { // get the host info snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,