From df47c7b828c02afbabc4d024008fabb07a882397 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Wed, 14 Feb 2007 12:13:49 +0000 Subject: Add a wrapper around close() to work around Windows' ass backwards way of handling sockets. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1429 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/pulsecore/core-util.c | 22 +++++++++++++++++++++- src/pulsecore/core-util.h | 4 +++- src/pulsecore/iochannel.c | 7 +++---- src/pulsecore/pipe.c | 10 +++++----- src/pulsecore/socket-client.c | 8 ++++---- src/pulsecore/socket-server.c | 14 +++++++------- src/pulsecore/socket-util.c | 4 ++-- 7 files changed, 45 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index ac1023a0..cc0fb205 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -5,7 +5,7 @@ Copyright 2004-2006 Lennart Poettering Copyright 2004 Joe Marcus Clarke - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -348,6 +348,26 @@ ssize_t pa_loop_write(int fd, const void*data, size_t size, int *type) { return ret; } +/** Platform independent read function. Necessary since not all + * systems treat all file descriptors equal. */ +int pa_close(int fd) +{ +#ifdef OS_IS_WIN32 + int ret; + + ret = closesocket(fd); + if (ret == 0) + return 0; + + if (WSAGetLastError() != WSAENOTSOCK) { + errno = WSAGetLastError(); + return ret; + } +#endif + + return close(fd); +} + /* Print a warning messages in case that the given signal is not * blocked or trapped */ void pa_check_signal_is_blocked(int sig) { diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index a1da3e28..1d921e03 100644 --- a/src/pulsecore/core-util.h +++ b/src/pulsecore/core-util.h @@ -7,7 +7,7 @@ This file is part of PulseAudio. Copyright 2004-2006 Lennart Poettering - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -44,6 +44,8 @@ ssize_t pa_write(int fd, const void *buf, size_t count, int *type); ssize_t pa_loop_read(int fd, void*data, size_t size, int *type); ssize_t pa_loop_write(int fd, const void*data, size_t size, int *type); +int pa_close(int fd); + void pa_check_signal_is_blocked(int sig); char *pa_sprintf_malloc(const char *format, ...) PA_GCC_PRINTF_ATTR(1,2); diff --git a/src/pulsecore/iochannel.c b/src/pulsecore/iochannel.c index 2f6fdd39..6f58ae75 100644 --- a/src/pulsecore/iochannel.c +++ b/src/pulsecore/iochannel.c @@ -4,7 +4,7 @@ This file is part of PulseAudio. Copyright 2004-2006 Lennart Poettering - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -174,10 +174,9 @@ void pa_iochannel_free(pa_iochannel*io) { if (!io->no_close) { if (io->ifd >= 0) - - close(io->ifd); + pa_close(io->ifd); if (io->ofd >= 0 && io->ofd != io->ifd) - close(io->ofd); + pa_close(io->ofd); } pa_xfree(io); diff --git a/src/pulsecore/pipe.c b/src/pulsecore/pipe.c index a659915e..7f6bb2e9 100644 --- a/src/pulsecore/pipe.c +++ b/src/pulsecore/pipe.c @@ -3,7 +3,7 @@ /*** This file is part of PulseAudio. - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -144,17 +144,17 @@ int pipe(int filedes[2]) { if ((addr.sin_port != peer.sin_port) || (addr.sin_addr.s_addr != peer.sin_addr.s_addr)) goto error; - close(listener); + pa_close(listener); return 0; error: if (listener >= 0) - close(listener); + pa_close(listener); if (filedes[0] >= 0) - close(filedes[0]); + pa_close(filedes[0]); if (filedes[1] >= 0) - close(filedes[0]); + pa_close(filedes[0]); return -1; } diff --git a/src/pulsecore/socket-client.c b/src/pulsecore/socket-client.c index 4ea81113..b99c8025 100644 --- a/src/pulsecore/socket-client.c +++ b/src/pulsecore/socket-client.c @@ -4,7 +4,7 @@ This file is part of PulseAudio. Copyright 2004-2006 Lennart Poettering - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -163,7 +163,7 @@ static void do_call(pa_socket_client *c) { finish: if (!io && c->fd >= 0) - close(c->fd); + pa_close(c->fd); c->fd = -1; free_events(c); @@ -310,7 +310,7 @@ static void socket_client_free(pa_socket_client *c) { free_events(c); if (c->fd >= 0) - close(c->fd); + pa_close(c->fd); #ifdef HAVE_LIBASYNCNS if (c->asyncns_query) @@ -403,7 +403,7 @@ static void timeout_cb(pa_mainloop_api *m, pa_time_event *e, const struct timeva assert(c); if (c->fd >= 0) { - close(c->fd); + pa_close(c->fd); c->fd = -1; } diff --git a/src/pulsecore/socket-server.c b/src/pulsecore/socket-server.c index eaa8eb91..b5a6dc31 100644 --- a/src/pulsecore/socket-server.c +++ b/src/pulsecore/socket-server.c @@ -4,7 +4,7 @@ This file is part of PulseAudio. Copyright 2004-2006 Lennart Poettering - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -106,7 +106,7 @@ static void callback(pa_mainloop_api *mainloop, pa_io_event *e, int fd, PA_GCC_U pa_fd_set_cloexec(nfd, 1); if (!s->on_connection) { - close(nfd); + pa_close(nfd); goto finish; } @@ -119,7 +119,7 @@ static void callback(pa_mainloop_api *mainloop, pa_io_event *e, int fd, PA_GCC_U fromhost(&req); if (!hosts_access(&req)) { pa_log_warn("TCP connection refused by tcpwrap."); - close(nfd); + pa_close(nfd); goto finish; } @@ -216,7 +216,7 @@ pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *file fail: if (fd >= 0) - close(fd); + pa_close(fd); return NULL; } @@ -275,7 +275,7 @@ pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address fail: if (fd >= 0) - close(fd); + pa_close(fd); return NULL; } @@ -331,7 +331,7 @@ pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t ad fail: if (fd >= 0) - close(fd); + pa_close(fd); return NULL; } @@ -398,7 +398,7 @@ static void socket_server_free(pa_socket_server*s) { pa_xfree(s->filename); } - close(s->fd); + pa_close(s->fd); pa_xfree(s->tcpwrap_service); diff --git a/src/pulsecore/socket-util.c b/src/pulsecore/socket-util.c index 5e2cfe03..673058e2 100644 --- a/src/pulsecore/socket-util.c +++ b/src/pulsecore/socket-util.c @@ -5,7 +5,7 @@ Copyright 2004-2006 Lennart Poettering Copyright 2004 Joe Marcus Clarke - Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006-2007 Pierre Ossman for Cendio AB PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -236,7 +236,7 @@ int pa_unix_socket_is_stale(const char *fn) { finish: if (fd >= 0) - close(fd); + pa_close(fd); return ret; } -- cgit