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.
This commit is contained in:
@@ -66,6 +66,10 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
#include <sys/un.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MSG_DONTWAIT
|
#ifndef MSG_DONTWAIT
|
||||||
# define MSG_DONTWAIT 0
|
# define MSG_DONTWAIT 0
|
||||||
#endif
|
#endif
|
||||||
@@ -348,6 +352,53 @@ static int mpd_parseWelcome(mpd_Connection * connection, const char * host, int
|
|||||||
return 0;
|
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) {
|
mpd_Connection * mpd_newConnection(const char * host, int port, float timeout) {
|
||||||
int err;
|
int err;
|
||||||
char * rt;
|
char * rt;
|
||||||
@@ -371,7 +422,13 @@ mpd_Connection * mpd_newConnection(const char * host, int port, float timeout) {
|
|||||||
if (winsock_dll_error(connection))
|
if (winsock_dll_error(connection))
|
||||||
return 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;
|
return connection;
|
||||||
|
|
||||||
while(!(rt = strstr(connection->buffer,"\n"))) {
|
while(!(rt = strstr(connection->buffer,"\n"))) {
|
||||||
|
|||||||
Reference in New Issue
Block a user