diff options
author | Max Kellermann <max@duempel.org> | 2008-10-16 14:37:24 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-10-16 14:37:24 +0200 |
commit | 336ad46c12038bde7d06f5d271f0df7a0b33320a (patch) | |
tree | d7c3b58553fa7fc30ffa223e01eb03611ad071a6 /src/libmpdclient.c | |
parent | 6a0edcfbd7a28bcec39e1fb041093c7987f9b575 (diff) |
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.
Diffstat (limited to 'src/libmpdclient.c')
-rw-r--r-- | src/libmpdclient.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/src/libmpdclient.c b/src/libmpdclient.c index db0b6a4a..d42a823b 100644 --- a/src/libmpdclient.c +++ b/src/libmpdclient.c @@ -66,6 +66,10 @@ # endif #endif +#ifndef WIN32 +#include <sys/un.h> +#endif + #ifndef MSG_DONTWAIT # define MSG_DONTWAIT 0 #endif @@ -348,6 +352,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; @@ -371,7 +422,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"))) { |