aboutsummaryrefslogtreecommitdiffstats
path: root/src/socket_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket_util.c')
-rw-r--r--src/socket_util.c75
1 files changed, 13 insertions, 62 deletions
diff --git a/src/socket_util.c b/src/socket_util.c
index d1651066f..a06a0cbd5 100644
--- a/src/socket_util.c
+++ b/src/socket_util.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2010 The Music Player Daemon Project
+ * Copyright (C) 2003-2011 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -26,7 +26,6 @@
#ifndef G_OS_WIN32
#include <sys/socket.h>
-#include <netdb.h>
#else /* G_OS_WIN32 */
#include <ws2tcpip.h>
#include <winsock.h>
@@ -42,55 +41,6 @@ listen_quark(void)
return g_quark_from_static_string("listen");
}
-char *
-sockaddr_to_string(const struct sockaddr *sa, size_t length, GError **error)
-{
-#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED)
- const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)sa;
- struct sockaddr_in a4;
-#endif
- int ret;
- char host[NI_MAXHOST], serv[NI_MAXSERV];
-
-#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED)
- if (sa->sa_family == AF_INET6 &&
- IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr)) {
- /* convert "::ffff:127.0.0.1" to "127.0.0.1" */
-
- memset(&a4, 0, sizeof(a4));
- a4.sin_family = AF_INET;
- memcpy(&a4.sin_addr, ((const char *)&a6->sin6_addr) + 12,
- sizeof(a4.sin_addr));
- a4.sin_port = a6->sin6_port;
-
- sa = (const struct sockaddr *)&a4;
- length = sizeof(a4);
- }
-#endif
-
- ret = getnameinfo(sa, length, host, sizeof(host), serv, sizeof(serv),
- NI_NUMERICHOST|NI_NUMERICSERV);
- if (ret != 0) {
- g_set_error(error, g_quark_from_static_string("netdb"), ret,
- "%s", gai_strerror(ret));
- return NULL;
- }
-
-#ifdef HAVE_UN
- if (sa->sa_family == AF_UNIX)
- /* "serv" contains corrupt information with unix
- sockets */
- return g_strdup(host);
-#endif
-
-#ifdef HAVE_IPV6
- if (strchr(host, ':') != NULL)
- return g_strconcat("[", host, "]:", serv, NULL);
-#endif
-
- return g_strconcat(host, ":", serv, NULL);
-}
-
int
socket_bind_listen(int domain, int type, int protocol,
const struct sockaddr *address, size_t address_length,
@@ -99,9 +49,6 @@ socket_bind_listen(int domain, int type, int protocol,
{
int fd, ret;
const int reuse = 1;
-#ifdef HAVE_STRUCT_UCRED
- int passcred = 1;
-#endif
fd = socket_cloexec_nonblock(domain, type, protocol);
if (fd < 0) {
@@ -110,14 +57,8 @@ socket_bind_listen(int domain, int type, int protocol,
return -1;
}
-#ifdef WIN32
- const char *optval = (const char *)&reuse;
-#else
- const void *optval = &reuse;
-#endif
-
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
- optval, sizeof(reuse));
+ (const char *) &reuse, sizeof(reuse));
if (ret < 0) {
g_set_error(error, listen_quark(), errno,
"setsockopt() failed: %s", g_strerror(errno));
@@ -142,8 +83,18 @@ socket_bind_listen(int domain, int type, int protocol,
}
#ifdef HAVE_STRUCT_UCRED
- setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &passcred, sizeof(passcred));
+ setsockopt(fd, SOL_SOCKET, SO_PASSCRED,
+ (const char *) &reuse, sizeof(reuse));
#endif
return fd;
}
+
+int
+socket_keepalive(int fd)
+{
+ const int reuse = 1;
+
+ return setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
+ (const char *)&reuse, sizeof(reuse));
+}