diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-09-06 10:35:13 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-09-06 10:35:13 -0700 |
commit | 3d5d525eb525cfad8f643917c31e3d9fedce2874 (patch) | |
tree | 088094f56b14c189d6d58405ab255ee613a38191 | |
parent | 9df5cdfd09145441f1f927e6deff5a999178bc53 (diff) | |
download | txr-3d5d525eb525cfad8f643917c31e3d9fedce2874.tar.gz txr-3d5d525eb525cfad8f643917c31e3d9fedce2874.tar.bz2 txr-3d5d525eb525cfad8f643917c31e3d9fedce2874.zip |
sockets: improve socked type patch.
* socket.c (SOCK_NONBLOCK, SOCK_CLOEXEC): #define these as 0 if
they are missing.
(open_socket, socketpair_wrap): Clear the SOCK_NONBLOCK and
SOCK_CLOEXEC flags in a single operation instead of two. Use C
native arithmetic instead of Lisp logand and lognot.
-rw-r--r-- | socket.c | 22 |
1 files changed, 12 insertions, 10 deletions
@@ -1090,15 +1090,20 @@ static val sock_recv_timeout(val sock, val usec) } #endif +#ifndef SOCK_NONBLOCK +#define SOCK_NONBLOCK 0 +#endif + +#ifndef SOCK_CLOEXEC +#define SOCK_CLOEXEC 0 +#endif + static val open_socket(val family, val type, val mode_str) { val self = lit("open-socket"); int fd = socket(c_num(family, self), c_num(type, self), 0); -#ifdef SOCK_NONBLOCK - type = logand(type, lognot(num_fast(SOCK_NONBLOCK), nil)); -#endif -#ifdef SOCK_CLOEXEC - type = logand(type, lognot(num_fast(SOCK_CLOEXEC), nil)); +#if SOCK_NONBLOCK || SOCK_CLOEXEC + type = num_fast(c_num(type, self) & ~(SOCK_NONBLOCK | SOCK_CLOEXEC)); #endif return open_sockfd(num(fd), family, type, mode_str, self); } @@ -1116,11 +1121,8 @@ static val socketpair_wrap(val family, val type, val mode_str) uw_throwf(socket_error_s, lit("~a failed: ~d/~s"), self, num(errno), errno_to_str(errno), nao); -#ifdef SOCK_NONBLOCK - type = logand(type, lognot(num_fast(SOCK_NONBLOCK), nil)); -#endif -#ifdef SOCK_CLOEXEC - type = logand(type, lognot(num_fast(SOCK_CLOEXEC), nil)); +#if SOCK_NONBLOCK || SOCK_CLOEXEC + type = num_fast(c_num(type, self) & ~(SOCK_NONBLOCK | SOCK_CLOEXEC)); #endif { |