Skip to content

Commit

Permalink
Get rid of webipc.h and DJBUNIX_FLAG_*
Browse files Browse the repository at this point in the history
 Decent semantic header separation is hard. It's always
an ongoing process. Here socket.h always included webipc.h
for listen(), and webipc.h always included djbunix.h for
socket_internal() and socketpair_internal(). That's ugh.
Just move all the socket stuff into one socket header.
Of course, djbunix.h is still needed most of the time for
fd_close() and other operations on fds, but those are
generic anyway.

 Also, O_CLOEXEC exists everywhere now, so we can use it as well
as O_NONBLOCK instead of redefining the flags in djbunix.h.
  • Loading branch information
skarnet committed Dec 9, 2020
1 parent 86312d1 commit e557bab
Show file tree
Hide file tree
Showing 30 changed files with 162 additions and 165 deletions.
47 changes: 23 additions & 24 deletions package/deps.mak

Large diffs are not rendered by default.

12 changes: 4 additions & 8 deletions src/include/skalibs/djbunix.h
Expand Up @@ -6,21 +6,19 @@
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <fcntl.h>

#include <skalibs/gccattributes.h>
#include <skalibs/stralloc.h>

#define DJBUNIX_FLAG_NB 0x01U
#define DJBUNIX_FLAG_COE 0x02U

extern int coe (int) ;
extern int uncoe (int) ;
extern int ndelay_on (int) ;
extern int ndelay_off (int) ;
extern int pipe_internal (int *, unsigned int) ;
#define pipenb(p) pipe_internal(p, DJBUNIX_FLAG_NB)
#define pipecoe(p) pipe_internal(p, DJBUNIX_FLAG_COE)
#define pipenbcoe(p) pipe_internal(p, DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define pipenb(p) pipe_internal(p, O_NONBLOCK)
#define pipecoe(p) pipe_internal(p, O_CLOEXEC)
#define pipenbcoe(p) pipe_internal(p, O_NONBLOCK|O_CLOEXEC)
extern int fd_copy (int, int) ;
extern int fd_copy2 (int, int, int, int) ;
extern int fd_move (int, int) ;
Expand Down Expand Up @@ -57,8 +55,6 @@ extern int open_trunc (char const *) ;
extern int openc_trunc (char const *) ;
extern int open_write (char const *) ;
extern int openc_write (char const *) ;
extern int socket_internal (int, int, int, unsigned int) ;
extern int socketpair_internal (int, int, int, unsigned int, int *) ;

extern size_t path_canonicalize (char *, char const *, int) ;

Expand Down
95 changes: 73 additions & 22 deletions src/include/skalibs/socket.h
Expand Up @@ -3,18 +3,69 @@
#ifndef SOCKET_H
#define SOCKET_H

#include <sys/types.h>
#include <stddef.h>
#include <stdint.h>
#include <fcntl.h>

#include <skalibs/gccattributes.h>
#include <skalibs/posixplz.h>
#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <skalibs/webipc.h>

typedef ssize_t socket_io_func_t (int, char *, size_t, char *, uint16_t *) ;
typedef socket_io_func_t *socket_io_func_t_ref ;

extern int socket_internal (int, int, int, unsigned int) ;
extern int socketpair_internal (int, int, int, unsigned int, int *) ;


/* UNIX domain sockets */

#define IPCPATH_MAX 107

#define ipc_stream() ipc_stream_nb()
#define ipc_stream_b() ipc_stream_internal(0)
#define ipc_stream_nb() ipc_stream_internal(O_NONBLOCK)
#define ipc_stream_coe() ipc_stream_internal(O_CLOEXEC)
#define ipc_stream_nbcoe() ipc_stream_internal(O_NONBLOCK|O_CLOEXEC)
extern int ipc_stream_internal (unsigned int) ;

#define ipc_datagram() ipc_datagram_nb()
#define ipc_datagram_b() ipc_datagram_internal(0)
#define ipc_datagram_nb() ipc_datagram_internal(O_NONBLOCK)
#define ipc_datagram_coe() ipc_datagram_internal(O_CLOEXEC)
#define ipc_datagram_nbcoe() ipc_datagram_internal(O_NONBLOCK|O_CLOEXEC)
extern int ipc_datagram_internal (unsigned int) ;

#define ipc_pair(sv) ipc_pair_nb(sv)
#define ipc_pair_b(sv) ipc_pair_internal((sv), 0)
#define ipc_pair_nb(sv) ipc_pair_internal((sv), O_NONBLOCK)
#define ipc_pair_coe(sv) ipc_pair_internal((sv), O_CLOEXEC)
#define ipc_pair_nbcoe(sv) ipc_pair_internal((sv), O_NONBLOCK|O_CLOEXEC)
extern int ipc_pair_internal (int *, unsigned int) ;

extern int ipc_bind (int, char const *) ;
extern int ipc_bind_reuse (int, char const *) ;
extern int ipc_bind_reuse_lock (int, char const *, int *) ;
extern int ipc_listen (int, int) ;

#define ipc_accept(s, path, len, trunc) ipc_accept_internal(s, path, len, (trunc), 0)
#define ipc_accept_nb(s, path, len, trunc) ipc_accept_internal(s, path, len, (trunc), O_NONBLOCK)
#define ipc_accept_coe(s, path, len, trunc) ipc_accept_internal(s, path, len, (trunc), O_CLOEXEC)
#define ipc_accept_nbcoe(s, path, len, trunc) ipc_accept_internal(s, path, len, (trunc), O_NONBLOCK|O_CLOEXEC)
extern int ipc_accept_internal (int, char *, size_t, int *, unsigned int) ;

extern int ipc_local (int, char *, size_t, int *) ;

extern int ipc_connect (int, char const *) ;
extern int ipc_connected (int) ;
extern int ipc_timed_connect (int, char const *, tain_t const *, tain_t *) ;
#define ipc_timed_connect_g(fd, path, deadline) ipc_timed_connect(fd, path, (deadline), &STAMP)

extern ssize_t ipc_send (int, char const *, size_t, char const *) ;
extern ssize_t ipc_recv (int, char *, size_t, char *) ;


/* INET and INET6 domain socket operations */
/* INET and INET6 domain sockets */

#define socket_tcp() socket_tcp4()
#define socket_tcp_b() socket_tcp4_b()
Expand All @@ -24,16 +75,16 @@ typedef socket_io_func_t *socket_io_func_t_ref ;

#define socket_tcp4() socket_tcp4_nb()
#define socket_tcp4_b() socket_tcp4_internal(0)
#define socket_tcp4_nb() socket_tcp4_internal(DJBUNIX_FLAG_NB)
#define socket_tcp4_coe() socket_tcp4_internal(DJBUNIX_FLAG_COE)
#define socket_tcp4_nbcoe() socket_tcp4_internal(DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define socket_tcp4_nb() socket_tcp4_internal(O_NONBLOCK)
#define socket_tcp4_coe() socket_tcp4_internal(O_CLOEXEC)
#define socket_tcp4_nbcoe() socket_tcp4_internal(O_NONBLOCK|O_CLOEXEC)
extern int socket_tcp4_internal (unsigned int) ;

#define socket_tcp6() socket_tcp6_nb()
#define socket_tcp6_b() socket_tcp6_internal(0)
#define socket_tcp6_nb() socket_tcp6_internal(DJBUNIX_FLAG_NB)
#define socket_tcp6_coe() socket_tcp6_internal(DJBUNIX_FLAG_COE)
#define socket_tcp6_nbcoe() socket_tcp6_internal(DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define socket_tcp6_nb() socket_tcp6_internal(O_NONBLOCK)
#define socket_tcp6_coe() socket_tcp6_internal(O_CLOEXEC)
#define socket_tcp6_nbcoe() socket_tcp6_internal(O_NONBLOCK|O_CLOEXEC)
extern int socket_tcp6_internal (unsigned int) ;

#define socket_udp() socket_udp4()
Expand All @@ -44,16 +95,16 @@ extern int socket_tcp6_internal (unsigned int) ;

#define socket_udp4() socket_udp4_nb()
#define socket_udp4_b() socket_udp4_internal(0)
#define socket_udp4_nb() socket_udp4_internal(DJBUNIX_FLAG_NB)
#define socket_udp4_coe() socket_udp4_internal(DJBUNIX_FLAG_COE)
#define socket_udp4_nbcoe() socket_udp4_internal(DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define socket_udp4_nb() socket_udp4_internal(O_NONBLOCK)
#define socket_udp4_coe() socket_udp4_internal(O_CLOEXEC)
#define socket_udp4_nbcoe() socket_udp4_internal(O_NONBLOCK|O_CLOEXEC)
extern int socket_udp4_internal (unsigned int) ;

#define socket_udp6() socket_udp6_nb()
#define socket_udp6_b() socket_udp6_internal(0)
#define socket_udp6_nb() socket_udp6_internal(DJBUNIX_FLAG_NB)
#define socket_udp6_coe() socket_udp6_internal(DJBUNIX_FLAG_COE)
#define socket_udp6_nbcoe() socket_udp6_internal(DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define socket_udp6_nb() socket_udp6_internal(O_NONBLOCK)
#define socket_udp6_coe() socket_udp6_internal(O_CLOEXEC)
#define socket_udp6_nbcoe() socket_udp6_internal(O_NONBLOCK|O_CLOEXEC)
extern int socket_udp6_internal (unsigned int) ;

extern int socket_waitconn (int, tain_t const *, tain_t *) ;
Expand All @@ -79,9 +130,9 @@ extern int socket_bind6 (int, char const *, uint16_t) ;
extern int socket_bind6_reuse (int, char const *, uint16_t) ;

#define socket_accept4(s, ip, port) socket_accept4_internal(s, ip, (port), 0)
#define socket_accept4_nb(s, ip, port) socket_accept4_internal(s, ip, (port), DJBUNIX_FLAG_NB)
#define socket_accept4_coe(s, ip, port) socket_accept4_internal(s, ip, (port), DJBUNIX_FLAG_COE)
#define socket_accept4_nbcoe(s, ip, port) socket_accept4_internal(s, ip, (port), DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define socket_accept4_nb(s, ip, port) socket_accept4_internal(s, ip, (port), O_NONBLOCK)
#define socket_accept4_coe(s, ip, port) socket_accept4_internal(s, ip, (port), O_CLOEXEC)
#define socket_accept4_nbcoe(s, ip, port) socket_accept4_internal(s, ip, (port), O_NONBLOCK|O_CLOEXEC)
extern int socket_accept4_internal (int, char *, uint16_t *, unsigned int) ;
extern socket_io_func_t socket_recv4 ;
extern ssize_t socket_send4 (int, char const *, size_t, char const *, uint16_t) ;
Expand All @@ -90,9 +141,9 @@ extern int socket_local4 (int, char *, uint16_t *) ;
extern int socket_remote4 (int, char *, uint16_t *) ;

#define socket_accept6(s, ip6, port) socket_accept6_internal(s, ip6, (port), 0)
#define socket_accept6_nb(s, ip6, port) socket_accept6_internal(s, ip6, (port), DJBUNIX_FLAG_NB)
#define socket_accept6_coe(s, ip6, port) socket_accept6_internal(s, ip6, (port), DJBUNIX_FLAG_COE)
#define socket_accept6_nbcoe(s, ip6, port) socket_accept6_internal(s, ip6, (port), DJBUNIX_FLAG_NB|DJBUNIX_FLAG_COE)
#define socket_accept6_nb(s, ip6, port) socket_accept6_internal(s, ip6, (port), O_NONBLOCK)
#define socket_accept6_coe(s, ip6, port) socket_accept6_internal(s, ip6, (port), O_CLOEXEC)
#define socket_accept6_nbcoe(s, ip6, port) socket_accept6_internal(s, ip6, (port), O_NONBLOCK|O_CLOEXEC)
extern int socket_accept6_internal (int, char *, uint16_t *, unsigned int) ;
extern socket_io_func_t socket_recv6 ;
extern ssize_t socket_send6 (int, char const *, size_t, char const *, uint16_t) ;
Expand Down
1 change: 0 additions & 1 deletion src/include/skalibs/stddjb.h
Expand Up @@ -51,6 +51,5 @@
#include <skalibs/strerr.h>
#include <skalibs/strerr2.h>
#include <skalibs/tai.h>
#include <skalibs/webipc.h>

#endif
63 changes: 0 additions & 63 deletions src/include/skalibs/webipc.h

This file was deleted.

2 changes: 1 addition & 1 deletion src/libstddjb/child_spawn1_socket.c
@@ -1,6 +1,6 @@
/* ISC license. */

#include <skalibs/webipc.h>
#include <skalibs/socket.h>
#include <skalibs/djbunix.h>
#include "djbunix-internal.h"

Expand Down
10 changes: 6 additions & 4 deletions src/libstddjb/ipc_accept.c
Expand Up @@ -6,9 +6,11 @@
#include <sys/un.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

#include <skalibs/bytestr.h>
#include <skalibs/djbunix.h>
#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_accept_internal (int s, char *p, size_t l, int *trunc, unsigned int options)
{
Expand All @@ -18,15 +20,15 @@ int ipc_accept_internal (int s, char *p, size_t l, int *trunc, unsigned int opti
memset(&sa, 0, dummy) ;
do
#ifdef SKALIBS_HASACCEPT4
fd = accept4(s, (struct sockaddr *)&sa, &dummy, ((options & DJBUNIX_FLAG_NB) ? SOCK_NONBLOCK : 0) | ((options & DJBUNIX_FLAG_COE) ? SOCK_CLOEXEC : 0)) ;
fd = accept4(s, (struct sockaddr *)&sa, &dummy, ((options & O_NONBLOCK) ? SOCK_NONBLOCK : 0) | ((options & O_CLOEXEC) ? SOCK_CLOEXEC : 0)) ;
#else
fd = accept(s, (struct sockaddr *)&sa, &dummy) ;
#endif
while ((fd == -1) && (errno == EINTR)) ;
if (fd == -1) return -1 ;
#ifndef SKALIBS_HASACCEPT4
if ((((options & DJBUNIX_FLAG_NB) ? ndelay_on(fd) : ndelay_off(fd)) < 0)
|| (((options & DJBUNIX_FLAG_COE) ? coe(fd) : uncoe(fd)) < 0))
if ((((options & O_NONBLOCK) ? ndelay_on(fd) : ndelay_off(fd)) < 0)
|| (((options & O_CLOEXEC) ? coe(fd) : uncoe(fd)) < 0))
{
fd_close(fd) ;
return -1 ;
Expand Down
3 changes: 1 addition & 2 deletions src/libstddjb/ipc_bind.c
@@ -1,13 +1,12 @@
/* ISC license. */

#include <skalibs/nonposix.h>

#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <errno.h>

#include <skalibs/webipc.h>
#include <skalibs/socket.h>
#include <skalibs/posixishard.h>

int ipc_bind (int s, char const *p)
Expand Down
2 changes: 1 addition & 1 deletion src/libstddjb/ipc_bind_reuse.c
@@ -1,6 +1,6 @@
/* ISC license. */

#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_bind_reuse (int s, char const *p)
{
Expand Down
6 changes: 4 additions & 2 deletions src/libstddjb/ipc_bind_reuse_lock.c
Expand Up @@ -8,7 +8,7 @@
#include <sys/socket.h>

#include <skalibs/djbunix.h>
#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_bind_reuse_lock (int s, char const *p, int *fdlock)
{
Expand All @@ -24,8 +24,10 @@ int ipc_bind_reuse_lock (int s, char const *p, int *fdlock)
r = fd_lock(fd, 1, 1) ;
if (r < 0) return -1 ;
if (!r) return (errno = EBUSY, -1) ;
r = errno ;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) ;
unlink(p) ;
errno = r ;
unlink_void(p) ;
if (ipc_bind(s, p) < 0) return -1 ;
*fdlock = fd ;
return 0 ;
Expand Down
3 changes: 1 addition & 2 deletions src/libstddjb/ipc_connect.c
@@ -1,13 +1,12 @@
/* ISC license. */

#include <skalibs/nonposix.h>

#include <errno.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>

#include <skalibs/webipc.h>
#include <skalibs/socket.h>
#include <skalibs/posixishard.h>

int ipc_connect (int s, char const *p)
Expand Down
3 changes: 2 additions & 1 deletion src/libstddjb/ipc_connected.c
Expand Up @@ -3,8 +3,9 @@
#include <skalibs/nonposix.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <skalibs/allreadwrite.h>
#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_connected (int s)
{
Expand Down
3 changes: 1 addition & 2 deletions src/libstddjb/ipc_dgram.c
Expand Up @@ -2,8 +2,7 @@

#include <skalibs/nonposix.h>
#include <sys/socket.h>
#include <skalibs/djbunix.h>
#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_datagram_internal (unsigned int flags)
{
Expand Down
2 changes: 1 addition & 1 deletion src/libstddjb/ipc_listen.c
Expand Up @@ -2,7 +2,7 @@

#include <skalibs/nonposix.h>
#include <sys/socket.h>
#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_listen (int s, int backlog)
{
Expand Down
3 changes: 2 additions & 1 deletion src/libstddjb/ipc_local.c
Expand Up @@ -4,8 +4,9 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>

#include <skalibs/bytestr.h>
#include <skalibs/webipc.h>
#include <skalibs/socket.h>

int ipc_local (int s, char *p, size_t l, int *trunc)
{
Expand Down

0 comments on commit e557bab

Please sign in to comment.