From 97f3ff8c7ebfc7d8578682174e8fe1a17f1a49a2 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Mon, 4 Aug 2025 18:58:27 +0200 Subject: [PATCH] os: cross platform socket close() wrapper Reducing the ifdef-zoo a bit by moving the platform specific socket close calls into separate function. On win32, this also checks the retval and potentially query for error. On Unix, just calling close(). Signed-off-by: Enrico Weigelt, metux IT consult --- os/Xtranssock.c | 37 ++++++++++++++----------------------- os/ossock.c | 14 ++++++++++++++ os/ossock.h | 5 +++++ 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/os/Xtranssock.c b/os/Xtranssock.c index 455356f1a..e36a4d176 100644 --- a/os/Xtranssock.c +++ b/os/Xtranssock.c @@ -112,8 +112,6 @@ from the copyright holders. #include #endif -#define socket_close close - #include #else /* !WIN32 */ @@ -122,8 +120,6 @@ from the copyright holders. #include #include -#define socket_close closesocket - #undef EADDRINUSE #define EADDRINUSE WSAEADDRINUSE #undef EWOULDBLOCK @@ -679,7 +675,7 @@ static int _XSERVTransSocketCreateListener (XtransConnInfo ciptr, if (retry-- == 0) { prmsg (1, "SocketCreateListener: failed to bind listener\n"); - socket_close (fd); + ossock_close(fd); return TRANS_CREATE_LISTENER_FAILED; } #ifdef SO_REUSEADDR @@ -710,7 +706,7 @@ static int _XSERVTransSocketCreateListener (XtransConnInfo ciptr, if (listen (fd, BACKLOG) < 0) { prmsg (1, "SocketCreateListener: listen() failed\n"); - socket_close (fd); + ossock_close(fd); return TRANS_CREATE_LISTENER_FAILED; } @@ -990,7 +986,7 @@ static int _XSERVTransSocketUNIXResetListener (XtransConnInfo ciptr) } #endif - socket_close (ciptr->fd); + ossock_close(ciptr->fd); unlink (unsock->sun_path); if ((ciptr->fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) @@ -1002,14 +998,14 @@ static int _XSERVTransSocketUNIXResetListener (XtransConnInfo ciptr) if (bind (ciptr->fd, (struct sockaddr *) unsock, ciptr->addrlen) < 0) { - socket_close (ciptr->fd); + ossock_close(ciptr->fd); _XSERVTransFreeConnInfo (ciptr); return TRANS_RESET_FAILURE; } if (listen (ciptr->fd, BACKLOG) < 0) { - socket_close (ciptr->fd); + ossock_close(ciptr->fd); _XSERVTransFreeConnInfo (ciptr); (void) umask (oldUmask); return TRANS_RESET_FAILURE; @@ -1077,7 +1073,7 @@ static XtransConnInfo _XSERVTransSocketINETAccept ( { prmsg (1, "SocketINETAccept: ...SocketINETGetAddr() failed:\n"); - socket_close (newciptr->fd); + ossock_close(newciptr->fd); free (newciptr); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; @@ -1087,7 +1083,7 @@ static XtransConnInfo _XSERVTransSocketINETAccept ( { prmsg (1, "SocketINETAccept: ...SocketINETGetPeerAddr() failed:\n"); - socket_close (newciptr->fd); + ossock_close(newciptr->fd); if (newciptr->addr) free (newciptr->addr); free (newciptr); *status = TRANS_ACCEPT_MISC_ERROR; @@ -1138,7 +1134,7 @@ static XtransConnInfo _XSERVTransSocketUNIXAccept ( { prmsg (1, "SocketUNIXAccept: Can't allocate space for the addr\n"); - socket_close (newciptr->fd); + ossock_close(newciptr->fd); free (newciptr); *status = TRANS_ACCEPT_BAD_MALLOC; return NULL; @@ -1156,7 +1152,7 @@ static XtransConnInfo _XSERVTransSocketUNIXAccept ( { prmsg (1, "SocketUNIXAccept: Can't allocate space for the addr\n"); - socket_close (newciptr->fd); + ossock_close(newciptr->fd); if (newciptr->addr) free (newciptr->addr); free (newciptr); *status = TRANS_ACCEPT_BAD_MALLOC; @@ -1193,7 +1189,7 @@ appendFd(struct _XtransConnFd **prev, int fd, int do_close) new = malloc (sizeof (struct _XtransConnFd)); if (!new) { /* XXX mark connection as broken */ - socket_close(fd); + ossock_close(fd); return; } new->next = 0; @@ -1227,7 +1223,7 @@ discardFd(struct _XtransConnFd **prev, struct _XtransConnFd *upto, int do_close) for (cf = *prev; cf != upto; cf = next) { next = cf->next; if (do_close || cf->do_close) - socket_close(cf->fd); + ossock_close(cf->fd); free(cf); } *prev = upto; @@ -1431,12 +1427,7 @@ static int _XSERVTransSocketDisconnect (XtransConnInfo ciptr) static int _XSERVTransSocketINETClose (XtransConnInfo ciptr) { prmsg (2,"SocketINETClose(%p,%d)\n", (void *) ciptr, ciptr->fd); - - int ret = socket_close (ciptr->fd); -#ifdef WIN32 - if (ret == SOCKET_ERROR) errno = WSAGetLastError(); -#endif - return ret; + return ossock_close(ciptr->fd); } #endif /* TCPCONN */ @@ -1457,7 +1448,7 @@ static int _XSERVTransSocketUNIXClose (XtransConnInfo ciptr) #if XTRANS_SEND_FDS cleanupFds(ciptr); #endif - ret = socket_close(ciptr->fd); + ret = ossock_close(ciptr->fd); if (ciptr->flags && sockname @@ -1483,7 +1474,7 @@ static int _XSERVTransSocketUNIXCloseForCloning (XtransConnInfo ciptr) #if XTRANS_SEND_FDS cleanupFds(ciptr); #endif - return socket_close(ciptr->fd); + return ossock_close(ciptr->fd); } #endif /* UNIXCONN */ diff --git a/os/ossock.c b/os/ossock.c index 22dfaed2e..f9cac0151 100644 --- a/os/ossock.c +++ b/os/ossock.c @@ -4,6 +4,8 @@ */ #include +#include + #ifdef WIN32 #include #else @@ -32,3 +34,15 @@ int ossock_ioctl(int fd, unsigned long request, void *arg) return ioctl(fd, request,arg); #endif } + +int ossock_close(int fd) +{ +#ifdef WIN32 + int ret = closesocket(fd); + if (ret == SOCKET_ERROR) + errno = WSAGetLastError(); + return ret; +#else + return close(fd); +#endif +} diff --git a/os/ossock.h b/os/ossock.h index 1faeb0b54..254ed5d08 100644 --- a/os/ossock.h +++ b/os/ossock.h @@ -17,4 +17,9 @@ void ossock_init(void); */ int ossock_ioctl(int fd, unsigned long request, void *arg); +/* + * os specific socket close function + */ +int ossock_close(int fd); + #endif /* _XSERVER_OS_OSSOCK_H_ */