diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2026-02-21 09:54:38 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2026-02-21 09:54:38 +0000 |
| commit | 6a9f70ae5e126e6685b05670ff2bda026a56cfe5 (patch) | |
| tree | 83afdbb4a68e07a2ea69c602ca99aeb1c67cb121 /src | |
| parent | 5fec93446e61b2f2c9b68ba50cdad3f83c914cbd (diff) | |
| download | skalibs-6a9f70ae5e126e6685b05670ff2bda026a56cfe5.tar.gz | |
Add flags management to sass, refactor some things
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/skalibs/sass.h | 11 | ||||
| -rw-r--r-- | src/include/skalibs/sassclient.h | 20 | ||||
| -rw-r--r-- | src/include/skalibs/sassserver.h | 6 | ||||
| -rw-r--r-- | src/include/skalibs/unixonacid.h | 1 | ||||
| -rw-r--r-- | src/libunixonacid/sassclient_release.c | 15 | ||||
| -rw-r--r-- | src/libunixonacid/sassclient_send.c | 4 | ||||
| -rw-r--r-- | src/libunixonacid/sassclient_sendv.c | 11 | ||||
| -rw-r--r-- | src/libunixonacid/sassserver.c | 15 |
8 files changed, 58 insertions, 25 deletions
diff --git a/src/include/skalibs/sass.h b/src/include/skalibs/sass.h new file mode 100644 index 0000000..b2b1f47 --- /dev/null +++ b/src/include/skalibs/sass.h @@ -0,0 +1,11 @@ +/* ISC license. */ + +#ifndef SKALIBS_SASS_H +#define SKALIBS_SASS_H + +enum sass_flags_e +{ + SASS_FLAGS_KEEP = 0x01, +} ; + +#endif diff --git a/src/include/skalibs/sassclient.h b/src/include/skalibs/sassclient.h index b932414..ce79477 100644 --- a/src/include/skalibs/sassclient.h +++ b/src/include/skalibs/sassclient.h @@ -26,19 +26,21 @@ typedef sassclient_cb_func *sassclient_cb_func_ref ; extern int sassclient_start (sassclient *, char const *const *, char const *, char const *, tain const *, tain *) ; #define sassclient_start_g(a, argv, banner1, banner2, deadline) sassclient_start(a, argv, banner1, banner2, (deadline), &STAMP) -extern void sassclient_end (sassclient *) ; - -#define sassclient_fd(a) textclient_fd(&(a)->connection) -extern int sassclient_update (sassclient *) ; -extern int sassclient_ack (sassclient *, uint32_t *, int *) ; -extern int sassclient_send (sassclient *, uint32_t *, uint32_t, uint32_t, char const *, size_t, sassclient_cb_func_ref, void *, tain const *, tain *) ; -#define sassclient_send_g(a, id, timeout, opcode, s, len, cb, data, deadline) sassclient_send(a, id, timeout, opcode, s, len, cb, data, (deadline), &STAMP) +extern int sassclient_send (sassclient *, uint32_t *, uint32_t, uint32_t, uint32_t, char const *, size_t, sassclient_cb_func_ref, void *, tain const *, tain *) ; +#define sassclient_send_g(a, id, flags, timeout, opcode, s, len, cb, data, deadline) sassclient_send(a, id, flags, timeout, opcode, s, len, cb, data, (deadline), &STAMP) -extern int sassclient_sendv (sassclient *, uint32_t *, uint32_t, uint32_t, struct iovec const *, unsigned int, sassclient_cb_func_ref, void *, tain const *, tain *) ; -#define sassclient_sendv_g(a, id, timeout, opcode, v, n, cb, data, deadline) sassclient_sendv(a, id, timeout, opcode, v, n, cb, data, (deadline), &STAMP) +extern int sassclient_sendv (sassclient *, uint32_t *, uint32_t, uint32_t, uint32_t, struct iovec const *, unsigned int, sassclient_cb_func_ref, void *, tain const *, tain *) ; +#define sassclient_sendv_g(a, id, flags, timeout, opcode, v, n, cb, data, deadline) sassclient_sendv(a, id, flags, timeout, opcode, v, n, cb, data, (deadline), &STAMP) extern int sassclient_cancel (sassclient *, uint32_t, tain const *, tain *) ; #define sassclient_cancel_g(a, id, deadline) sassclient_cancel(a, id, (deadline), &STAMP) +#define sassclient_fd(a) textclient_fd(&(a)->connection) +extern int sassclient_update (sassclient *) ; +extern int sassclient_ack (sassclient *, uint32_t *, int *) ; +extern void sassclient_release (sassclient *, uint32_t) ; + +extern void sassclient_end (sassclient *) ; + #endif diff --git a/src/include/skalibs/sassserver.h b/src/include/skalibs/sassserver.h index b17df8b..f43ea4c 100644 --- a/src/include/skalibs/sassserver.h +++ b/src/include/skalibs/sassserver.h @@ -9,7 +9,7 @@ #include <skalibs/tai.h> #include <skalibs/iopause.h> -typedef int sassserver_send_func (void *, uint32_t, uint32_t, char const *, size_t) ; +typedef int sassserver_send_func (void *, uint32_t, uint32_t, uint32_t, char const *, size_t) ; typedef sassserver_send_func *sassserver_send_func_ref ; typedef void sassserver_cancel_func (void *) ; @@ -23,7 +23,7 @@ extern int sassserver_event (iopause_fd const *) ; extern void *sassserver_data (uint32_t) ; extern void sassserver_async_failure (uint32_t, int) ; -extern void sassserver_async_success (uint32_t, char const *, size_t) ; -extern void sassserver_async_successv (uint32_t, struct iovec const *, unsigned int) ; +extern void sassserver_async_success (uint32_t, uint32_t, char const *, size_t) ; +extern void sassserver_async_successv (uint32_t, uint32_t, struct iovec const *, unsigned int) ; #endif diff --git a/src/include/skalibs/unixonacid.h b/src/include/skalibs/unixonacid.h index 1cba96a..c8981cb 100644 --- a/src/include/skalibs/unixonacid.h +++ b/src/include/skalibs/unixonacid.h @@ -12,6 +12,7 @@ #include <skalibs/unixconnection.h> #include <skalibs/kolbak.h> #include <skalibs/skaclient.h> +#include <skalibs/sass.h> #include <skalibs/sassclient.h> #include <skalibs/sassserver.h> diff --git a/src/libunixonacid/sassclient_release.c b/src/libunixonacid/sassclient_release.c new file mode 100644 index 0000000..4eca896 --- /dev/null +++ b/src/libunixonacid/sassclient_release.c @@ -0,0 +1,15 @@ +/* ISC license. */ + +#include <errno.h> +#include <pthread.h> + +#include <skalibs/sassclient.h> + +void sassclient_release (sassclient *a, uint32_t id) +{ + int e = errno ; + pthread_mutex_lock(&a->connection_mutex) ; + gensetdyn_delete(&a->store, id) ; + pthread_mutex_unlock(&a->connection_mutex) ; + errno = e ; +} diff --git a/src/libunixonacid/sassclient_send.c b/src/libunixonacid/sassclient_send.c index 9ede61a..9ad68df 100644 --- a/src/libunixonacid/sassclient_send.c +++ b/src/libunixonacid/sassclient_send.c @@ -4,8 +4,8 @@ #include <skalibs/sassclient.h> -int sassclient_send (sassclient *a, uint32_t *id, uint32_t timeout, uint32_t opcode, char const *s, size_t len, sassclient_cb_func_ref cb, void *data, tain const *deadline, tain *stamp) +int sassclient_send (sassclient *a, uint32_t *id, uint32_t flags, uint32_t timeout, uint32_t opcode, char const *s, size_t len, sassclient_cb_func_ref cb, void *data, tain const *deadline, tain *stamp) { struct iovec v = { .iov_base = (char *)s, .iov_len = len } ; - return sassclient_sendv(a, id, timeout, opcode, &v, 1, cb, data, deadline, stamp) ; + return sassclient_sendv(a, id, flags, timeout, opcode, &v, 1, cb, data, deadline, stamp) ; } diff --git a/src/libunixonacid/sassclient_sendv.c b/src/libunixonacid/sassclient_sendv.c index ef38679..209462b 100644 --- a/src/libunixonacid/sassclient_sendv.c +++ b/src/libunixonacid/sassclient_sendv.c @@ -15,14 +15,14 @@ #include <skalibs/sassclient.h> #include "sassclient-internal.h" -int sassclient_sendv (sassclient *a, uint32_t *cid, uint32_t timeout, uint32_t opcode, struct iovec const *vv, unsigned int n, sassclient_cb_func_ref cb, void *data, tain const *deadline, tain *stamp) +int sassclient_sendv (sassclient *a, uint32_t *cid, uint32_t flags, uint32_t timeout, uint32_t opcode, struct iovec const *vv, unsigned int n, sassclient_cb_func_ref cb, void *data, tain const *deadline, tain *stamp) { size_t len = siovec_len(vv, n) ; uint32_t id ; int e ; struct iovec answer ; sassclient_data *p ; - char pack[17] = "+" ; + char pack[21] = "+" ; struct iovec v[1 + n] ; if (len + 11 > UINT32_MAX) return (errno = ENAMETOOLONG, 0) ; @@ -41,9 +41,10 @@ int sassclient_sendv (sassclient *a, uint32_t *cid, uint32_t timeout, uint32_t o v[0].iov_len = 17 ; for (unsigned int i = 0 ; i < n ; i++) v[i+1] = vv[i] ; uint32_pack_big(pack + 1, id) ; - uint32_pack_big(pack + 5, timeout) ; - uint32_pack_big(pack + 9, opcode) ; - uint32_pack_big(pack + 13, len) ; + uint32_pack_big(pack + 5, flags) ; + uint32_pack_big(pack + 9, timeout) ; + uint32_pack_big(pack + 13, opcode) ; + uint32_pack_big(pack + 17, len) ; if (!textclient_exchangev(&a->connection, v, 1 + n, &answer, deadline, stamp)) { e = errno ; goto err0 ; } if (answer.iov_len == 1) { e = *(unsigned char *)answer.iov_base ; goto err0 ; } if (answer.iov_len != 5 || *(unsigned char *)answer.iov_base) { e = EPROTO ; goto err0 ; } diff --git a/src/libunixonacid/sassserver.c b/src/libunixonacid/sassserver.c index 51569e9..f009c1a 100644 --- a/src/libunixonacid/sassserver.c +++ b/src/libunixonacid/sassserver.c @@ -15,6 +15,7 @@ #include <skalibs/avltree.h> #include <skalibs/textmessage.h> #include <skalibs/textclient.h> +#include <skalibs/sass.h> #include <skalibs/sassserver.h> typedef struct sassserver_query_s sassserver_query, sassserver_query_ref ; @@ -94,7 +95,7 @@ void sassserver_async_failure (uint32_t handle, int e) sassserver_remove(handle) ; } -void sassserver_async_successv (uint32_t handle, struct iovec const *v, unsigned int n) +void sassserver_async_successv (uint32_t handle, uint32_t flags, struct iovec const *v, unsigned int n) { sassserver_query *p = SASSSERVER_QUERY(handle) ; char pack[8] = "\0\0\0\0\0\0\0" ; @@ -104,13 +105,13 @@ void sassserver_async_successv (uint32_t handle, struct iovec const *v, unsigned uint32_pack_big(pack, p->id) ; if (!textmessage_putv(textmessage_sender_x, vv, n+1)) strerr_diefu1sys(111, "textmessage_putv") ; - sassserver_remove(handle) ; + if (!(flags & SASS_FLAGS_KEEP)) sassserver_remove(handle) ; } -void sassserver_async_success (uint32_t handle, char const *s, size_t len) +void sassserver_async_success (uint32_t handle, uint32_t flags, char const *s, size_t len) { struct iovec v = { .iov_base = (char *)s, .iov_len = len } ; - sassserver_async_successv(handle, &v, 1) ; + sassserver_async_successv(handle, flags, &v, 1) ; } static inline void sassserver_uniquify (tain *deadline) @@ -144,14 +145,16 @@ static int sassserver_parse_protocol (struct iovec const *v, void *aux) { sassserver_query *p ; uint32_t handle ; + uint32_t flags ; uint32_t timeout ; uint32_t opcode ; uint32_t len ; int e ; - if (vlen < 16) strerr_dief1x(100, "invalid client request") ; + if (vlen < 20) strerr_dief1x(100, "invalid client request") ; if (!gensetdyn_new(&sassserver_queries, &handle)) strerr_diefu1sys(111, "gensetdyn_new") ; p = SASSSERVER_QUERY(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 ; @@ -170,7 +173,7 @@ static int sassserver_parse_protocol (struct iovec const *v, void *aux) p->data = alloc(sassserver_datasize) ; if (!p->data) strerr_diefu1sys(111, "alloc") ; } - e = (*sassserver_sendf)(p->data, handle, opcode, s, len) ; + e = (*sassserver_sendf)(p->data, handle, flags, opcode, s, len) ; if (e) sassserver_remove(handle) ; sassserver_sync_answer(e) ; break ; |
