diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2026-03-12 07:21:50 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2026-03-12 07:21:50 +0000 |
| commit | 6cc647ce9a9f6c34473cec22b1a1a457409fc25e (patch) | |
| tree | 3eeb77deb9e1ab16a953527aa19cada328f80c83 | |
| parent | a145c0051194faa705be1e2512e1b6331c4e4659 (diff) | |
| download | skalibs-6cc647ce9a9f6c34473cec22b1a1a457409fc25e.tar.gz | |
Add a cleanup hook to sassserver
| -rw-r--r-- | package/deps.mak | 8 | ||||
| -rw-r--r-- | src/include/skalibs/sassserver.h | 9 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver.c | 81 |
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 ; |
