diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2026-04-07 14:28:10 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2026-04-07 14:28:10 +0000 |
| commit | b8afece8d141369c25027b73680deccf48ddb948 (patch) | |
| tree | b01d7ec3e3bcb72e6ceacf2a2612a4fadc63b9da /src | |
| parent | cce8bb24ca6ebc98b787f087d76334f5e38daf2a (diff) | |
| download | skalibs-b8afece8d141369c25027b73680deccf48ddb948.tar.gz | |
Support running from a socket again in sassserver
A sassserver can run the same when forked or spawned from a
local service, that's the point of textclient. Most sassservers
don't need local service support in any way, and cutting the
support from that saves pulling a good amount of code, but some
do. Put back local service support while refactoring the code
so running as a child from the client (common case) doesn't pull
the socket code.
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/skalibs/sassserver.h | 5 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver-internal.h | 24 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver.c | 57 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver_init.c | 13 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver_init_frompipe.c | 13 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver_init_fromsocket.c | 13 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver_init_structures.c | 47 |
7 files changed, 116 insertions, 56 deletions
diff --git a/src/include/skalibs/sassserver.h b/src/include/skalibs/sassserver.h index d74eaf2..6b5bc53 100644 --- a/src/include/skalibs/sassserver.h +++ b/src/include/skalibs/sassserver.h @@ -34,6 +34,11 @@ struct sassserver_s 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 void sassserver_init_frompipe (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_frompipe_g(a, banner1, banner2, sendf, cancelf, esize, cleanupf, aux, deadline) sassserver_init(a, banner1, banner2, sendf, cancelf, esize, cleanupf, aux, (deadline), &STAMP) +extern void sassserver_init_fromsocket (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_fromsocketg(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 void sassserver_write_event (sassserver *, iopause_fd const *) ; diff --git a/src/libunixonacid/sassserver-internal.h b/src/libunixonacid/sassserver-internal.h new file mode 100644 index 0000000..71f8a38 --- /dev/null +++ b/src/libunixonacid/sassserver-internal.h @@ -0,0 +1,24 @@ +/* ISC license. */ + +#ifndef SKALIBS_SASSSERVER_INTERNAL_H +#define SKALIBS_SASSSERVER_INTERNAL_H + +#include <stdint.h> + +#include <skalibs/functypes.h> +#include <skalibs/tai.h> +#include <skalibs/sassserver.h> + +typedef struct sassserver_query_s sassserver_query, sassserver_query_ref ; +struct sassserver_query_s +{ + uint32_t id ; + tain deadline ; + void *data ; +} ; + +#define SASSSERVER_QUERY(a, i) GENSETDYN_P(sassserver_query, &(a)->queries, i) + +extern void sassserver_init_structures (sassserver *a, sassserver_send_func_ref, sassserver_cancel_func_ref, size_t, free_func_ref, void *) ; + +#endif diff --git a/src/libunixonacid/sassserver.c b/src/libunixonacid/sassserver.c index d15fc5a..e87084d 100644 --- a/src/libunixonacid/sassserver.c +++ b/src/libunixonacid/sassserver.c @@ -5,7 +5,6 @@ #include <stdint.h> #include <errno.h> -#include <skalibs/functypes.h> #include <skalibs/uint32.h> #include <skalibs/alloc.h> #include <skalibs/error.h> @@ -18,45 +17,7 @@ #include <skalibs/textclient.h> #include <skalibs/sass.h> #include <skalibs/sassserver.h> - - - /* Private */ - -typedef struct sassserver_query_s sassserver_query, sassserver_query_ref ; -struct sassserver_query_s -{ - uint32_t id ; - tain deadline ; - void *data ; -} ; - -#define SASSSERVER_QUERY(a, i) GENSETDYN_P(sassserver_query, &(a)->queries, i) - -static void *sassserver_deadline_dtok (uint32_t d, void *aux) -{ - return &GENSETDYN_P(sassserver_query, (gensetdyn *)aux, d)->deadline ; -} - -static int sassserver_deadline_cmp (void const *a, void const *b, void *aux) -{ - tain const *aa = a ; - tain const *bb = b ; - (void)aux ; - return tain_less(aa, bb) ? -1 : tain_less(bb, aa) ; -} - -static void *sassserver_id_dtok (uint32_t d, void *aux) -{ - return &GENSETDYN_P(sassserver_query, (gensetdyn *)aux, d)->id ; -} - -static int sassserver_id_cmp (void const *a, void const *b, void *aux) -{ - uint32_t const *aa = a ; - uint32_t const *bb = b ; - (void)aux ; - return *aa < *bb ? -1 : *aa > *bb ; -} +#include "sassserver-internal.h" static void sassserver_sync_answer (sassserver *a, int e) { @@ -178,8 +139,6 @@ static int sassserver_parse_protocol (struct iovec const *v, void *aux) } - /* Public */ - void *sassserver_data (sassserver const *a, uint32_t handle) { return SASSSERVER_QUERY(a, handle)->data ; @@ -221,20 +180,6 @@ 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, free_func_ref cleanupf, void *aux, tain const *deadline, tain *stamp) -{ - if (!textclient_server_01x_init_frompipe(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) ; -} - unsigned int sassserver_prepare_iopause (sassserver const *a, iopause_fd *x, tain *deadline) { uint32_t i ; diff --git a/src/libunixonacid/sassserver_init.c b/src/libunixonacid/sassserver_init.c new file mode 100644 index 0000000..9aa0725 --- /dev/null +++ b/src/libunixonacid/sassserver_init.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include <skalibs/strerr.h> +#include <skalibs/textclient.h> +#include <skalibs/sassserver.h> +#include "sassserver-internal.h" + +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") ; + sassserver_init_structures(a, sendf, cancelf, datasize, cleanupf, aux) ; +} diff --git a/src/libunixonacid/sassserver_init_frompipe.c b/src/libunixonacid/sassserver_init_frompipe.c new file mode 100644 index 0000000..e75e60b --- /dev/null +++ b/src/libunixonacid/sassserver_init_frompipe.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include <skalibs/strerr.h> +#include <skalibs/textclient.h> +#include <skalibs/sassserver.h> +#include "sassserver-internal.h" + +void sassserver_init_frompipe (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_frompipe(banner1, strlen(banner1), banner2, strlen(banner2), deadline, stamp)) + strerr_diefu1sys(111, "sync with client") ; + sassserver_init_structures(a, sendf, cancelf, datasize, cleanupf, aux) ; +} diff --git a/src/libunixonacid/sassserver_init_fromsocket.c b/src/libunixonacid/sassserver_init_fromsocket.c new file mode 100644 index 0000000..48fd1d4 --- /dev/null +++ b/src/libunixonacid/sassserver_init_fromsocket.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include <skalibs/strerr.h> +#include <skalibs/textclient.h> +#include <skalibs/sassserver.h> +#include "sassserver-internal.h" + +void sassserver_init_fromsocket (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_fromsocket(banner1, strlen(banner1), banner2, strlen(banner2), deadline, stamp)) + strerr_diefu1sys(111, "sync with client") ; + sassserver_init_structures(a, sendf, cancelf, datasize, cleanupf, aux) ; +} diff --git a/src/libunixonacid/sassserver_init_structures.c b/src/libunixonacid/sassserver_init_structures.c new file mode 100644 index 0000000..ddb1d28 --- /dev/null +++ b/src/libunixonacid/sassserver_init_structures.c @@ -0,0 +1,47 @@ +/* ISC license. */ + +#include <stdint.h> + +#include <skalibs/tai.h> +#include <skalibs/gensetdyn.h> +#include <skalibs/avltree.h> +#include <skalibs/sassserver.h> +#include "sassserver-internal.h" + +static void *sassserver_deadline_dtok (uint32_t d, void *aux) +{ + return &GENSETDYN_P(sassserver_query, (gensetdyn *)aux, d)->deadline ; +} + +static int sassserver_deadline_cmp (void const *a, void const *b, void *aux) +{ + tain const *aa = a ; + tain const *bb = b ; + (void)aux ; + return tain_less(aa, bb) ? -1 : tain_less(bb, aa) ; +} + +static void *sassserver_id_dtok (uint32_t d, void *aux) +{ + return &GENSETDYN_P(sassserver_query, (gensetdyn *)aux, d)->id ; +} + +static int sassserver_id_cmp (void const *a, void const *b, void *aux) +{ + uint32_t const *aa = a ; + uint32_t const *bb = b ; + (void)aux ; + return *aa < *bb ? -1 : *aa > *bb ; +} + +void sassserver_init_structures (sassserver *a, sassserver_send_func_ref sendf, sassserver_cancel_func_ref cancelf, size_t datasize, free_func_ref cleanupf, void *aux) +{ + 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) ; +} |
