aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2011-09-19 21:04:19 +0200
committerMax Kellermann <max@duempel.org>2011-09-20 08:38:58 +0200
commitc476819cb1186770b1b7395851e394caac39cbc8 (patch)
tree7e2d236e71ac88238026bb8803bfa87121c00f1d
parent77a56c7c5a1ab6bc0d76e0cf55f24071be7c4b5f (diff)
downloadmpd-c476819cb1186770b1b7395851e394caac39cbc8.tar.gz
mpd-c476819cb1186770b1b7395851e394caac39cbc8.tar.xz
mpd-c476819cb1186770b1b7395851e394caac39cbc8.zip
fd_util: add function close_socket()
Wrap close(), use closesocket() on WIN32/WinSock.
-rw-r--r--NEWS1
-rw-r--r--src/client_new.c5
-rw-r--r--src/fd_util.c10
-rw-r--r--src/fd_util.h6
-rw-r--r--src/output/httpd_output_plugin.c4
-rw-r--r--src/server_socket.c2
-rw-r--r--src/socket_util.c6
7 files changed, 26 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index af7315360..2f1907cd7 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@ ver 0.16.5 (2010/??/??)
* decoder:
- ffmpeg: higher precision timestamps
- ffmpeg: don't require key frame for seeking
+* WIN32: close sockets properly
ver 0.16.4 (2011/09/01)
diff --git a/src/client_new.c b/src/client_new.c
index 0ee21916b..e764a6550 100644
--- a/src/client_new.c
+++ b/src/client_new.c
@@ -19,6 +19,7 @@
#include "config.h"
#include "client_internal.h"
+#include "fd_util.h"
#include "fifo_buffer.h"
#include "socket_util.h"
#include "permission.h"
@@ -67,7 +68,7 @@ void client_new(int fd, const struct sockaddr *sa, size_t sa_length, int uid)
progname, hostaddr);
g_free(hostaddr);
- close(fd);
+ close_socket(fd);
return;
}
@@ -77,7 +78,7 @@ void client_new(int fd, const struct sockaddr *sa, size_t sa_length, int uid)
if (client_list_is_full()) {
g_warning("Max Connections Reached!");
- close(fd);
+ close_socket(fd);
return;
}
diff --git a/src/fd_util.c b/src/fd_util.c
index 1f3004d0c..4636c19e4 100644
--- a/src/fd_util.c
+++ b/src/fd_util.c
@@ -304,3 +304,13 @@ inotify_init_cloexec(void)
}
#endif
+
+int
+close_socket(int fd)
+{
+#ifdef WIN32
+ return closesocket(fd);
+#else
+ return close(fd);
+#endif
+}
diff --git a/src/fd_util.h b/src/fd_util.h
index 3d465b200..d74bb30d8 100644
--- a/src/fd_util.h
+++ b/src/fd_util.h
@@ -133,4 +133,10 @@ inotify_init_cloexec(void);
#endif
+/**
+ * Portable wrapper for close(); use closesocket() on WIN32/WinSock.
+ */
+int
+close_socket(int fd);
+
#endif
diff --git a/src/output/httpd_output_plugin.c b/src/output/httpd_output_plugin.c
index 40ad05c3d..2c140a300 100644
--- a/src/output/httpd_output_plugin.c
+++ b/src/output/httpd_output_plugin.c
@@ -201,7 +201,7 @@ httpd_listen_in_event(int fd, const struct sockaddr *address,
g_warning("libwrap refused connection (libwrap=%s) from %s",
progname, hostaddr);
g_free(hostaddr);
- close(fd);
+ close_socket(fd);
g_mutex_unlock(httpd->mutex);
return;
}
@@ -222,7 +222,7 @@ httpd_listen_in_event(int fd, const struct sockaddr *address,
httpd->clients_cnt < httpd->clients_max))
httpd_client_add(httpd, fd);
else
- close(fd);
+ close_socket(fd);
} else if (fd < 0 && errno != EINTR) {
g_warning("accept() failed: %s", g_strerror(errno));
}
diff --git a/src/server_socket.c b/src/server_socket.c
index c10740676..b4114d2d9 100644
--- a/src/server_socket.c
+++ b/src/server_socket.c
@@ -253,7 +253,7 @@ server_socket_close(struct server_socket *ss)
continue;
g_source_remove(s->source_id);
- close(s->fd);
+ close_socket(s->fd);
s->fd = -1;
}
}
diff --git a/src/socket_util.c b/src/socket_util.c
index 0909765ba..3f7075ed3 100644
--- a/src/socket_util.c
+++ b/src/socket_util.c
@@ -122,7 +122,7 @@ socket_bind_listen(int domain, int type, int protocol,
if (ret < 0) {
g_set_error(error, listen_quark(), errno,
"setsockopt() failed: %s", g_strerror(errno));
- close(fd);
+ close_socket(fd);
return -1;
}
@@ -130,7 +130,7 @@ socket_bind_listen(int domain, int type, int protocol,
if (ret < 0) {
g_set_error(error, listen_quark(), errno,
"%s", g_strerror(errno));
- close(fd);
+ close_socket(fd);
return -1;
}
@@ -138,7 +138,7 @@ socket_bind_listen(int domain, int type, int protocol,
if (ret < 0) {
g_set_error(error, listen_quark(), errno,
"listen() failed: %s", g_strerror(errno));
- close(fd);
+ close_socket(fd);
return -1;
}