aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-03-12 07:21:50 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-03-12 07:21:50 +0000
commit6cc647ce9a9f6c34473cec22b1a1a457409fc25e (patch)
tree3eeb77deb9e1ab16a953527aa19cada328f80c83
parenta145c0051194faa705be1e2512e1b6331c4e4659 (diff)
downloadskalibs-6cc647ce9a9f6c34473cec22b1a1a457409fc25e.tar.gz
Add a cleanup hook to sassserver
-rw-r--r--package/deps.mak8
-rw-r--r--src/include/skalibs/sassserver.h9
-rw-r--r--src/libunixonacid/sassserver.c81
3 files changed, 77 insertions, 21 deletions
diff --git a/package/deps.mak b/package/deps.mak
index 7a69ab2..4da0e99 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -31,6 +31,7 @@ src/include/skalibs/genset.h: src/include/skalibs/functypes.h
src/include/skalibs/gensetdyn.h: src/include/skalibs/functypes.h src/include/skalibs/genalloc.h src/include/skalibs/stralloc.h
src/include/skalibs/gol.h: src/include/skalibs/uint64.h
src/include/skalibs/iopause.h: src/include/skalibs/tai.h
+src/include/skalibs/ip46.h: src/include/skalibs/fmtscan.h src/include/skalibs/socket.h src/include/skalibs/tai.h
src/include/skalibs/keventbridge.h: src/include/skalibs/sysdeps.h
src/include/skalibs/kolbak.h: src/include/skalibs/unixmessage.h
src/include/skalibs/lolstdio.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/strerr.h
@@ -41,7 +42,7 @@ src/include/skalibs/posixplz.h: src/include/skalibs/functypes.h src/include/skal
src/include/skalibs/prog.h: src/include/skalibs/types.h
src/include/skalibs/random.h: src/include/skalibs/functypes.h src/include/skalibs/stralloc.h
src/include/skalibs/sassclient.h: src/include/skalibs/genqdyn.h src/include/skalibs/gensetdyn.h src/include/skalibs/tai.h src/include/skalibs/textclient.h
-src/include/skalibs/sassserver.h: src/include/skalibs/avltree.h src/include/skalibs/gensetdyn.h src/include/skalibs/iopause.h src/include/skalibs/tai.h
+src/include/skalibs/sassserver.h: src/include/skalibs/avltree.h src/include/skalibs/functypes.h src/include/skalibs/gensetdyn.h src/include/skalibs/iopause.h src/include/skalibs/tai.h
src/include/skalibs/setgroups.h: src/include/skalibs/sysdeps.h
src/include/skalibs/sha512.h: src/include/skalibs/uint64.h
src/include/skalibs/sig.h: src/include/skalibs/gccattributes.h
@@ -58,6 +59,9 @@ src/include/skalibs/strerr2.h: src/include/skalibs/strerr.h
src/include/skalibs/tai.h: src/include/skalibs/gccattributes.h src/include/skalibs/uint64.h
src/include/skalibs/textclient.h: src/include/skalibs/allreadwrite.h src/include/skalibs/tai.h src/include/skalibs/textmessage.h
src/include/skalibs/textmessage.h: src/include/skalibs/allreadwrite.h src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h
+src/include/skalibs/types.h: src/include/skalibs/uint16.h src/include/skalibs/uint32.h src/include/skalibs/uint64.h
+src/include/skalibs/uint16.h: src/include/skalibs/uint64.h
+src/include/skalibs/uint32.h: src/include/skalibs/uint64.h
src/include/skalibs/unix-timed.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/functypes.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h
src/include/skalibs/unix-transactional.h: src/include/skalibs/direntry.h src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h
src/include/skalibs/unixconnection.h: src/include/skalibs/unixmessage.h
@@ -822,7 +826,7 @@ src/libunixonacid/sassclient_send.o src/libunixonacid/sassclient_send.lo: src/li
src/libunixonacid/sassclient_sendv.o src/libunixonacid/sassclient_sendv.lo: src/libunixonacid/sassclient_sendv.c src/include/skalibs/gensetdyn.h src/libunixonacid/sassclient-internal.h src/include/skalibs/sassclient.h src/include/skalibs/siovec.h src/include/skalibs/tai.h src/include/skalibs/textclient.h src/include/skalibs/uint32.h
src/libunixonacid/sassclient_start.o src/libunixonacid/sassclient_start.lo: src/libunixonacid/sassclient_start.c src/include/skalibs/genqdyn.h src/include/skalibs/gensetdyn.h src/include/skalibs/posixplz.h src/libunixonacid/sassclient-internal.h src/include/skalibs/sassclient.h src/include/skalibs/textclient.h
src/libunixonacid/sassclient_update.o src/libunixonacid/sassclient_update.lo: src/libunixonacid/sassclient_update.c src/include/skalibs/genqdyn.h src/include/skalibs/gensetdyn.h src/include/skalibs/posixishard.h src/libunixonacid/sassclient-internal.h src/include/skalibs/sassclient.h src/include/skalibs/textclient.h src/include/skalibs/uint32.h
-src/libunixonacid/sassserver.o src/libunixonacid/sassserver.lo: src/libunixonacid/sassserver.c src/include/skalibs/alloc.h src/include/skalibs/avltree.h src/include/skalibs/error.h src/include/skalibs/gensetdyn.h src/include/skalibs/iopause.h src/include/skalibs/sass.h src/include/skalibs/sassserver.h src/include/skalibs/strerr.h src/include/skalibs/tai.h src/include/skalibs/textclient.h src/include/skalibs/textmessage.h src/include/skalibs/uint32.h
+src/libunixonacid/sassserver.o src/libunixonacid/sassserver.lo: src/libunixonacid/sassserver.c src/include/skalibs/alloc.h src/include/skalibs/avltree.h src/include/skalibs/error.h src/include/skalibs/functypes.h src/include/skalibs/gensetdyn.h src/include/skalibs/iopause.h src/include/skalibs/sass.h src/include/skalibs/sassserver.h src/include/skalibs/strerr.h src/include/skalibs/tai.h src/include/skalibs/textclient.h src/include/skalibs/textmessage.h src/include/skalibs/uint32.h
src/libunixonacid/skaclient_default_cb.o src/libunixonacid/skaclient_default_cb.lo: src/libunixonacid/skaclient_default_cb.c src/include/skalibs/posixishard.h src/include/skalibs/skaclient.h src/include/skalibs/unixmessage.h
src/libunixonacid/skaclient_end.o src/libunixonacid/skaclient_end.lo: src/libunixonacid/skaclient_end.c src/include/skalibs/djbunix.h src/include/skalibs/skaclient.h src/include/skalibs/unixmessage.h
src/libunixonacid/skaclient_init.o src/libunixonacid/skaclient_init.lo: src/libunixonacid/skaclient_init.c src/libunixonacid/skaclient-internal.h src/include/skalibs/skaclient.h src/include/skalibs/unixmessage.h
diff --git a/src/include/skalibs/sassserver.h b/src/include/skalibs/sassserver.h
index 4294e59..a5a4453 100644
--- a/src/include/skalibs/sassserver.h
+++ b/src/include/skalibs/sassserver.h
@@ -6,6 +6,7 @@
#include <sys/uio.h>
#include <stdint.h>
+#include <skalibs/functypes.h>
#include <skalibs/tai.h>
#include <skalibs/iopause.h>
#include <skalibs/gensetdyn.h>
@@ -23,14 +24,16 @@ struct sassserver_s
sassserver_send_func_ref sendf ;
sassserver_cancel_func_ref cancelf ;
size_t datasize ;
+ free_func_ref cleanupf ;
+ void *aux ;
gensetdyn queries ;
avltree by_deadline ;
avltree by_id ;
} ;
-#define SASSSERVER_ZERO { .sendf = 0, .cancelf = 0, .datasize = 0, .queries = GENSETDYN_ZERO, .by_deadline = AVLTREE_ZERO, .by_id = AVLTREE_ZERO }
+#define SASSSERVER_ZERO { .sendf = 0, .cancelf = 0, .datasize = 0, .cleanupf = 0, .aux = 0, .queries = GENSETDYN_ZERO, .by_deadline = AVLTREE_ZERO, .by_id = AVLTREE_ZERO }
-extern void sassserver_init (sassserver *, char const *, char const *, sassserver_send_func_ref, sassserver_cancel_func_ref, size_t, tain const *, tain *stamp) ;
-#define sassserver_init_g(a, banner1, banner2, sendf, cancelf, esize, deadline) sassserver_init(a, banner1, banner2, sendf, cancelf, esize, (deadline), &STAMP)
+extern void sassserver_init (sassserver *, char const *, char const *, sassserver_send_func_ref, sassserver_cancel_func_ref, size_t, free_func_ref, void *, tain const *, tain *stamp) ;
+#define sassserver_init_g(a, banner1, banner2, sendf, cancelf, esize, cleanupf, aux, deadline) sassserver_init(a, banner1, banner2, sendf, cancelf, esize, cleanupf, aux, (deadline), &STAMP)
extern unsigned int sassserver_prepare_iopause (sassserver const *, iopause_fd *, tain *) ;
extern void sassserver_timeout (sassserver *) ;
extern int sassserver_event (sassserver *, iopause_fd const *) ;
diff --git a/src/libunixonacid/sassserver.c b/src/libunixonacid/sassserver.c
index 3644e9d..aa044c0 100644
--- a/src/libunixonacid/sassserver.c
+++ b/src/libunixonacid/sassserver.c
@@ -5,6 +5,7 @@
#include <stdint.h>
#include <errno.h>
+#include <skalibs/functypes.h>
#include <skalibs/uint32.h>
#include <skalibs/alloc.h>
#include <skalibs/error.h>
@@ -57,12 +58,15 @@ static int sassserver_id_cmp (void const *a, void const *b, void *aux)
return *aa < *bb ? -1 : *aa > *bb ;
}
-static void sassserver_sync_answer (int e)
+static void sassserver_sync_answer (sassserver *a, int e)
{
char pack[4] ;
uint32_pack_big(pack, (uint32_t)e) ;
if (!textmessage_put(textmessage_sender_1, pack, 4))
+ {
+ (*a->cleanupf)(a->aux) ;
strerr_diefu1sys(111, "textmessage_put") ;
+ }
}
static void sassserver_remove (sassserver *a, uint32_t handle)
@@ -86,18 +90,26 @@ static int sassserver_parse_protocol (struct iovec const *v, void *aux)
sassserver *a = aux ;
char const *s = v->iov_base ;
size_t vlen = v->iov_len ;
- if (vlen-- < 5) strerr_dief1x(100, "invalid client request") ;
+ if (vlen-- < 5)
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_dief1x(100, "invalid client request") ;
+ }
switch (*s++)
{
case '-' : /* cancel */
{
uint32_t handle, id ;
- if (vlen != 4) strerr_dief1x(100, "invalid client request") ;
+ if (vlen != 4)
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_dief1x(100, "invalid client request") ;
+ }
uint32_unpack_big(s, &id) ;
- if (!avltree_search(&a->by_id, &id, &handle)) sassserver_sync_answer(EINVAL) ;
+ if (!avltree_search(&a->by_id, &id, &handle)) sassserver_sync_answer(a, EINVAL) ;
(*a->cancelf)(SASSSERVER_QUERY(a, handle)->data) ;
sassserver_remove(a, handle) ;
- sassserver_sync_answer(0) ;
+ sassserver_sync_answer(a, 0) ;
break ;
}
case '+' : /* send */
@@ -109,15 +121,27 @@ static int sassserver_parse_protocol (struct iovec const *v, void *aux)
uint32_t opcode ;
uint32_t len ;
int e ;
- if (vlen < 20) strerr_dief1x(100, "invalid client request") ;
- if (!gensetdyn_new(&a->queries, &handle)) strerr_diefu1sys(111, "gensetdyn_new") ;
+ if (vlen < 20)
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_dief1x(100, "invalid client request") ;
+ }
+ if (!gensetdyn_new(&a->queries, &handle))
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_diefu1sys(111, "gensetdyn_new") ;
+ }
p = SASSSERVER_QUERY(a, handle) ;
uint32_unpack_big(s, &p->id) ; s += 4 ; vlen -= 4 ;
uint32_unpack_big(s, &flags) ; s += 4 ; vlen -= 4 ;
uint32_unpack_big(s, &timeout) ; s += 4 ; vlen -= 4 ;
uint32_unpack_big(s, &opcode) ; s += 4 ; vlen -= 4 ;
uint32_unpack_big(s, &len) ; s += 4 ; vlen -= 4 ;
- if (len != vlen) strerr_dief1x(100, "invalid client request") ;
+ if (len != vlen)
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_dief1x(100, "invalid client request") ;
+ }
if (timeout)
{
if (!tain_from_millisecs(&p->deadline, timeout)) strerr_dief1x(100, "invalid client request") ;
@@ -125,19 +149,29 @@ static int sassserver_parse_protocol (struct iovec const *v, void *aux)
}
else tain_add_g(&p->deadline, &tain_infinite_relative) ;
sassserver_uniquify(a, &p->deadline) ;
- if (!avltree_insert(&a->by_deadline, handle)) strerr_diefu1sys(111, "avltree_insert") ;
- if (!avltree_insert(&a->by_id, handle)) strerr_diefu1sys(111, "avltree_insert") ;
+ if (!avltree_insert(&a->by_deadline, handle)
+ || !avltree_insert(&a->by_id, handle))
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_diefu1sys(111, "avltree_insert") ;
+ }
if (!p->data)
{
p->data = alloc(a->datasize) ;
- if (!p->data) strerr_diefu1sys(111, "alloc") ;
+ if (!p->data)
+ {
+ (*a->cleanupf)(a->aux) ;
+ strerr_diefu1sys(111, "alloc") ;
+ }
}
e = (*a->sendf)(p->data, handle, flags, opcode, s, len) ;
if (e) sassserver_remove(a, handle) ;
- sassserver_sync_answer(e) ;
+ sassserver_sync_answer(a, e) ;
break ;
}
- default : strerr_dief1x(100, "invalid client request") ;
+ default :
+ (*a->cleanupf)(a->aux) ;
+ strerr_dief1x(100, "invalid client request") ;
}
return 1 ;
}
@@ -157,7 +191,10 @@ void sassserver_async_failure (sassserver *a, uint32_t handle, int e)
uint32_pack_big(pack, p->id) ;
uint32_pack_big(pack + 4, (uint32_t)e) ;
if (!textmessage_put(textmessage_sender_x, pack, 8))
+ {
+ (*a->cleanupf)(a->aux) ;
strerr_diefu1sys(111, "textmessage_put") ;
+ }
sassserver_remove(a, handle) ;
}
@@ -170,7 +207,10 @@ void sassserver_async_successv (sassserver *a, uint32_t handle, uint32_t flags,
for (unsigned int i = 0 ; i < n ; i++) vv[i+1] = v[i] ;
uint32_pack_big(pack, p->id) ;
if (!textmessage_putv(textmessage_sender_x, vv, n+1))
+ {
+ (*a->cleanupf)(a->aux) ;
strerr_diefu1sys(111, "textmessage_putv") ;
+ }
if (!(flags & SASS_FLAGS_KEEP)) sassserver_remove(a, handle) ;
}
@@ -180,13 +220,15 @@ void sassserver_async_success (sassserver *a, uint32_t handle, uint32_t flags, c
sassserver_async_successv(a, handle, flags, &v, 1) ;
}
-void sassserver_init (sassserver *a, char const *banner1, char const *banner2, sassserver_send_func_ref sendf, sassserver_cancel_func_ref cancelf, size_t datasize, tain const *deadline, tain *stamp)
+void sassserver_init (sassserver *a, char const *banner1, char const *banner2, sassserver_send_func_ref sendf, sassserver_cancel_func_ref cancelf, size_t datasize, free_func_ref cleanupf, void *aux, tain const *deadline, tain *stamp)
{
if (!textclient_server_01x_init(banner1, strlen(banner1), banner2, strlen(banner2), deadline, stamp))
strerr_diefu1sys(111, "sync with client") ;
a->sendf = sendf ;
a->cancelf = cancelf ;
a->datasize = datasize ;
+ a->cleanupf = cleanupf ;
+ a->aux = aux ;
gensetdyn_init(&a->queries, sizeof(sassserver_query), 8, 3, 8) ;
avltree_init(&a->by_deadline, 8, 3, 8, &sassserver_deadline_dtok, &sassserver_deadline_cmp, &a->queries) ;
avltree_init(&a->by_id, 8, 3, 8, &sassserver_id_dtok, &sassserver_id_cmp, &a->queries) ;
@@ -224,17 +266,24 @@ int sassserver_event (sassserver *a, iopause_fd const *x)
{
if (x[1].revents & IOPAUSE_WRITE)
if (!textmessage_sender_flush(textmessage_sender_1) && !error_isagain(errno))
+ {
+ (*a->cleanupf)(a->aux) ;
strerr_diefu1sys(111, "flush stdout") ;
+ }
if (x[2].revents & IOPAUSE_WRITE)
if (!textmessage_sender_flush(textmessage_sender_x) && !error_isagain(errno))
+ {
+ (*a->cleanupf)(a->aux) ;
strerr_diefu1sys(111, "flush asyncout") ;
+ }
if (!textmessage_receiver_isempty(textmessage_receiver_0) || x[0].revents & IOPAUSE_READ)
{
if (textmessage_handle(textmessage_receiver_0, &sassserver_parse_protocol, a) == -1)
{
- if (errno != EPIPE) strerr_diefu1sys(111, "read messages from client") ;
- return 1 ;
+ if (errno == EPIPE) return 1 ;
+ (*a->cleanupf)(a->aux) ;
+ strerr_diefu1sys(111, "read messages from client") ;
}
}
return 0 ;