From: Max Kellermann Date: Mon, 15 Sep 2008 11:27:33 +0000 (+0200) Subject: added support for unix domain sockets X-Git-Tag: v0.12_alpha1~308 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=5f844850f75932d43c3a8bf03d0821bd438295bc;p=ncmpc.git added support for unix domain sockets If a host name starts with a slash, it is assumed to be a unix domain socket path. The port is ignored. This code is disabled on WIN32, until someone tests it. --- diff --git a/src/libmpdclient.c b/src/libmpdclient.c index a52ce23..48d7d4f 100644 --- a/src/libmpdclient.c +++ b/src/libmpdclient.c @@ -51,6 +51,10 @@ # include #endif +#ifndef WIN32 +#include +#endif + #ifndef MSG_DONTWAIT # define MSG_DONTWAIT 0 #endif @@ -328,6 +332,53 @@ static int mpd_parseWelcome(mpd_Connection * connection, const char * host, int return 0; } +#ifndef WIN32 +static int mpd_connect_un(mpd_Connection * connection, + const char * host, float timeout) +{ + int error, flags; + size_t path_length; + struct sockaddr_un sun; + + path_length = strlen(host); + if (path_length >= sizeof(sun.sun_path)) { + strcpy(connection->errorStr, "unix socket path is too long"); + connection->error = MPD_ERROR_UNKHOST; + return -1; + } + + sun.sun_family = AF_UNIX; + memcpy(sun.sun_path, host, path_length + 1); + + connection->sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (connection->sock < 0) { + strcpy(connection->errorStr, "problems creating socket"); + connection->error = MPD_ERROR_SYSTEM; + return -1; + } + + mpd_setConnectionTimeout(connection, timeout); + + flags = fcntl(connection->sock, F_GETFL, 0); + fcntl(connection->sock, F_SETFL, flags | O_NONBLOCK); + + error = connect(connection->sock, (struct sockaddr*)&sun, sizeof(sun)); + if (error < 0) { + /* try the next address family */ + close(connection->sock); + connection->sock = 0; + + snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, + "problems connecting to \"%s\": %s", + host, strerror(errno)); + connection->error = MPD_ERROR_CONNPORT; + return -1; + } + + return 0; +} +#endif /* WIN32 */ + mpd_Connection * mpd_newConnection(const char * host, int port, float timeout) { int err; char * rt; @@ -350,7 +401,13 @@ mpd_Connection * mpd_newConnection(const char * host, int port, float timeout) { if (winsock_dll_error(connection)) return connection; - if (mpd_connect(connection, host, port, timeout) < 0) +#ifndef WIN32 + if (host[0] == '/') + err = mpd_connect_un(connection, host, timeout); + else +#endif + err = mpd_connect(connection, host, port, timeout); + if (err < 0) return connection; while(!(rt = strstr(connection->buffer,"\n"))) {