From 7ae80340d621d6add95f6c7d9e5e7a0e921f0b42 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Sat, 25 Nov 2017 14:15:08 +0000 Subject: Finish skabus_rpc doc, add missing functions --- doc/libskabus/rpc.html | 404 +++++++++++++++++++++++++++++++- package/deps.mak | 10 +- src/include/skabus/rpc.h | 31 ++- src/libskabus/deps-lib/skabus | 4 + src/libskabus/skabus_rpc_get.c | 10 +- src/libskabus/skabus_rpc_qlist.c | 12 + src/libskabus/skabus_rpc_qlist_ack.c | 15 ++ src/libskabus/skabus_rpc_r_notimpl.c | 2 +- src/libskabus/skabus_rpc_release.c | 6 +- src/libskabus/skabus_rpc_reply.c | 13 +- src/libskabus/skabus_rpc_reply_async.c | 17 ++ src/libskabus/skabus_rpc_replyv.c | 15 +- src/libskabus/skabus_rpc_replyv_async.c | 19 ++ src/libskabus/skabus_rpc_update.c | 1 - src/rpc/skabus-rpcd.c | 5 + 15 files changed, 520 insertions(+), 44 deletions(-) create mode 100644 src/libskabus/skabus_rpc_qlist.c create mode 100644 src/libskabus/skabus_rpc_qlist_ack.c create mode 100644 src/libskabus/skabus_rpc_reply_async.c create mode 100644 src/libskabus/skabus_rpc_replyv_async.c diff --git a/doc/libskabus/rpc.html b/doc/libskabus/rpc.html index 486258e..c9011c5 100644 --- a/doc/libskabus/rpc.html +++ b/doc/libskabus/rpc.html @@ -29,13 +29,411 @@ other clients.

Programming

- Check the skabus/rpc.h header for the -exact function prototypes. + Check the skabus/rpc.h header for details of the data +types and function prototypes. +

+ +

Overview, data types, interface callbacks

+ +

+ A client starts by defining a skabus_rpc_t handle, +initializing it to SKABUS_RPC_ZERO. It then passes a +pointer to this handle in all its subsequent skabus_rpc calls, +starting with skabus_rpc_init() and ending with +skabus_rpc_end(). +

+ +

+ At initialization time, as well as interface registration time, +the client must provide a pointer to a +skabus_rpc_interface_t structure. This structure contains +the following fields: +

+ + + +

+ f is the callback function that will be called when the interface +receives a query. Its prototype is +int f (skabus_rpc_t *a, skabus_rpc_rinfo_t const *info, unixmessage_t const *m, void *aux). +

+ + + +

+ cancelf is the callback function that will be called if the qclient, +or skabus-rpcd, cancels a query made to the interface. +Its prototype is +int cancelf (uint64_t serial, char reason, void *aux). +

+ + + +

+ data is an arbitrary pointer chosen by the rclient to point to arbitrary +data, for whatever purpose the rclient may see fit. This pointer will be given as +the aux argument to the f or cancelf callbacks when +they're called.

Starting and ending a session

-to be continued +

int skabus_rpc_init (skabus_rpc_t *a, char const *path, char const *id, skabus_rpc_interface_t const *ifbody, char const *re, tain_t const *deadline, tain_t *stamp)

+ +

+ Starts a session with an instance of skabus-rpcd listening +on the socket at path. The client attempts to register the id identifier +for itself, and will reply to private queries (queries directly sent to it, instead of to an +interface) with the functions defined in ifbody. Only qclients whose identifiers match the +re regular expression will be able to send private queries. +

+ +

+ If no private queries are to be served, &skabus_rpc_interface_zero can be +used as an ifbody argument; and a never-matching regular expression, such +as .^, should be used as a re argument. +

+ +

+ The client must be authorized to use id as an identifier. That means +id must match the regular expression given as an env/SKABUS_RPC_ID_REGEX +entry for the client's uid or gid in the skabus-rpcd configuration. +

+ +

+ On success, the function returns nonzero. The a handle then needs to be +used as the first argument to all the subsequent skabus_rpc function calls. +On failure, the function returns 0, and sets errno. +

+ +

void skabus_rpc_end (skabus_rpc_t *a)

+ +

+ Ends the current session with handle a. +

+ +

Registering and unregistering an interface

+ +

int skabus_rpc_interface_register (skabus_rpc_t *a, uint32_t *ifid, char const *ifname, skabus_rpc_interface_t const *ifbody, char const *re, tain_t const *deadline, tain_t *stamp)

+ +

+ Registers an interface with name ifname and implementation pointed to +by ifbody. qclients wanting to send queries to ifname will need +to have an identifier matching the re regular expression. +

+ +

+ The rclient must be authorized to use ifname as an interface name. That means +ifname must match the regular expression given as an env/SKABUS_RPC_INTERFACES_REGEX +entry for the rclient's uid or gid in the skabus-rpcd configuration. +

+ +

+ On success, the function stores an interface identifier into ifid, and returns nonzero. +On failure, it returns 0, and sets errno. +

+ +

int skabus_rpc_interface_unregister (skabus_rpc_t *a, uint32_t ifid, tain_t const *deadline, tain_t *stamp)

+ +

+ Unregisters the interface with id ifid. ifid may be +reused in future interface registrations. +

+ +

+ The application should ensure it is not currently handling queries to that interface +before calling this function. All the pending queries (i.e. sent, but not yet read +by the rclient) to that interface will fail will the ECONNRESET reason. +

+ +

+ On success, the function returns nonzero. On failure, it returns 0, and sets errno. +

+ +

Sending and cancelling a query

+ +

uint64_t skabus_rpc_send_withfds (skabus_rpc_t *a, char const *ifname, char const *s, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *limit, tain_t const *deadline, tain_t *stamp)

+ +

+ Sends a query to interface ifname. The query is made of len bytes of data +pointed to by s, as well as nfds open file descriptors whose list is pointed +to by fds. +

+ +

+ If nfds is nonzero, the qclient must be authorized to send descriptors. That means +the ruleset that matched the qclient at connection time must contain a nonempty +env/SKABUS_RPC_QSENDFDS entry. +

+ +

+ bits is a bitfield containing at least nfds bits. If the nth bit is 1, +it means that fds[n] will be closed after being sent to skabus-rpcd. If it is 0, +the fd will not be touched. As a bits value, you can use unixmessage_bits_closenone +to close nothing, or unixmessage_bits_closeall to close all the descriptors in fds. +

+ +

+ limit is an absolute date at which the query will fail with the ETIMEDOUT reason if +the answer hasn't arrived by then. This deadline will be enforced by the server and also transmitted +to the rclient for information. +

+ +

+ Please note that limit refers to an actual deadline for the whole lifetime +of the query, i.e. transmission to the rclient, handling by the rclient, and transmission of the +reply to the qclient. This has nothing to do with the deadline argument, which is a +deadline for the current skabus_rpc_send_withfds() function call. If limit +is reached, it's normal operation - the query simply took too long to be handled. But if +deadline (which should be way earlier than limit) is reached, it means the +server got stuck somewhere in the initial function call, and it's not normal operation at +all. +

+ +

+ On success, the function returns a 64-bit value that is the serial number of the query. +On failure, it returns 0, and sets errno. +

+ +

uint64_t skabus_rpc_send(skabus_rpc_t *a, char const *ifname, char const *s, size_t len, tain_t const *limit, tain_t const *deadline, tain_t *stamp)

+ +

+ Sends a text-only query to ifname. It's a wrapper over skabus_rpc_send_withfds. +

+ +

uint64_t skabus_rpc_sendv_withfds (skabus_rpc_t *a, char const *ifname, struct iovec const *v, unsigned int vlen, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *limit, tain_t const *deadline, tain_t *stamp)

+ +

+ Like skabus_rpc_send_withfds, except the text of the query is not +given as a single array of bytes, but as several chunks of data defined by +the v array of length vlen. +

+ +

uint64_t skabus_rpc_sendv(skabus_rpc_t *a, char const *ifname, struct iovec const *v, unsigned int vlen, tain_t const *limit, tain_t const *deadline, tain_t *stamp)

+ +

+ Like skabus_rpc_send, except the text of the query is not +given as a single array of bytes, but as several chunks of data defined by +the v array of length vlen. +

+ +

uint64_t skabus_rpc_sendpm_withfds (skabus_rpc_t *a, char const *rid, char const *s, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *limit, tain_t const *deadline, tain_t *stamp)
+uint64_t skabus_rpc_sendpm (skabus_rpc_t *a, char const *rid, char const *s, size_t len, tain_t const *limit, tain_t const *deadline, tain_t *stamp)
+uint64_t skabus_rpc_sendvpm_withfds (skabus_rpc_t *a, char const *rid, struct iovec const *v, unsigned int vlen, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *limit, tain_t const *deadline, tain_t *stamp)
+uint64_t skabus_rpc_sendvpm (skabus_rpc_t *a, char const *rid, struct iovec const *v, unsigned int vlen, tain_t const *limit, tain_t const *deadline, tain_t *stamp)

+

+ These functions are the equivalent of the previous ones, but send a private query instead. +rid is not an interface name, but a client identifier. If accepted, the +query will be handled by the interface body that has been declared by the +rid client when it registered itself. +

+ +

int skabus_rpc_cancel (skabus_rpc_t *a, uint64_t serial, tain_t const *deadline, tain_t *stamp)

+ +

+ Cancels the query numbered serial. If the query is currently being handled +by the rclient, the rclient will be notified (the appropriate cancelf +callback will be called). +

+ +

+ On success, the function returns nonzero. On failure, it returns 0, and sets errno. +

+ +

Answering queries

+ +

+ One of these functions must be called in every f callback defined +in interface bodies, in order to send the reply to the qclient. +

+ +

int skabus_rpc_reply_withfds (skabus_rpc_t *a, uint64_t serial, char result, char const *s, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *deadline, tain_t *stamp)

+ +

+ Sends a reply to the query numbered serial. This reply is made of +an overall value result (it is suggested to use 0 to mean "the query +was handled properly, even if it returns a negative answer", and an errno +code to mean "the query could not be handled properly by the rclient"), as +well as a message containing len bytes pointed by s and +potentially nfds open file descriptors pointed to by fds. +

+ +

+ If nfds is nonzero, the rclient must be authorized to send descriptors. That means +the ruleset that matched the rclient at connection time must contain a nonempty +env/SKABUS_RPC_RSENDFDS entry. +

+ +

+ bits is a bitfield containing at least nfds bits. If the nth bit is 1, +it means that fds[n] will be closed after being sent to skabus-rpcd. If it is 0, +the fd will not be touched. As a bits value, you can use unixmessage_bits_closenone +to close nothing, or unixmessage_bits_closeall to close all the descriptors in fds. +

+ +

+ The function returns nonzero if it could send the reply to skabus-rpcd. If it could not, +it returns 0 and sets errno. Note that the function will still return nonzero if +serial does not match a query that was sent to this rclient; in that case, +skabus-rpcd will silently ignore the reply. +

+ +

int skabus_rpc_reply (skabus_rpc_t *a, uint64_t serial, char result, char const *s, size_t len, tain_t const *deadline, tain_t *stamp)

+ +

+ Shortcut for skabus_rpc_reply_withfds when the reply +does not contain any file descriptors. +

+ +

int skabus_rpc_replyv_withfds (skabus_rpc_t *a, uint64_t serial, char result, struct iovec const *v, unsigned int vlen, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *deadline, tain_t *stamp)

+ +

+ Similar to skabus_rpc_reply_withfds, but the text of the reply +is made of vlen chunks described in the v array. +

+ +

int skabus_rpc_replyv (skabus_rpc_t *a, uint64_t serial, char result, struct iovec const *s, unsigned int vlen, tain_t const *deadline, tain_t *stamp)

+ +

+ Shortcut for skabus_rpc_replyv_withfds when the reply +does not contain any file descriptors. +

+ +

Getting replies to queries

+ +

int skabus_rpc_fd (skabus_rpc_t *a)

+ +

+ Returns a file descriptor for the connection to skabus-rpcd. This file +descriptor can be checked for reading in an asynchronous event loop +with a poll or select call. (For easy timeout +management, iopause +is recommended.) When the descriptor is readable, do not read it, +but call the following function instead. +

+ +

int skabus_rpc_update (skabus_rpc_t *a)

+ +

+ Updates the qclient's data structures with the latest information +from skabus-rpcd. This function should be called when the connection +descriptor becomes readable. +

+ +

+ The function returns a negative number (and sets errno) if an error +occurs, 0 if nothing happened, and a positive number if new answers +have arrived. +

+ +

size_t skabus_rpc_qlist (skabus_rpc_t *a, uint64_t **list)

+ +

+ Returns the number of currently unaddressed answers. If that +number is greater than 0, a pointer to an array containing the +list of unaddressed answers is stored into *list. The +elements of the array are the serial numbers for the queries +whose answered have arrived. +

+ +

+ The *list pointer is only valid until the next invocation +of skabus_rpc_update(). +

+ +

int skabus_rpc_get (skabus_rpc_t *a, uint64_t serial, int *result, unixmessage_t *m)

+ +

+ Get the answer for the query numbered serial. + Returns a negative number (and sets errno) if an error occurred. errno is EINVAL if serial +is an invalid query number. Returns 0 if no answer has arrived yet. Returns a +positive number if the reply has arrived, in which case the overall result +value is stored into *result, and the reply message is pointed by m. +

+ +

+ m points to a unixmessage_t structure containing the +following fields: +

+ + + +

+ If the reply is unwanted, the qclient should call unixmessage_drop(m) +to make sure all file descriptors contained in it, if any, are closed. +

+ +

int skabus_rpc_release (skabus_rpc_t *a, uint64_t serial)

+ +

+ Releases the resources occupied by the reply to the query numbered serial. +Only call this function when the reply has been handled, or at least when the message +text, and file descriptors if any, have been copied to another place. +

+ +

+ The function returns 1 on success, and 0 (and sets errno) on failure. +errno is EINVAL if serial is an invalid number, and EAGAIN if the query +is in-flight. To cancel an in-flight query, use skabus_rpc_cancel +instead. +

+ +

void skabus_rpc_qlist_ack (skabus_rpc_t *a, size_t n)

+ +

+ Acknowledges that n replies have been handled: removes n +elements at the head of the queue that skabus_rpc_qlist returns. +

diff --git a/package/deps.mak b/package/deps.mak index fc3ae21..5ab57d8 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -18,11 +18,15 @@ src/libskabus/skabus_rpc_interface_unregister.o src/libskabus/skabus_rpc_interfa src/libskabus/skabus_rpc_interface_unregister_async.o src/libskabus/skabus_rpc_interface_unregister_async.lo: src/libskabus/skabus_rpc_interface_unregister_async.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_interface_zero.o src/libskabus/skabus_rpc_interface_zero.lo: src/libskabus/skabus_rpc_interface_zero.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_qinfo_zero.o src/libskabus/skabus_rpc_qinfo_zero.lo: src/libskabus/skabus_rpc_qinfo_zero.c src/include/skabus/rpc.h +src/libskabus/skabus_rpc_qlist.o src/libskabus/skabus_rpc_qlist.lo: src/libskabus/skabus_rpc_qlist.c src/include/skabus/rpc.h +src/libskabus/skabus_rpc_qlist_ack.o src/libskabus/skabus_rpc_qlist_ack.lo: src/libskabus/skabus_rpc_qlist_ack.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_r_notimpl.o src/libskabus/skabus_rpc_r_notimpl.lo: src/libskabus/skabus_rpc_r_notimpl.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_rcancel_ignore.o src/libskabus/skabus_rpc_rcancel_ignore.lo: src/libskabus/skabus_rpc_rcancel_ignore.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_release.o src/libskabus/skabus_rpc_release.lo: src/libskabus/skabus_rpc_release.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_reply.o src/libskabus/skabus_rpc_reply.lo: src/libskabus/skabus_rpc_reply.c src/include/skabus/rpc.h +src/libskabus/skabus_rpc_reply_async.o src/libskabus/skabus_rpc_reply_async.lo: src/libskabus/skabus_rpc_reply_async.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_replyv.o src/libskabus/skabus_rpc_replyv.lo: src/libskabus/skabus_rpc_replyv.c src/include/skabus/rpc.h +src/libskabus/skabus_rpc_replyv_async.o src/libskabus/skabus_rpc_replyv_async.lo: src/libskabus/skabus_rpc_replyv_async.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_rinfo_pack.o src/libskabus/skabus_rpc_rinfo_pack.lo: src/libskabus/skabus_rpc_rinfo_pack.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_rinfo_unpack.o src/libskabus/skabus_rpc_rinfo_unpack.lo: src/libskabus/skabus_rpc_rinfo_unpack.c src/include/skabus/rpc.h src/libskabus/skabus_rpc_rinfo_zero.o src/libskabus/skabus_rpc_rinfo_zero.lo: src/libskabus/skabus_rpc_rinfo_zero.c src/include/skabus/rpc.h @@ -53,12 +57,12 @@ src/rpc/skabus_rpcd_interface.o src/rpc/skabus_rpcd_interface.lo: src/rpc/skabus src/rpc/skabus_rpcd_query.o src/rpc/skabus_rpcd_query.lo: src/rpc/skabus_rpcd_query.c src/rpc/skabus-rpcd.h src/include/skabus/rpc.h ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) -libskabus.a.xyzzy: src/libskabus/skabus_rpc_cancel.o src/libskabus/skabus_rpc_cancel_async.o src/libskabus/skabus_rpc_end.o src/libskabus/skabus_rpc_get.o src/libskabus/skabus_rpc_idstr.o src/libskabus/skabus_rpc_idstr_async.o src/libskabus/skabus_rpc_interface_register.o src/libskabus/skabus_rpc_interface_register_async.o src/libskabus/skabus_rpc_interface_register_cb.o src/libskabus/skabus_rpc_interface_unregister.o src/libskabus/skabus_rpc_interface_unregister_async.o src/libskabus/skabus_rpc_interface_zero.o src/libskabus/skabus_rpc_qinfo_zero.o src/libskabus/skabus_rpc_r_notimpl.o src/libskabus/skabus_rpc_rcancel_ignore.o src/libskabus/skabus_rpc_release.o src/libskabus/skabus_rpc_reply.o src/libskabus/skabus_rpc_replyv.o src/libskabus/skabus_rpc_rinfo_pack.o src/libskabus/skabus_rpc_rinfo_unpack.o src/libskabus/skabus_rpc_rinfo_zero.o src/libskabus/skabus_rpc_send.o src/libskabus/skabus_rpc_send_async.o src/libskabus/skabus_rpc_send_cb.o src/libskabus/skabus_rpc_sendpm.o src/libskabus/skabus_rpc_sendpm_async.o src/libskabus/skabus_rpc_sendq.o src/libskabus/skabus_rpc_sendq_async.o src/libskabus/skabus_rpc_sendv.o src/libskabus/skabus_rpc_sendv_async.o src/libskabus/skabus_rpc_sendvpm.o src/libskabus/skabus_rpc_sendvpm_async.o src/libskabus/skabus_rpc_sendvq.o src/libskabus/skabus_rpc_sendvq_async.o src/libskabus/skabus_rpc_start.o src/libskabus/skabus_rpc_start_async.o src/libskabus/skabus_rpc_update.o src/libskabus/skabus_rpc_zero.o +libskabus.a.xyzzy: src/libskabus/skabus_rpc_cancel.o src/libskabus/skabus_rpc_cancel_async.o src/libskabus/skabus_rpc_end.o src/libskabus/skabus_rpc_get.o src/libskabus/skabus_rpc_idstr.o src/libskabus/skabus_rpc_idstr_async.o src/libskabus/skabus_rpc_interface_register.o src/libskabus/skabus_rpc_interface_register_async.o src/libskabus/skabus_rpc_interface_register_cb.o src/libskabus/skabus_rpc_interface_unregister.o src/libskabus/skabus_rpc_interface_unregister_async.o src/libskabus/skabus_rpc_interface_zero.o src/libskabus/skabus_rpc_qinfo_zero.o src/libskabus/skabus_rpc_qlist.o src/libskabus/skabus_rpc_qlist_ack.o src/libskabus/skabus_rpc_r_notimpl.o src/libskabus/skabus_rpc_rcancel_ignore.o src/libskabus/skabus_rpc_release.o src/libskabus/skabus_rpc_reply.o src/libskabus/skabus_rpc_replyv.o src/libskabus/skabus_rpc_reply_async.o src/libskabus/skabus_rpc_replyv_async.o src/libskabus/skabus_rpc_rinfo_pack.o src/libskabus/skabus_rpc_rinfo_unpack.o src/libskabus/skabus_rpc_rinfo_zero.o src/libskabus/skabus_rpc_send.o src/libskabus/skabus_rpc_send_async.o src/libskabus/skabus_rpc_send_cb.o src/libskabus/skabus_rpc_sendpm.o src/libskabus/skabus_rpc_sendpm_async.o src/libskabus/skabus_rpc_sendq.o src/libskabus/skabus_rpc_sendq_async.o src/libskabus/skabus_rpc_sendv.o src/libskabus/skabus_rpc_sendv_async.o src/libskabus/skabus_rpc_sendvpm.o src/libskabus/skabus_rpc_sendvpm_async.o src/libskabus/skabus_rpc_sendvq.o src/libskabus/skabus_rpc_sendvq_async.o src/libskabus/skabus_rpc_start.o src/libskabus/skabus_rpc_start_async.o src/libskabus/skabus_rpc_update.o src/libskabus/skabus_rpc_zero.o else -libskabus.a.xyzzy: src/libskabus/skabus_rpc_cancel.lo src/libskabus/skabus_rpc_cancel_async.lo src/libskabus/skabus_rpc_end.lo src/libskabus/skabus_rpc_get.lo src/libskabus/skabus_rpc_idstr.lo src/libskabus/skabus_rpc_idstr_async.lo src/libskabus/skabus_rpc_interface_register.lo src/libskabus/skabus_rpc_interface_register_async.lo src/libskabus/skabus_rpc_interface_register_cb.lo src/libskabus/skabus_rpc_interface_unregister.lo src/libskabus/skabus_rpc_interface_unregister_async.lo src/libskabus/skabus_rpc_interface_zero.lo src/libskabus/skabus_rpc_qinfo_zero.lo src/libskabus/skabus_rpc_r_notimpl.lo src/libskabus/skabus_rpc_rcancel_ignore.lo src/libskabus/skabus_rpc_release.lo src/libskabus/skabus_rpc_reply.lo src/libskabus/skabus_rpc_replyv.lo src/libskabus/skabus_rpc_rinfo_pack.lo src/libskabus/skabus_rpc_rinfo_unpack.lo src/libskabus/skabus_rpc_rinfo_zero.lo src/libskabus/skabus_rpc_send.lo src/libskabus/skabus_rpc_send_async.lo src/libskabus/skabus_rpc_send_cb.lo src/libskabus/skabus_rpc_sendpm.lo src/libskabus/skabus_rpc_sendpm_async.lo src/libskabus/skabus_rpc_sendq.lo src/libskabus/skabus_rpc_sendq_async.lo src/libskabus/skabus_rpc_sendv.lo src/libskabus/skabus_rpc_sendv_async.lo src/libskabus/skabus_rpc_sendvpm.lo src/libskabus/skabus_rpc_sendvpm_async.lo src/libskabus/skabus_rpc_sendvq.lo src/libskabus/skabus_rpc_sendvq_async.lo src/libskabus/skabus_rpc_start.lo src/libskabus/skabus_rpc_start_async.lo src/libskabus/skabus_rpc_update.lo src/libskabus/skabus_rpc_zero.lo +libskabus.a.xyzzy: src/libskabus/skabus_rpc_cancel.lo src/libskabus/skabus_rpc_cancel_async.lo src/libskabus/skabus_rpc_end.lo src/libskabus/skabus_rpc_get.lo src/libskabus/skabus_rpc_idstr.lo src/libskabus/skabus_rpc_idstr_async.lo src/libskabus/skabus_rpc_interface_register.lo src/libskabus/skabus_rpc_interface_register_async.lo src/libskabus/skabus_rpc_interface_register_cb.lo src/libskabus/skabus_rpc_interface_unregister.lo src/libskabus/skabus_rpc_interface_unregister_async.lo src/libskabus/skabus_rpc_interface_zero.lo src/libskabus/skabus_rpc_qinfo_zero.lo src/libskabus/skabus_rpc_qlist.lo src/libskabus/skabus_rpc_qlist_ack.lo src/libskabus/skabus_rpc_r_notimpl.lo src/libskabus/skabus_rpc_rcancel_ignore.lo src/libskabus/skabus_rpc_release.lo src/libskabus/skabus_rpc_reply.lo src/libskabus/skabus_rpc_replyv.lo src/libskabus/skabus_rpc_reply_async.lo src/libskabus/skabus_rpc_replyv_async.lo src/libskabus/skabus_rpc_rinfo_pack.lo src/libskabus/skabus_rpc_rinfo_unpack.lo src/libskabus/skabus_rpc_rinfo_zero.lo src/libskabus/skabus_rpc_send.lo src/libskabus/skabus_rpc_send_async.lo src/libskabus/skabus_rpc_send_cb.lo src/libskabus/skabus_rpc_sendpm.lo src/libskabus/skabus_rpc_sendpm_async.lo src/libskabus/skabus_rpc_sendq.lo src/libskabus/skabus_rpc_sendq_async.lo src/libskabus/skabus_rpc_sendv.lo src/libskabus/skabus_rpc_sendv_async.lo src/libskabus/skabus_rpc_sendvpm.lo src/libskabus/skabus_rpc_sendvpm_async.lo src/libskabus/skabus_rpc_sendvq.lo src/libskabus/skabus_rpc_sendvq_async.lo src/libskabus/skabus_rpc_start.lo src/libskabus/skabus_rpc_start_async.lo src/libskabus/skabus_rpc_update.lo src/libskabus/skabus_rpc_zero.lo endif libskabus.so.xyzzy: EXTRA_LIBS := -lskarnet -libskabus.so.xyzzy: src/libskabus/skabus_rpc_cancel.lo src/libskabus/skabus_rpc_cancel_async.lo src/libskabus/skabus_rpc_end.lo src/libskabus/skabus_rpc_get.lo src/libskabus/skabus_rpc_idstr.lo src/libskabus/skabus_rpc_idstr_async.lo src/libskabus/skabus_rpc_interface_register.lo src/libskabus/skabus_rpc_interface_register_async.lo src/libskabus/skabus_rpc_interface_register_cb.lo src/libskabus/skabus_rpc_interface_unregister.lo src/libskabus/skabus_rpc_interface_unregister_async.lo src/libskabus/skabus_rpc_interface_zero.lo src/libskabus/skabus_rpc_qinfo_zero.lo src/libskabus/skabus_rpc_r_notimpl.lo src/libskabus/skabus_rpc_rcancel_ignore.lo src/libskabus/skabus_rpc_release.lo src/libskabus/skabus_rpc_reply.lo src/libskabus/skabus_rpc_replyv.lo src/libskabus/skabus_rpc_rinfo_pack.lo src/libskabus/skabus_rpc_rinfo_unpack.lo src/libskabus/skabus_rpc_rinfo_zero.lo src/libskabus/skabus_rpc_send.lo src/libskabus/skabus_rpc_send_async.lo src/libskabus/skabus_rpc_send_cb.lo src/libskabus/skabus_rpc_sendpm.lo src/libskabus/skabus_rpc_sendpm_async.lo src/libskabus/skabus_rpc_sendq.lo src/libskabus/skabus_rpc_sendq_async.lo src/libskabus/skabus_rpc_sendv.lo src/libskabus/skabus_rpc_sendv_async.lo src/libskabus/skabus_rpc_sendvpm.lo src/libskabus/skabus_rpc_sendvpm_async.lo src/libskabus/skabus_rpc_sendvq.lo src/libskabus/skabus_rpc_sendvq_async.lo src/libskabus/skabus_rpc_start.lo src/libskabus/skabus_rpc_start_async.lo src/libskabus/skabus_rpc_update.lo src/libskabus/skabus_rpc_zero.lo +libskabus.so.xyzzy: src/libskabus/skabus_rpc_cancel.lo src/libskabus/skabus_rpc_cancel_async.lo src/libskabus/skabus_rpc_end.lo src/libskabus/skabus_rpc_get.lo src/libskabus/skabus_rpc_idstr.lo src/libskabus/skabus_rpc_idstr_async.lo src/libskabus/skabus_rpc_interface_register.lo src/libskabus/skabus_rpc_interface_register_async.lo src/libskabus/skabus_rpc_interface_register_cb.lo src/libskabus/skabus_rpc_interface_unregister.lo src/libskabus/skabus_rpc_interface_unregister_async.lo src/libskabus/skabus_rpc_interface_zero.lo src/libskabus/skabus_rpc_qinfo_zero.lo src/libskabus/skabus_rpc_qlist.lo src/libskabus/skabus_rpc_qlist_ack.lo src/libskabus/skabus_rpc_r_notimpl.lo src/libskabus/skabus_rpc_rcancel_ignore.lo src/libskabus/skabus_rpc_release.lo src/libskabus/skabus_rpc_reply.lo src/libskabus/skabus_rpc_replyv.lo src/libskabus/skabus_rpc_reply_async.lo src/libskabus/skabus_rpc_replyv_async.lo src/libskabus/skabus_rpc_rinfo_pack.lo src/libskabus/skabus_rpc_rinfo_unpack.lo src/libskabus/skabus_rpc_rinfo_zero.lo src/libskabus/skabus_rpc_send.lo src/libskabus/skabus_rpc_send_async.lo src/libskabus/skabus_rpc_send_cb.lo src/libskabus/skabus_rpc_sendpm.lo src/libskabus/skabus_rpc_sendpm_async.lo src/libskabus/skabus_rpc_sendq.lo src/libskabus/skabus_rpc_sendq_async.lo src/libskabus/skabus_rpc_sendv.lo src/libskabus/skabus_rpc_sendv_async.lo src/libskabus/skabus_rpc_sendvpm.lo src/libskabus/skabus_rpc_sendvpm_async.lo src/libskabus/skabus_rpc_sendvq.lo src/libskabus/skabus_rpc_sendvq_async.lo src/libskabus/skabus_rpc_start.lo src/libskabus/skabus_rpc_start_async.lo src/libskabus/skabus_rpc_update.lo src/libskabus/skabus_rpc_zero.lo skabus-dyntee: EXTRA_LIBS := ${SOCKET_LIB} skabus-dyntee: src/misc/skabus-dyntee.o -lskarnet skabus-dyntee-client: EXTRA_LIBS := ${SOCKET_LIB} diff --git a/src/include/skabus/rpc.h b/src/include/skabus/rpc.h index 733a1bf..a96586a 100644 --- a/src/include/skabus/rpc.h +++ b/src/include/skabus/rpc.h @@ -69,14 +69,20 @@ extern skabus_rpc_interface_t const skabus_rpc_interface_zero ; extern skabus_rpc_r_func_t skabus_rpc_r_notimpl ; extern skabus_rpc_rcancel_func_t skabus_rpc_rcancel_ignore ; -extern int skabus_rpc_reply_withfds (skabus_rpc_t *, uint64_t, char, char const *, size_t, int const *, unsigned int, unsigned char const *) ; -#define skabus_rpc_reply(a, serial, result, s, len) skabus_rpc_reply_withfds(a, serial, result, s, len, 0, 0, unixmessage_bits_closenone) -extern int skabus_rpc_replyv_withfds (skabus_rpc_t *, uint64_t, char, struct iovec const *, unsigned int, int const *, unsigned int, unsigned char const *) ; -#define skabus_rpc_replyv(a, serial, result, v, vlen) skabus_rpc_replyv_withfds(a, serial, result, v, vlen, 0, 0, unixmessage_bits_closenone) +extern int skabus_rpc_reply_withfds_async (skabus_rpc_t *, uint64_t, char, char const *, size_t, int const *, unsigned int, unsigned char const *) ; +#define skabus_rpc_reply_async(a, serial, result, s, len) skabus_rpc_reply_withfds(a, serial, result, s, len, 0, 0, unixmessage_bits_closenone) +extern int skabus_rpc_replyv_withfds_async (skabus_rpc_t *, uint64_t, char, struct iovec const *, unsigned int, int const *, unsigned int, unsigned char const *) ; +#define skabus_rpc_replyv_async(a, serial, result, v, vlen) skabus_rpc_replyv_withfds(a, serial, result, v, vlen, 0, 0, unixmessage_bits_closenone) -#define skabus_rpc_rfd(a) skaclient_afd(&(a)->connection) -#define skabus_rpc_riswritable skaclient_aiswritable(&(a)->connection) -#define skabus_rpc_rflush(a) skaclient_aflush(&(a)->connection) +extern int skabus_rpc_reply_withfds (skabus_rpc_t *, uint64_t, char, char const *, size_t, int const *, unsigned int, unsigned char const *, tain_t const *, tain_t *) ; +#define skabus_rpc_reply(a, serial, result, s, len, deadline, stamp) skabus_rpc_reply_withfds(a, serial, result, s, len, 0, 0, unixmessage_bits_closenone, deadline, stamp) +extern int skabus_rpc_replyv_withfds (skabus_rpc_t *, uint64_t, char, struct iovec const *, unsigned int, int const *, unsigned int, unsigned char const *, tain_t const *, tain_t *) ; +#define skabus_rpc_replyv(a, serial, result, v, vlen, deadline, stamp) skabus_rpc_replyv_withfds(a, serial, result, v, vlen, 0, 0, unixmessage_bits_closenone, deadline, stamp) + +#define skabus_rpc_reply_withfds_g(a, serial, result, s, len, fds, nfds, bits, deadline) skabus_rpc_reply_withfds(a, serial, result, s, len, fds, nfds, bits, (deadline), &STAMP) +#define skabus_rpc_reply_g(a, serial, result, s, len, deadline) skabus_rpc_reply(a, serial, result, s, len, (deadline), &STAMP) +#define skabus_rpc_replyv_withfds_g(a, serial, result, v, vlen, fds, nfds, bits, deadline) skabus_rpc_replyv_withfds(a, serial, result, v, vlen, fds, nfds, bits, (deadline), &STAMP) +#define skabus_rpc_replyv_g(a, serial, result, v, vlen, deadline) skabus_rpc_replyv(a, serial, result, v, vlen, (deadline), &STAMP) /* Internal client interface storage */ @@ -153,9 +159,12 @@ extern void skabus_rpc_end (skabus_rpc_t *) ; /* Getting results */ +#define skabus_rpc_fd(a) skaclient_fd(&(a)->connection) extern int skabus_rpc_update (skabus_rpc_t *) ; +extern size_t skabus_rpc_qlist (skabus_rpc_t *, uint64_t **) ; extern int skabus_rpc_get (skabus_rpc_t *, uint64_t, int *, unixmessage_t *) ; extern int skabus_rpc_release (skabus_rpc_t *, uint64_t) ; +extern void skabus_rpc_qlist_ack(skabus_rpc_t *, size_t) ; /* Registering an interface */ @@ -191,7 +200,7 @@ extern int skabus_rpc_send_withfds_async (skabus_rpc_t *, char const *, char con #define skabus_rpc_send_async(a, ifname, s, len, limit, r) skabus_rpc_send_withfds_async(a, ifname, s, len, 0, 0, unixmessage_bits_closenone, limit, r) extern uint64_t skabus_rpc_send_withfds (skabus_rpc_t *, char const *, char const *, size_t, int const *, unsigned int, unsigned char const *, tain_t const *, tain_t const *, tain_t *) ; -#define skabus_rpc_send_withfds_g(a, ifname, s, len, fds, nfds, bits, limit, deadline) skabus_rpc_send_withfds(a, ifname, s, len, fds, nfds, limit, (deadline), &STAMP) +#define skabus_rpc_send_withfds_g(a, ifname, s, len, fds, nfds, bits, limit, deadline) skabus_rpc_send_withfds(a, ifname, s, len, fds, nfds, bits, limit, (deadline), &STAMP) #define skabus_rpc_send(a, ifname, s, len, limit, deadline, stamp) skabus_rpc_send_withfds(a, ifname, s, len, 0, 0, unixmessage_bits_closenone, limit, deadline, stamp) #define skabus_rpc_send_g(a, ifname, s, len, limit, deadline) skabus_rpc_send(a, ifname, s, len, limit, (deadline), &STAMP) @@ -199,7 +208,7 @@ extern int skabus_rpc_sendv_withfds_async (skabus_rpc_t *, char const *, struct #define skabus_rpc_sendv_async(a, ifname, v, vlen, limit, r) skabus_rpc_sendv_withfds_async(a, ifname, v, vlen, 0, 0, unixmessage_bits_closenone, limit, r) extern uint64_t skabus_rpc_sendv_withfds (skabus_rpc_t *, char const *, struct iovec const *, unsigned int, int const *, unsigned int, unsigned char const *, tain_t const *, tain_t const *, tain_t *) ; -#define skabus_rpc_sendv_withfds_g(a, ifname, v, vlen, fds, nfds, bits, limit, deadline) skabus_rpc_sendv_withfds(a, ifname, v, vlen, fds, nfds, limit, (deadline), &STAMP) +#define skabus_rpc_sendv_withfds_g(a, ifname, v, vlen, fds, nfds, bits, limit, deadline) skabus_rpc_sendv_withfds(a, ifname, v, vlen, fds, nfds, bits, limit, (deadline), &STAMP) #define skabus_rpc_sendv(a, ifname, v, vlen, limit, deadline, stamp) skabus_rpc_sendv_withfds(a, ifname, v, vlen, 0, 0, unixmessage_bits_closenone, limit, deadline, stamp) #define skabus_rpc_sendv_g(a, ifname, v, vlen, limit, deadline) skabus_rpc_sendv(a, ifname, v, vlen, limit, (deadline), &STAMP) @@ -207,7 +216,7 @@ extern int skabus_rpc_sendpm_withfds_async (skabus_rpc_t *, char const *, char c #define skabus_rpc_sendpm_async(a, cname, s, len, limit, r) skabus_rpc_sendpm_withfds_async(a, cname, s, len, 0, 0, unixmessage_bits_closenone, limit, r) extern uint64_t skabus_rpc_sendpm_withfds (skabus_rpc_t *, char const *, char const *, size_t, int const *, unsigned int, unsigned char const *, tain_t const *, tain_t const *, tain_t *) ; -#define skabus_rpc_sendpm_withfds_g(a, cname, s, len, fds, nfds, bits, limit, deadline) skabus_rpc_sendpm_withfds(a, cname, s, len, fds, nfds, limit, (deadline), &STAMP) +#define skabus_rpc_sendpm_withfds_g(a, cname, s, len, fds, nfds, bits, limit, deadline) skabus_rpc_sendpm_withfds(a, cname, s, len, fds, nfds, bits, limit, (deadline), &STAMP) #define skabus_rpc_sendpm(a, cname, s, len, limit, deadline, stamp) skabus_rpc_sendpm_withfds(a, cname, s, len, 0, 0, unixmessage_bits_closenone, limit, deadline, stamp) #define skabus_rpc_sendpm_g(a, cname, s, len, limit, deadline) skabus_rpc_sendpm(a, cname, s, len, limit, (deadline), &STAMP) @@ -215,7 +224,7 @@ extern int skabus_rpc_sendvpm_withfds_async (skabus_rpc_t *, char const *, struc #define skabus_rpc_sendvpm_async(a, cname, v, vlen, limit, r) skabus_rpc_sendvpm_withfds_async(a, cname, v, vlen, 0, 0, unixmessage_bits_closenone, limit, r) extern uint64_t skabus_rpc_sendvpm_withfds (skabus_rpc_t *, char const *, struct iovec const *, unsigned int, int const *, unsigned int, unsigned char const *, tain_t const *, tain_t const *, tain_t *) ; -#define skabus_rpc_sendvpm_withfds_g(a, cname, v, vlen, fds, nfds, bits, limit, deadline) skabus_rpc_sendvpm_withfds(a, cname, v, vlen, fds, nfds, limit, (deadline), &STAMP) +#define skabus_rpc_sendvpm_withfds_g(a, cname, v, vlen, fds, nfds, bits, limit, deadline) skabus_rpc_sendvpm_withfds(a, cname, v, vlen, fds, nfds, bits, limit, (deadline), &STAMP) #define skabus_rpc_sendvpm(a, cname, v, vlen, limit, deadline, stamp) skabus_rpc_sendvpm_withfds(a, cname, v, vlen, 0, 0, unixmessage_bits_closenone, limit, deadline, stamp) #define skabus_rpc_sendvpm_g(a, cname, v, vlen, limit, deadline) skabus_rpc_sendvpm(a, cname, v, vlen, limit, (deadline), &STAMP) diff --git a/src/libskabus/deps-lib/skabus b/src/libskabus/deps-lib/skabus index 423b672..21582c7 100644 --- a/src/libskabus/deps-lib/skabus +++ b/src/libskabus/deps-lib/skabus @@ -11,11 +11,15 @@ skabus_rpc_interface_unregister.o skabus_rpc_interface_unregister_async.o skabus_rpc_interface_zero.o skabus_rpc_qinfo_zero.o +skabus_rpc_qlist.o +skabus_rpc_qlist_ack.o skabus_rpc_r_notimpl.o skabus_rpc_rcancel_ignore.o skabus_rpc_release.o skabus_rpc_reply.o skabus_rpc_replyv.o +skabus_rpc_reply_async.o +skabus_rpc_replyv_async.o skabus_rpc_rinfo_pack.o skabus_rpc_rinfo_unpack.o skabus_rpc_rinfo_zero.o diff --git a/src/libskabus/skabus_rpc_get.c b/src/libskabus/skabus_rpc_get.c index d780211..132597a 100644 --- a/src/libskabus/skabus_rpc_get.c +++ b/src/libskabus/skabus_rpc_get.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -10,9 +11,14 @@ int skabus_rpc_get (skabus_rpc_t *a, uint64_t serial, int *result, unixmessage_t { uint32_t id ; skabus_rpc_qinfo_t *p ; - if (!avltree_search(&a->qmap, &serial, &id)) return 0 ; + if (!avltree_search(&a->qmap, &serial, &id)) + { + if (errno == ESRCH) errno = EINVAL ; + return -1 ; + } p = GENSETDYN_P(skabus_rpc_qinfo_t, &a->q, id) ; - if (p->status) return (errno = p->status, 0) ; + if (p->status) + return error_isagain(p->status) ? 0 : (errno = p->status, -1) ; *result = (int)(unsigned char)p->result ; *m = p->message ; return 1 ; diff --git a/src/libskabus/skabus_rpc_qlist.c b/src/libskabus/skabus_rpc_qlist.c new file mode 100644 index 0000000..3f11a53 --- /dev/null +++ b/src/libskabus/skabus_rpc_qlist.c @@ -0,0 +1,12 @@ +/* ISC license. */ + +#include +#include +#include + +size_t skabus_rpc_qlist (skabus_rpc_t *a, uint64_t **list) +{ + uint64_t n = genalloc_len(uint64_t, &a->qlist) ; + if (n) *list = genalloc_s(uint64_t, &a->qlist) ; + return n ; +} diff --git a/src/libskabus/skabus_rpc_qlist_ack.c b/src/libskabus/skabus_rpc_qlist_ack.c new file mode 100644 index 0000000..894f530 --- /dev/null +++ b/src/libskabus/skabus_rpc_qlist_ack.c @@ -0,0 +1,15 @@ +/* ISC license. */ + +#include +#include +#include +#include + +void skabus_rpc_qlist_ack (skabus_rpc_t *a, size_t n) +{ + uint64_t len = genalloc_len(uint64_t, &a->qlist) ; + uint64_t *p = genalloc_s(uint64_t, &a->qlist) ; + if (n > len) n = len ; + memmove(p, p + n * sizeof(uint64_t), (len - n) * sizeof(uint64_t)) ; + genalloc_setlen(uint64_t, &a->qlist, len - n) ; +} diff --git a/src/libskabus/skabus_rpc_r_notimpl.c b/src/libskabus/skabus_rpc_r_notimpl.c index 8ec3922..e36450f 100644 --- a/src/libskabus/skabus_rpc_r_notimpl.c +++ b/src/libskabus/skabus_rpc_r_notimpl.c @@ -7,5 +7,5 @@ int skabus_rpc_r_notimpl (skabus_rpc_t *a, skabus_rpc_rinfo_t const *info, unixm { (void)m ; (void)data ; - return skabus_rpc_reply(a, info->serial, ENOSYS, "", 0) ; + return skabus_rpc_reply(a, info->serial, ENOSYS, "", 0, 0, 0) ; } diff --git a/src/libskabus/skabus_rpc_release.c b/src/libskabus/skabus_rpc_release.c index d0a6875..80ad13e 100644 --- a/src/libskabus/skabus_rpc_release.c +++ b/src/libskabus/skabus_rpc_release.c @@ -12,7 +12,11 @@ int skabus_rpc_release (skabus_rpc_t *a, uint64_t serial) { uint32_t id ; skabus_rpc_qinfo_t *p ; - if (!avltree_search(&a->qmap, &serial, &id)) return 0 ; + if (!avltree_search(&a->qmap, &serial, &id)) + { + if (errno == ESRCH) errno = EINVAL ; + return 0 ; + } p = GENSETDYN_P(skabus_rpc_qinfo_t, &a->q, id) ; if (p->status) return (errno = p->status, 0) ; alloc_free(p->message.s) ; diff --git a/src/libskabus/skabus_rpc_reply.c b/src/libskabus/skabus_rpc_reply.c index 491772b..c1b72b2 100644 --- a/src/libskabus/skabus_rpc_reply.c +++ b/src/libskabus/skabus_rpc_reply.c @@ -1,17 +1,10 @@ /* ISC license. */ -#include -#include -#include #include #include -int skabus_rpc_reply_withfds (skabus_rpc_t *a, uint64_t serial, char result, char const *s, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits) +int skabus_rpc_reply_withfds (skabus_rpc_t *a, uint64_t serial, char result, char const *s, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *deadline, tain_t *stamp) { - char pack[10] = "R" ; - struct iovec v[2] = { { .iov_base = pack, .iov_len = 10 }, { .iov_base = (char *)s, .iov_len = len } } ; - unixmessage_v_t m = { .v = v, .vlen = 2, .fds = (int *)fds, .nfds = nfds } ; - uint64_pack_big(pack+1, serial) ; - pack[9] = result ; - return skaclient_aputv_and_close(&a->connection, &m, bits) ; + return skabus_rpc_reply_withfds_async(a, serial, result, s, len, fds, nfds, bits) + && skaclient_timed_aflush(&a->connection, deadline, stamp) ; } diff --git a/src/libskabus/skabus_rpc_reply_async.c b/src/libskabus/skabus_rpc_reply_async.c new file mode 100644 index 0000000..a6b106c --- /dev/null +++ b/src/libskabus/skabus_rpc_reply_async.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include + +int skabus_rpc_reply_withfds_async (skabus_rpc_t *a, uint64_t serial, char result, char const *s, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits) +{ + char pack[10] = "R" ; + struct iovec v[2] = { { .iov_base = pack, .iov_len = 10 }, { .iov_base = (char *)s, .iov_len = len } } ; + unixmessage_v_t m = { .v = v, .vlen = 2, .fds = (int *)fds, .nfds = nfds } ; + uint64_pack_big(pack+1, serial) ; + pack[9] = result ; + return skaclient_aputv_and_close(&a->connection, &m, bits) ; +} diff --git a/src/libskabus/skabus_rpc_replyv.c b/src/libskabus/skabus_rpc_replyv.c index ef727e9..c972ce4 100644 --- a/src/libskabus/skabus_rpc_replyv.c +++ b/src/libskabus/skabus_rpc_replyv.c @@ -1,19 +1,10 @@ /* ISC license. */ -#include -#include -#include #include #include -int skabus_rpc_replyv_withfds (skabus_rpc_t *a, uint64_t serial, char result, struct iovec const *v, unsigned int vlen, int const *fds, unsigned int nfds, unsigned char const *bits) +int skabus_rpc_replyv_withfds (skabus_rpc_t *a, uint64_t serial, char result, struct iovec const *v, unsigned int vlen, int const *fds, unsigned int nfds, unsigned char const *bits, tain_t const *deadline, tain_t *stamp) { - char pack[10] = "R" ; - struct iovec vv[vlen + 1] ; - unixmessage_v_t m = { .v = vv, .vlen = vlen+1, .fds = (int *)fds, .nfds = nfds } ; - vv[0].iov_base = pack ; vv[0].iov_len = 10 ; - for (unsigned int i = 0 ; i < vlen ; i++) vv[1+i] = v[i] ; - uint64_pack_big(pack+1, serial) ; - pack[9] = result ; - return skaclient_aputv_and_close(&a->connection, &m, bits) ; + return skabus_rpc_replyv_withfds_async(a, serial, result, v, vlen, fds, nfds, bits) + && skaclient_timed_aflush(&a->connection, deadline, stamp) ; } diff --git a/src/libskabus/skabus_rpc_replyv_async.c b/src/libskabus/skabus_rpc_replyv_async.c new file mode 100644 index 0000000..7bd4397 --- /dev/null +++ b/src/libskabus/skabus_rpc_replyv_async.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include + +int skabus_rpc_replyv_withfds_async (skabus_rpc_t *a, uint64_t serial, char result, struct iovec const *v, unsigned int vlen, int const *fds, unsigned int nfds, unsigned char const *bits) +{ + char pack[10] = "R" ; + struct iovec vv[vlen + 1] ; + unixmessage_v_t m = { .v = vv, .vlen = vlen+1, .fds = (int *)fds, .nfds = nfds } ; + vv[0].iov_base = pack ; vv[0].iov_len = 10 ; + for (unsigned int i = 0 ; i < vlen ; i++) vv[1+i] = v[i] ; + uint64_pack_big(pack+1, serial) ; + pack[9] = result ; + return skaclient_aputv_and_close(&a->connection, &m, bits) ; +} diff --git a/src/libskabus/skabus_rpc_update.c b/src/libskabus/skabus_rpc_update.c index d727de1..8a24ec3 100644 --- a/src/libskabus/skabus_rpc_update.c +++ b/src/libskabus/skabus_rpc_update.c @@ -115,6 +115,5 @@ static int handler (unixmessage_t const *m, void *x) int skabus_rpc_update (skabus_rpc_t *a) { - genalloc_setlen(uint64_t, &a->qlist, 0) ; return skaclient_update(&a->connection, &handler, a) ; } diff --git a/src/rpc/skabus-rpcd.c b/src/rpc/skabus-rpcd.c index 36c6a78..b9398cc 100644 --- a/src/rpc/skabus-rpcd.c +++ b/src/rpc/skabus-rpcd.c @@ -100,6 +100,11 @@ int parse_protocol_async (unixmessage_t const *m, void *p) unixmessage_drop(m) ; return 1 ; } + if (INTERFACE(QUERY(qq)->interface)->client != *(uint32_t *)p) + { + unixmessage_drop(m) ; + return 1 ; + } query_reply(qq, m->s[9], &mtosend) ; return 1 ; } -- cgit v1.2.3