socket: add support for blocking sockets

Add a flag to open a blocking socket. The default stays non-blocking.
This commit is contained in:
Miroslav Lichvar 2019-11-18 18:07:16 +01:00
parent e7fc2d31cc
commit 0dba2b9689
2 changed files with 46 additions and 21 deletions

View file

@ -83,7 +83,7 @@ struct MessageHeader {
static int initialised;
/* Flags supported by socket() */
static int socket_flags;
static int supported_socket_flags;
/* Arrays of Message and MessageHeader */
static ARR_Instance recv_messages;
@ -181,12 +181,51 @@ set_socket_nonblock(int sock_fd)
/* ================================================== */
static int
get_open_flags(int flags)
{
int r = supported_socket_flags;
#ifdef SOCK_NONBLOCK
if (flags & SCK_FLAG_BLOCK)
r &= ~SOCK_NONBLOCK;
#endif
return r;
}
/* ================================================== */
static int
set_socket_flags(int sock_fd, int flags)
{
/* Close the socket automatically on exec */
if (
#ifdef SOCK_CLOEXEC
(supported_socket_flags & SOCK_CLOEXEC) == 0 &&
#endif
!UTI_FdSetCloexec(sock_fd))
return 0;
/* Enable non-blocking mode */
if ((flags & SCK_FLAG_BLOCK) == 0 &&
#ifdef SOCK_NONBLOCK
(supported_socket_flags & SOCK_NONBLOCK) == 0 &&
#endif
!set_socket_nonblock(sock_fd))
return 0;
return 1;
}
/* ================================================== */
static int
open_socket(int domain, int type, int flags)
{
int sock_fd;
sock_fd = socket(domain, type | socket_flags, 0);
sock_fd = socket(domain, type | get_open_flags(flags), 0);
if (sock_fd < 0) {
DEBUG_LOG("Could not open %s socket : %s",
@ -194,22 +233,7 @@ open_socket(int domain, int type, int flags)
return INVALID_SOCK_FD;
}
/* Close the socket automatically on exec */
if (
#ifdef SOCK_CLOEXEC
(socket_flags & SOCK_CLOEXEC) == 0 &&
#endif
!UTI_FdSetCloexec(sock_fd)) {
close(sock_fd);
return INVALID_SOCK_FD;
}
/* Enable non-blocking mode */
if (
#ifdef SOCK_NONBLOCK
(socket_flags & SOCK_NONBLOCK) == 0 &&
#endif
!set_socket_nonblock(sock_fd)) {
if (!set_socket_flags(sock_fd, flags)) {
close(sock_fd);
return INVALID_SOCK_FD;
}
@ -1025,14 +1049,14 @@ SCK_Initialise(void)
priv_bind_function = NULL;
socket_flags = 0;
supported_socket_flags = 0;
#ifdef SOCK_CLOEXEC
if (check_socket_flag(SOCK_CLOEXEC, FD_CLOEXEC, 0))
socket_flags |= SOCK_CLOEXEC;
supported_socket_flags |= SOCK_CLOEXEC;
#endif
#ifdef SOCK_NONBLOCK
if (check_socket_flag(SOCK_NONBLOCK, 0, O_NONBLOCK))
socket_flags |= SOCK_NONBLOCK;
supported_socket_flags |= SOCK_NONBLOCK;
#endif
initialised = 1;

View file

@ -31,6 +31,7 @@
#include "addressing.h"
/* Flags for opening sockets */
#define SCK_FLAG_BLOCK 1
#define SCK_FLAG_BROADCAST 2
#define SCK_FLAG_RX_DEST_ADDR 4
#define SCK_FLAG_ALL_PERMISSIONS 8