summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2017-11-25 14:15:08 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2017-11-25 14:15:08 +0000
commit7ae80340d621d6add95f6c7d9e5e7a0e921f0b42 (patch)
treefdf6c4edee23a85248dc448c347d7056a0bebfff
parent38c9492b4fb971fe08e4ac0167e06e5dccb3eb2e (diff)
downloadskabus-7ae80340d621d6add95f6c7d9e5e7a0e921f0b42.tar.xz
Finish skabus_rpc doc, add missing functions
-rw-r--r--doc/libskabus/rpc.html404
-rw-r--r--package/deps.mak10
-rw-r--r--src/include/skabus/rpc.h31
-rw-r--r--src/libskabus/deps-lib/skabus4
-rw-r--r--src/libskabus/skabus_rpc_get.c10
-rw-r--r--src/libskabus/skabus_rpc_qlist.c12
-rw-r--r--src/libskabus/skabus_rpc_qlist_ack.c15
-rw-r--r--src/libskabus/skabus_rpc_r_notimpl.c2
-rw-r--r--src/libskabus/skabus_rpc_release.c6
-rw-r--r--src/libskabus/skabus_rpc_reply.c13
-rw-r--r--src/libskabus/skabus_rpc_reply_async.c17
-rw-r--r--src/libskabus/skabus_rpc_replyv.c15
-rw-r--r--src/libskabus/skabus_rpc_replyv_async.c19
-rw-r--r--src/libskabus/skabus_rpc_update.c1
-rw-r--r--src/rpc/skabus-rpcd.c5
15 files changed, 520 insertions, 44 deletions
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.
<h2> Programming </h2>
<p>
- Check the <tt>skabus/rpc.h</tt> header for the
-exact function prototypes.
+ Check the <tt>skabus/rpc.h</tt> header for details of the data
+types and function prototypes.
+</p>
+
+<h3> Overview, data types, interface callbacks </h3>
+
+<p>
+ A client starts by defining a <tt>skabus_rpc_t</tt> handle,
+initializing it to <tt>SKABUS_RPC_ZERO</tt>. It then passes a
+pointer to this handle in all its subsequent skabus_rpc calls,
+starting with <tt>skabus_rpc_init()</tt> and ending with
+<tt>skabus_rpc_end()</tt>.
+</p>
+
+<p>
+ At initialization time, as well as interface registration time,
+the client must provide a pointer to a
+<tt>skabus_rpc_interface_t</tt> structure. This structure contains
+the following fields:
+</p>
+
+<ul>
+ <li> <tt>f</tt>: a pointer to a function of type <tt>skabus_rpc_r_func_t</tt> </li>
+ <li> <tt>cancelf</tt>: a pointer to a function of type <tt>skabus_rpc_rcancel_func_t</tt> </li>
+ <li> <tt>data</tt>: a <tt>void *</tt> pointer </li>
+</ul>
+
+<p>
+ <tt>f</tt> is the callback function that will be called when the interface
+receives a query. Its prototype is
+<code>int f (skabus_rpc_t *a, skabus_rpc_rinfo_t const *info, unixmessage_t const *m, void *aux)</code>.
+</p>
+
+<ul>
+ <li> <tt>a</tt> is the handle to the client, to be used when calling the <tt>skabus_rpc_reply()</tt> function
+to send a reply. </tt> </li>
+ <li> <tt>info</tt> is a pointer to a non-writable <tt>skabus_rpc_rinfo_t</tt> structure containing information
+on the query and the qclient. This structure contains at least the following fields:
+ <ul>
+ <li> <tt>serial</tt>: a <tt>uint64_t</tt> integer that is the serial number of the query,
+to be used when calling <tt>skabus_rpc_reply()</tt>. </li>
+ <li> <tt>limit</tt>: a <tt>tain_t</tt> absolute date after which the query will expire -
+it's given as an indication so the rclient can stop handling the query if the reply is not
+ready by <tt>limit</tt>. </li>
+ <li> <tt>timestamp</tt>: a <tt>tain_t</tt> absolute date which is the time when the
+query was issued (as seen by <a href="../skabus-rpcd.html">skabus-rpcd</a>). </li>
+ <li> <tt>uid</tt>: a <tt>uid_t</tt>, the qclient's uid. </li>
+ <li> <tt>gid</tt>: a <tt>gid_t</tt>, the qclient's gid. </li>
+ <li> <tt>idstr</tt>: a pointer to a string of at most SKABUS_RPC_IDSTR_SIZE bytes
+(plus a terminating null byte) containing the qclient's identifier. </li>
+ </ul>
+ The <tt>uid</tt>, <tt>gid</tt> and <tt>idstr</tt> field can be used to filter queries
+if the rclient only authorizes specific qclients to send them. This is in addition
+to the pre-filtering done by the server via regex on <tt>idstr</tt>. </li>
+ <li> <tt>m</tt> is a pointer to a non-writable <tt>unixmessage_t</tt> structure
+containing the query itself. This structure contains at least the following fields:
+ <ul>
+ <li> <tt>s</tt>: a <tt>char *</tt> pointing to the text of the query </li>
+ <li> <tt>len</tt>: a <tt>size_t</tt> containing the length of the query </li>
+ <li> <tt>fds</tt>: a <tt>int *</tt> pointing to an array of open file descriptors, if any </li>
+ <li> <tt>nfds</tt>: an <tt>unsigned int</tt> containing the number of file descriptors pointed to by <tt>fds</tt> </li>
+ </ul>
+ If the query ends up being unused, <tt>f</tt> needs to call <tt>unixmessage_drop(m)</tt> in order to
+close any potential file descriptors contained in the query. </li>
+ <li> <tt>aux</tt> is the auxiliary <tt>data</tt> pointer provided at registration time in
+the <tt>skabus_rpc_interface_t</tt> structure (see below). </li>
+</ul>
+
+<p>
+ <tt>cancelf</tt> is the callback function that will be called if the qclient,
+or <a href="../skabus-rpcd.html">skabus-rpcd</a>, cancels a query made to the interface.
+Its prototype is
+<code>int cancelf (uint64_t serial, char reason, void *aux)</code>.
+</p>
+
+<ul>
+ <li> <tt>serial</tt> is the serial number of the query being cancelled </li>
+ <li> <tt>reason</tt> is the reason for the cancellation. 0 means the qclient
+explicitly asked for a cancellation. Any other value is an <em>errno</em> value
+meaning something failed in the <a href="../skabus-rpcd.html">skabus-rpcd</a>
+server and it had to cancel the query. </li>
+ <li> <tt>aux</tt> is the auxiliary <tt>data</tt> pointer provided at registration time in
+the <tt>skabus_rpc_interface_t</tt> structure (see below). </li>
+</ul>
+
+<p>
+ <tt>data</tt> 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 <tt>aux</tt> argument to the <tt>f</tt> or <tt>cancelf</tt> callbacks when
+they're called.
</p>
<h3> Starting and ending a session </h3>
-<em>to be continued</em>
+<h4> <code>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)</code> </h4>
+
+<p>
+ Starts a session with an instance of <a href="../skabus-rpcd.html">skabus-rpcd</a> listening
+on the socket at <em>path</em>. The client attempts to register the <em>id</em> identifier
+for itself, and will reply to private queries (queries directly sent to it, instead of to an
+interface) with the functions defined in <em>ifbody</em>. Only qclients whose identifiers match the
+<em>re</em> regular expression will be able to send private queries.
+</p>
+
+<p>
+ If no private queries are to be served, <tt>&amp;skabus_rpc_interface_zero</tt> can be
+used as an <em>ifbody</em> argument; and a never-matching regular expression, such
+as <tt>.^</tt>, should be used as a <em>re</em> argument.
+</p>
+
+<p>
+ The client must be authorized to use <em>id</em> as an identifier. That means
+<em>id</em> must match the regular expression given as an <tt>env/SKABUS_RPC_ID_REGEX</tt>
+entry for the client's uid or gid in the <a href="../skabus-rpcd.html#configuration">skabus-rpcd configuration</a>.
+</p>
+
+<p>
+ On success, the function returns nonzero. The <em>a</em> handle then needs to be
+used as the first argument to all the subsequent <tt>skabus_rpc</tt> function calls.
+On failure, the function returns 0, and sets errno.
+</p>
+
+<h4> <code> void skabus_rpc_end (skabus_rpc_t *a)</code> </h4>
+
+<p>
+ Ends the current session with handle <em>a</em>.
+</p>
+
+<h3> Registering and unregistering an interface </h3>
+
+<h4> <code> 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)</code> </h4>
+
+<p>
+ Registers an interface with name <em>ifname</em> and implementation pointed to
+by <em>ifbody</em>. qclients wanting to send queries to <em>ifname</em> will need
+to have an identifier matching the <em>re</em> regular expression.
+</p>
+
+<p>
+ The rclient must be authorized to use <em>ifname</em> as an interface name. That means
+<em>ifname</em> must match the regular expression given as an <tt>env/SKABUS_RPC_INTERFACES_REGEX</tt>
+entry for the rclient's uid or gid in the <a href="../skabus-rpcd.html#configuration">skabus-rpcd configuration</a>.
+</p>
+
+<p>
+ On success, the function stores an interface identifier into <em>ifid</em>, and returns nonzero.
+On failure, it returns 0, and sets errno.
+</p>
+
+<h4> <code> int skabus_rpc_interface_unregister (skabus_rpc_t *a, uint32_t ifid, tain_t const *deadline, tain_t *stamp) </code> </h4>
+
+<p>
+ Unregisters the interface with id <em>ifid</em>. <em>ifid</em> may be
+reused in future interface registrations.
+</p>
+
+<p>
+ 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.
+</p>
+
+<p>
+ On success, the function returns nonzero. On failure, it returns 0, and sets errno.
+</p>
+
+<h3> Sending and cancelling a query </h3>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Sends a query to interface <em>ifname</em>. The query is made of <em>len</em> bytes of data
+pointed to by <em>s</em>, as well as <em>nfds</em> open file descriptors whose list is pointed
+to by <em>fds</em>.
+</p>
+
+<p>
+ If <em>nfds</em> 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
+<tt>env/SKABUS_RPC_QSENDFDS</tt> entry.
+</p>
+
+<p>
+ <em>bits</em> is a bitfield containing at least <em>nfds</em> bits. If the <em>n</em>th bit is 1,
+it means that <tt>fds[<em>n</em>]</tt> will be closed after being sent to skabus-rpcd. If it is 0,
+the fd will not be touched. As a <em>bits</em> value, you can use <tt>unixmessage_bits_closenone</tt>
+to close nothing, or <tt>unixmessage_bits_closeall</tt> to close all the descriptors in <em>fds</em>.
+</p>
+
+<p>
+ <em>limit</em> 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.
+</p>
+
+<p>
+ Please note that <em>limit</em> 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 <em>deadline</em> argument, which is a
+deadline for the current <tt>skabus_rpc_send_withfds()</tt> function call. If <em>limit</em>
+is reached, it's normal operation - the query simply took too long to be handled. But if
+<em>deadline</em> (which should be way earlier than <em>limit</em>) is reached, it means the
+server got stuck somewhere in the initial function call, and it's not normal operation at
+all.
+</p>
+
+<p>
+ 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.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Sends a text-only query to <em>ifname</em>. It's a wrapper over <tt>skabus_rpc_send_withfds</tt>.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Like <tt>skabus_rpc_send_withfds</tt>, except the text of the query is not
+given as a single array of bytes, but as several chunks of data defined by
+the <em>v</em> array of length <em>vlen</em>.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Like <tt>skabus_rpc_send</tt>, except the text of the query is not
+given as a single array of bytes, but as several chunks of data defined by
+the <em>v</em> array of length <em>vlen</em>.
+</p>
+
+<h4> <code> 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) <br />
+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) <br />
+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) <br />
+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) </code> </h4>
+<p>
+ These functions are the equivalent of the previous ones, but send a private query instead.
+<em>rid</em> 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
+<em>rid</em> client when it registered itself.
+</p>
+
+<h4> <code> int skabus_rpc_cancel (skabus_rpc_t *a, uint64_t serial, tain_t const *deadline, tain_t *stamp) </code> </h4>
+
+<p>
+ Cancels the query numbered <em>serial</em>. If the query is currently being handled
+by the rclient, the rclient will be notified (the appropriate <tt>cancelf</tt>
+callback will be called).
+</p>
+
+<p>
+ On success, the function returns nonzero. On failure, it returns 0, and sets errno.
+</p>
+
+<h3> Answering queries </h3>
+
+<p>
+ One of these functions must be called in every <tt>f</tt> callback defined
+in interface bodies, in order to send the reply to the qclient.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Sends a reply to the query numbered <em>serial</em>. This reply is made of
+an overall value <em>result</em> (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 <em>len</em> bytes pointed by <em>s</em> and
+potentially <em>nfds</em> open file descriptors pointed to by <em>fds</em>.
+</p>
+
+<p>
+ If <em>nfds</em> 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
+<tt>env/SKABUS_RPC_RSENDFDS</tt> entry.
+</p>
+
+<p>
+ <em>bits</em> is a bitfield containing at least <em>nfds</em> bits. If the <em>n</em>th bit is 1,
+it means that <tt>fds[<em>n</em>]</tt> will be closed after being sent to skabus-rpcd. If it is 0,
+the fd will not be touched. As a <em>bits</em> value, you can use <tt>unixmessage_bits_closenone</tt>
+to close nothing, or <tt>unixmessage_bits_closeall</tt> to close all the descriptors in <em>fds</em>.
+</p>
+
+<p>
+ 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
+<em>serial</em> does not match a query that was sent to this rclient; in that case,
+skabus-rpcd will silently ignore the reply.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Shortcut for <tt>skabus_rpc_reply_withfds</tt> when the reply
+does not contain any file descriptors.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Similar to <tt>skabus_rpc_reply_withfds</tt>, but the text of the reply
+is made of <em>vlen</em> chunks described in the <em>v</em> array.
+</p>
+
+<h4> <code> 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) </code> </h4>
+
+<p>
+ Shortcut for <tt>skabus_rpc_replyv_withfds</tt> when the reply
+does not contain any file descriptors.
+</p>
+
+<h3> Getting replies to queries </h3>
+
+<h4> int skabus_rpc_fd (skabus_rpc_t *a) </h4>
+
+<p>
+ 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 <tt>poll</tt> or <tt>select</tt> call. (For easy timeout
+management, <a href="//skarnet.org/software/skalibs/libstddjb/iopause.html">iopause</a>
+is recommended.) When the descriptor is readable, do not read it,
+but call the following function instead.
+</p>
+
+<h4> <code> int skabus_rpc_update (skabus_rpc_t *a) </code> </h4>
+
+<p>
+ Updates the qclient's data structures with the latest information
+from skabus-rpcd. This function should be called when the connection
+descriptor becomes readable.
+</p>
+
+<p>
+ 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.
+</p>
+
+<h4> <code> size_t skabus_rpc_qlist (skabus_rpc_t *a, uint64_t **list) </code> </h4>
+
+<p>
+ 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 <em>*list</em>. The
+elements of the array are the serial numbers for the queries
+whose answered have arrived.
+</p>
+
+<p>
+ The <em>*list</em> pointer is only valid until the next invocation
+of <tt>skabus_rpc_update()</tt>.
+</p>
+
+<h4> <code> int skabus_rpc_get (skabus_rpc_t *a, uint64_t serial, int *result, unixmessage_t *m) </code> </h4>
+
+<p>
+ Get the answer for the query numbered <em>serial</em>.
+ Returns a negative number (and sets errno) if an error occurred. errno is EINVAL if <em>serial</em>
+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 <em>*result</em>, and the reply message is pointed by <em>m</em>.
+</p>
+
+<p>
+ <em>m</em> points to a <tt>unixmessage_t</tt> structure containing the
+following fields:
+</p>
+
+<ul>
+ <li> <tt>s</tt>: a <tt>char *</tt> containing the text of the message </li>
+ <li> <tt>len</tt>: a <tt>size_t</tt> containing the length of the <tt>s</tt> field </li>
+ <li> <tt>fds</tt>: a <tt>int *</tt> pointing to an array of file descriptors </li>
+ <li> <tt>nfds</tt>: an <tt>unsigned int</tt> containing the length of the array pointed to by the <tt>fds</tt> field </li>
+</ul>
+
+<p>
+ If the reply is unwanted, the qclient should call <tt>unixmessage_drop(m)</tt>
+to make sure all file descriptors contained in it, if any, are closed.
+</p>
+
+<h4> <code> int skabus_rpc_release (skabus_rpc_t *a, uint64_t serial) </code> </h4>
+
+<p>
+ Releases the resources occupied by the reply to the query numbered <em>serial</em>.
+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.
+</p>
+
+<p>
+ The function returns 1 on success, and 0 (and sets errno) on failure.
+errno is EINVAL if <em>serial</em> is an invalid number, and EAGAIN if the query
+is in-flight. To cancel an in-flight query, use <tt>skabus_rpc_cancel</tt>
+instead.
+</p>
+
+<h4> <code> void skabus_rpc_qlist_ack (skabus_rpc_t *a, size_t n) </code> </h4>
+
+<p>
+ Acknowledges that <em>n</em> replies have been handled: removes <em>n</em>
+elements at the head of the queue that <tt>skabus_rpc_qlist</tt> returns.
+</p>
</body>
</html>
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 <stdint.h>
#include <errno.h>
+#include <skalibs/error.h>
#include <skalibs/gensetdyn.h>
#include <skalibs/avltree.h>
#include <skabus/rpc.h>
@@ -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 <skalibs/uint64.h>
+#include <skalibs/genalloc.h>
+#include <skabus/rpc.h>
+
+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 <string.h>
+#include <skalibs/uint64.h>
+#include <skalibs/genalloc.h>
+#include <skabus/rpc.h>
+
+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 <sys/uio.h>
-#include <skalibs/uint64.h>
-#include <skalibs/unixmessage.h>
#include <skalibs/skaclient.h>
#include <skabus/rpc.h>
-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 <sys/uio.h>
+#include <skalibs/uint64.h>
+#include <skalibs/unixmessage.h>
+#include <skalibs/skaclient.h>
+#include <skabus/rpc.h>
+
+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 <sys/uio.h>
-#include <skalibs/uint64.h>
-#include <skalibs/unixmessage.h>
#include <skalibs/skaclient.h>
#include <skabus/rpc.h>
-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 <sys/uio.h>
+#include <skalibs/uint64.h>
+#include <skalibs/unixmessage.h>
+#include <skalibs/skaclient.h>
+#include <skabus/rpc.h>
+
+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 ;
}