summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2020-11-30 13:06:32 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2020-11-30 13:06:32 +0000
commit940294e0758239f337f76f3c0f096a8cd632f2ca (patch)
tree3f72411c73d60fde0d5a21d1714e792d82cd6895
parent74b9e54d92a0b0937b457b2a2e4e5bc3a5eae783 (diff)
downloadskabus-940294e0758239f337f76f3c0f096a8cd632f2ca.tar.xz
Fix build; adapt to skalibs-2.10.0.0
-rw-r--r--src/include/skabus/pub.h1
-rw-r--r--src/misc/skabus-dyntee-client.c20
-rw-r--r--src/misc/skabus-dyntee.c10
-rw-r--r--src/pub/skabus-pub-daemon.c6
-rw-r--r--src/pub/skabus-pubd.c109
-rw-r--r--src/rpc/skabus-rpc-client.c8
-rw-r--r--src/rpc/skabus-rpc-daemon.c9
7 files changed, 71 insertions, 92 deletions
diff --git a/src/include/skabus/pub.h b/src/include/skabus/pub.h
index 68168d0..e8ee2e3 100644
--- a/src/include/skabus/pub.h
+++ b/src/include/skabus/pub.h
@@ -18,6 +18,7 @@
/* Misc constants */
#define SKABUS_PUB_MAX 4000
+#define SKABUS_PUB_MAXFDS 4000
#define SKABUS_PUB_BANNER1 "skabus_pub v1.0 (b)\n"
#define SKABUS_PUB_BANNER1_LEN (sizeof SKABUS_PUB_BANNER1 - 1)
#define SKABUS_PUB_BANNER2 "skabus_pub v1.0 (a)\n"
diff --git a/src/misc/skabus-dyntee-client.c b/src/misc/skabus-dyntee-client.c
index b73980d..907c97b 100644
--- a/src/misc/skabus-dyntee-client.c
+++ b/src/misc/skabus-dyntee-client.c
@@ -1,17 +1,17 @@
/* ISC license. */
-#include <skalibs/nonposix.h>
-#include <sys/socket.h>
#include <skalibs/sgetopt.h>
#include <skalibs/strerr2.h>
#include <skalibs/djbunix.h>
#include <skalibs/webipc.h>
+#include <skalibs/exec.h>
#define USAGE "skabus-dyntee-client path prog..."
#define dieusage() strerr_dieusage(100, USAGE)
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
{
+ int fd ;
PROG = "skabus-dyntee-client" ;
{
subgetopt_t l = SUBGETOPT_ZERO ;
@@ -28,12 +28,10 @@ int main (int argc, char const *const *argv, char const *const *envp)
if (argc < 2) dieusage() ;
}
- {
- int fd = ipc_stream_b() ;
- if (fd < 0) strerr_diefu1sys(111, "create socket") ;
- if (!ipc_connect(fd, argv[0])) strerr_diefu2sys(111, "connect to ", argv[0]) ;
- if (shutdown(fd, SHUT_WR) < 0) strerr_diefu1sys(111, "shutdown socket for writing") ;
- if (fd_move(0, fd) < 0) strerr_diefu1sys(111, "move socket fd to stdin") ;
- }
- xpathexec_run(argv[1], argv+1, envp) ;
+ fd = ipc_stream_b() ;
+ if (fd < 0) strerr_diefu1sys(111, "create socket") ;
+ if (!ipc_connect(fd, argv[0])) strerr_diefu2sys(111, "connect to ", argv[0]) ;
+ fd_shutdown(fd, 1) ;
+ if (fd_move(0, fd) < 0) strerr_diefu1sys(111, "move socket fd to stdin") ;
+ xexec(argv+1) ;
}
diff --git a/src/misc/skabus-dyntee.c b/src/misc/skabus-dyntee.c
index f0832c4..1fd389b 100644
--- a/src/misc/skabus-dyntee.c
+++ b/src/misc/skabus-dyntee.c
@@ -2,18 +2,22 @@
#include <unistd.h>
#include <limits.h>
+
#include <skalibs/types.h>
#include <skalibs/sgetopt.h>
#include <skalibs/strerr2.h>
-#include <skalibs/djbunix.h>
+#include <skalibs/exec.h>
+
#include <execline/config.h>
+
#include <s6/config.h>
+
#include <skabus/config.h>
#define USAGE "skabus-dyntee [ -d | -D ] [ -1 ] [ -c maxconn ] [ -b backlog ] [ -G gid,gid,... ] [ -g gid ] [ -u uid ] [ -U ] [ -t timeout ] [ -T lameducktimeout ] [ -i rulesdir | -x rulesfile ] socketpath"
#define dieusage() strerr_dieusage(100, USAGE)
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
{
int flag1 = 0 ;
int flagU = 0 ;
@@ -144,6 +148,6 @@ int main (int argc, char const *const *argv, char const *const *envp)
newargv[m++] = rulesfile ;
}
newargv[m++] = 0 ;
- xpathexec_run(newargv[0], newargv, envp) ;
+ xexec(newargv) ;
}
}
diff --git a/src/pub/skabus-pub-daemon.c b/src/pub/skabus-pub-daemon.c
index a865186..b27c04e 100644
--- a/src/pub/skabus-pub-daemon.c
+++ b/src/pub/skabus-pub-daemon.c
@@ -6,7 +6,7 @@
#include <skalibs/types.h>
#include <skalibs/sgetopt.h>
#include <skalibs/strerr2.h>
-#include <skalibs/djbunix.h>
+#include <skalibs/exec.h>
#include <s6/config.h>
@@ -15,7 +15,7 @@
#define USAGE "skabus-pub-daemon [ -v verbosity ] [ -d | -D ] [ -1 ] [ -c maxconn ] [ -b backlog ] [ -G gid,gid,... ] [ -g gid ] [ -u uid ] [ -U ] [ -t timeout ] [ -T lameducktimeout ] [ -i rulesdir | -x rulesfile ] [ -S | -s ] [ -k announcere ] path msgfsdir"
#define dieusage() strerr_dieusage(100, USAGE)
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
{
unsigned int verbosity = 1 ;
int flag1 = 0 ;
@@ -157,6 +157,6 @@ int main (int argc, char const *const *argv, char const *const *envp)
newargv[m++] = "--" ;
newargv[m++] = *argv++ ;
newargv[m++] = 0 ;
- xpathexec_run(newargv[0], newargv, envp) ;
+ xexec(newargv) ;
}
}
diff --git a/src/pub/skabus-pubd.c b/src/pub/skabus-pubd.c
index c34abff..44a079f 100644
--- a/src/pub/skabus-pubd.c
+++ b/src/pub/skabus-pubd.c
@@ -39,7 +39,7 @@
#include <skabus/pub.h>
-#define USAGE "skabus-pubd [ -v verbosity ] [ -1 ] [ -c maxconn ] [ -t timeout ] [ -T lameducktimeout ] [ -i rulesdir | -x rulesfile ] [ -S | -s ] [ -k controlre ] msgfsdir"
+#define USAGE "skabus-pubd [ -v verbosity ] [ -1 ] [ -c maxconn ] [ -t timeout ] [ -T lameducktimeout ] [ -i rulesdir | -x rulesfile ] [ -S | -s ] [ -k controlre ] [ -m maxfds ] msgfsdir"
#define dieusage() strerr_dieusage(100, USAGE) ;
#define dienomem() strerr_diefu1sys(111, "stralloc_catb") ;
#define die() strerr_dief1sys(101, "unexpected error") ;
@@ -52,6 +52,9 @@ static uint64_t serial = 1 ;
static tain_t answertto = TAIN_INFINITE_RELATIVE ;
static tain_t lameduckdeadline = TAIN_INFINITE_RELATIVE ;
static int flagidstrpub = 0 ;
+static unsigned int maxfds = 1000 ;
+static uint32_t *fdcount ;
+static int maxed = 0 ;
static unsigned int rulestype = 0 ;
static char const *rules = 0 ;
@@ -97,68 +100,30 @@ static void handle_signals (void)
}
}
-static void *uint32_dtok (uint32_t d, void *x)
-{
- (void)x ;
- return (void *)(uintptr_t)d ;
-}
-
-static int ptr_cmp (void const *a, void const *b, void *x)
+static void fdcount_closecb (int fd, void *p)
{
- (void)x ;
- return a < b ? -1 : a > b ;
+ if (!--fdcount[fd])
+ {
+ fd_close(fd) ;
+ maxed = 0 ;
+ }
}
- /* fd reference counter */
-
-typedef struct fdcount_s fdcount_t, *fdcount_t_ref ;
-struct fdcount_s
-{
- int fd ;
- uint32_t n ;
-} ;
-
-static void *fdcount_dtok (uint32_t d, void *x)
-{
- return &GENSETDYN_P(fdcount_t, (gensetdyn *)x, d)->fd ;
-}
+ /* client */
-static int fd_cmp (void const *a, void const *b, void *x)
+static void *uint32_dtok (uint32_t d, void *x)
{
- int fda = *(int *)a ;
- int fdb = *(int *)b ;
(void)x ;
- return fda < fdb ? -1 : fda > fdb ;
-}
-
-static gensetdyn fdcountblob = GENSETDYN_INIT(fdcount_t, 3, 3, 8) ;
-static avltree fdcountmap = AVLTREE_INIT(3, 3, 8, &fdcount_dtok, &fd_cmp, &fdcountblob) ;
-#define FDCOUNT(i) GENSETDYN_P(fdcount_t, &fdcountblob, (i))
-
-static inline fdcount_t *fdcount_search (int fd)
-{
- uint32_t d ;
- fdcount_t *p ;
- if (avltree_search(&fdcountmap, &fd, &d)) return FDCOUNT(d) ;
- if (!gensetdyn_new(&fdcountblob, &d)) dienomem() ;
- p = FDCOUNT(d) ;
- p->fd = fd ;
- p->n = 0 ;
- if (!avltree_insert(&fdcountmap, d)) dienomem() ;
- return p ;
+ return (void *)(uintptr_t)d ;
}
-static void fdcount_closecb (int fd, void *p)
+static int ptr_cmp (void const *a, void const *b, void *x)
{
- uint32_t d ;
- avltree_search(&fdcountmap, &fd, &d) ;
- if (!--FDCOUNT(d)->n) fd_close(fd) ;
+ (void)x ;
+ return a < b ? -1 : a > b ;
}
-
- /* client */
-
typedef struct client_s client_t, *client_t_ref ;
struct client_s
{
@@ -244,10 +209,10 @@ static inline int client_prepare_iopause (uint32_t i, tain_t *deadline, iopause_
{
client_t *c = CLIENT(i) ;
if (tain_less(&c->deadline, deadline)) *deadline = c->deadline ;
- if (!unixmessage_sender_isempty(&c->sync.out) || !unixmessage_receiver_isempty(&c->sync.in) || (cont && !unixmessage_receiver_isfull(&c->sync.in)))
+ x[*j].events = (maxed || unixmessage_receiver_isfull(&c->sync.in) || (unixmessage_receiver_isempty(&c->sync.in) && !cont) ? 0 : IOPAUSE_READ) | (unixmessage_sender_isempty(&c->sync.out) ? 0 : IOPAUSE_WRITE) ;
+ if (x[*j].events)
{
x[*j].fd = unixmessage_sender_fd(&c->sync.out) ;
- x[*j].events = (!unixmessage_receiver_isempty(&c->sync.in) || (cont && !unixmessage_receiver_isfull(&c->sync.in)) ? IOPAUSE_READ : 0) | (!unixmessage_sender_isempty(&c->sync.out) ? IOPAUSE_WRITE : 0) ;
c->xindexsync = (*j)++ ;
}
else c->xindexsync = 0 ;
@@ -280,8 +245,7 @@ static int enqueue_message (uint32_t dd, unixmessage_t const *m)
client_t *d = CLIENT(dd) ;
if (!unixmessage_put_and_close(&d->asyncout, m, unixmessage_bits_closeall)) return 0 ;
client_setdeadline(d) ;
- for (unsigned int i = 0 ; i < m->nfds ; i++)
- fdcount_search(m->fds[i])->n++ ;
+ for (unsigned int i = 0 ; i < m->nfds ; i++) fdcount[m->fds[i]]++ ;
return 1 ;
}
@@ -800,7 +764,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
unsigned int t = 0, T = 0 ;
for (;;)
{
- int opt = subgetopt_r(argc, argv, "v:Ss1c:k:i:x:t:T:", &l) ;
+ int opt = subgetopt_r(argc, argv, "v:Ss1c:k:i:x:t:T:m:", &l) ;
if (opt == -1) break ;
switch (opt)
{
@@ -814,6 +778,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
case 't' : if (!uint0_scan(l.arg, &t)) dieusage() ; break ;
case 'T' : if (!uint0_scan(l.arg, &T)) dieusage() ; break ;
case 'c' : if (!uint0_scan(l.arg, &maxconn)) dieusage() ; break ;
+ case 'm' : if (!uint0_scan(l.arg, &maxfds)) dieusage() ; break ;
default : dieusage() ;
}
}
@@ -824,6 +789,8 @@ int main (int argc, char const *const *argv, char const *const *envp)
if (!argc) dieusage() ;
if (maxconn > SKABUS_PUB_MAX) maxconn = SKABUS_PUB_MAX ;
if (!maxconn) maxconn = 1 ;
+ if (maxfds > SKABUS_PUB_MAXFDS) maxfds = SKABUS_PUB_MAXFDS ;
+ if (maxfds < 10) maxfds = 10 ;
{
struct stat st ;
if (fstat(0, &st) < 0) strerr_diefu1sys(111, "fstat stdin") ;
@@ -868,6 +835,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
{ /* I present to you: the stack */
client_t clientstorage[1+maxconn] ;
uint32_t clientfreelist[1+maxconn] ;
+ uint32_t fdcountblob[6 + maxfds + maxconn] ;
iopause_fd x[2 + (maxconn << 1)] ;
AVLTREEN_DECLARE_AND_INIT(blobmap, 1+maxconn, &idstr_dtok, &idstr_cmp, 0) ;
@@ -890,6 +858,8 @@ int main (int argc, char const *const *argv, char const *const *envp)
clientmap = &blobmap ;
x[0].fd = spfd ; x[0].events = IOPAUSE_READ ;
x[1].fd = 0 ;
+ for (unsigned int i = 0 ; i < sizeof(fdcountblob) / sizeof(uint32_t) ; i++) fdcountblob[i] = 0 ;
+ fdcount = fdcountblob ;
if (flag1)
{
@@ -931,21 +901,22 @@ int main (int argc, char const *const *argv, char const *const *envp)
for (j = sentinel, i = clientstorage[sentinel].next ; i != sentinel ; j = i, i = clientstorage[i].next)
if (!client_flush(i, x)) remove(&i, j) ;
- for (j = sentinel, i = clientstorage[sentinel].next ; i != sentinel ; j = i, i = clientstorage[i].next)
- switch (client_read(i, x))
- {
- case 0 : errno = 0 ;
- case -1 :
- case -2 :
+ if (!maxed)
+ for (j = sentinel, i = clientstorage[sentinel].next ; i != sentinel ; j = i, i = clientstorage[i].next)
+ switch (client_read(i, x))
{
- char what[2] = "-" ;
- what[1] = errno ;
- if (!announce(what, 2, CLIENT(i)->idstr)) dienomem() ;
+ case 0 : errno = 0 ;
+ case -1 :
+ case -2 :
+ {
+ char what[2] = "-" ;
+ what[1] = errno ;
+ if (!announce(what, 2, CLIENT(i)->idstr)) dienomem() ;
+ }
+ remove(&i, j) ;
+ case 1 : break ;
+ default : errno = EILSEQ ; die() ;
}
- remove(&i, j) ;
- case 1 : break ;
- default : errno = EILSEQ ; die() ;
- }
if (x[1].revents & IOPAUSE_READ)
{
diff --git a/src/rpc/skabus-rpc-client.c b/src/rpc/skabus-rpc-client.c
index 9cf9efe..bd7566d 100644
--- a/src/rpc/skabus-rpc-client.c
+++ b/src/rpc/skabus-rpc-client.c
@@ -3,15 +3,17 @@
#include <skalibs/types.h>
#include <skalibs/sgetopt.h>
#include <skalibs/strerr2.h>
-#include <skalibs/djbunix.h>
+#include <skalibs/exec.h>
+
#include <s6/config.h>
+
#include <skabus/config.h>
#include "skabus-rpcc.h"
#define USAGE "skabus-rpc-client [ -v verbosity ] [ -d | -D ] [ -1 ] [ -c maxconn ] [ -b backlog ] [ -t timeout ] [ -T lameducktimeout ] [ -C pmprog:sep:flags ] [ -y ifname:ifprog:sep:flags ... ] rpccpath rpcdpath clientname"
#define dieusage() strerr_dieusage(100, USAGE)
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
{
unsigned int verbosity = 1 ;
int flag1 = 0 ;
@@ -115,6 +117,6 @@ int main (int argc, char const *const *argv, char const *const *envp)
newargv[m++] = *argv++ ;
newargv[m++] = *argv++ ;
newargv[m++] = 0 ;
- xpathexec_run(newargv[0], newargv, envp) ;
+ xexec(newargv) ;
}
}
diff --git a/src/rpc/skabus-rpc-daemon.c b/src/rpc/skabus-rpc-daemon.c
index 14be950..76a8e1e 100644
--- a/src/rpc/skabus-rpc-daemon.c
+++ b/src/rpc/skabus-rpc-daemon.c
@@ -2,17 +2,20 @@
#include <sys/types.h>
#include <limits.h>
+
#include <skalibs/types.h>
#include <skalibs/sgetopt.h>
#include <skalibs/strerr2.h>
-#include <skalibs/djbunix.h>
+#include <skalibs/exec.h>
+
#include <s6/config.h>
+
#include <skabus/config.h>
#define USAGE "skabus-rpc-daemon [ -v verbosity ] [ -d | -D ] [ -1 ] [ -c maxconn ] [ -b backlog ] [ -G gid,gid,... ] [ -g gid ] [ -u uid ] [ -U ] [ -t timeout ] [ -T lameducktimeout ] [ -i rulesdir | -x rulesfile ] [ -S | -s ] [ -J | -j ] path"
#define dieusage() strerr_dieusage(100, USAGE)
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char const *const *argv)
{
unsigned int verbosity = 1 ;
int flag1 = 0 ;
@@ -149,6 +152,6 @@ int main (int argc, char const *const *argv, char const *const *envp)
newargv[m++] = rulesfile ;
}
newargv[m++] = 0 ;
- xpathexec_run(newargv[0], newargv, envp) ;
+ xexec(newargv) ;
}
}