Hi all, We’re looking at adding a recvmmsg()-like function to GSocket here: https://bugzilla.gnome.org/show_bug.cgi?id=751924 And are wondering about how bindable the GInputMessage struct (which mirrors struct mmsghdr (see `man recvmmsg` and `man recvmsg`) will be. The address and control_messages fields can either be set to NULL by the caller, or set to return locations for a message address and ancillary data (allocated by the callee). Would this map nicely to various GIR-bound languages? Would it require additions to the GIR semantics for annotations of struct fields (which I believe are currently loosely defined)? /** * GInputMessage: * @address: (optional) (out callee-allocates) (transfer full): return location * for a #GSocketAddress, or %NULL * @vectors: (array length=num_vectors) (out caller-allocates): pointer to an * array of input vectors * @num_vectors: the number of input vectors pointed to by @vectors * @bytes_received: (out): will be set to the number of bytes that have been * received * @flags: (out): collection of #GSocketMsgFlags for the received message, * outputted by the call * @control_messages: (array length=num_control_messages) (optional) * (out callee-allocates) (transfer full): return location for a * caller-allocated array of #GSocketControlMessages, or %NULL * @num_control_messages: (out) (optional): return location for the number of * elements in @control_messages * * Structure used for scatter/gather data input when receiving multiple * messages or packets in one go. You generally pass in an array of empty * #GInputVectors and the operation will use all the buffers as if they * were one buffer, and will set @bytes_received to the total number of bytes * received across all #GInputVectors. * * This structure closely mirrors `struct mmsghdr` and `struct msghdr` from * the [POSIX sockets * API]( http://man7.org/linux/man-pages/man2/recvmmsg.2.html#DESCRIPTION). * * If @address is non-%NULL then it is set to the source address the message * was received from, and ownership is transferred to the caller. * * If @control_messages is non-%NULL then it is set to an array of control * messages received with the message (if any), and ownership is transferred * to the caller. @num_control_messages is set to the number of elements in * this array, which may be zero. * * Flags relevant to this message will be returned in @flags. For example, * `MSG_EOR` or `MSG_TRUNC`. * * Since: 2.46 */ typedef struct _GInputMessage GInputMessage; struct _GInputMessage { GSocketAddress **address; GInputVector *vectors; guint num_vectors; gsize bytes_received; gint flags; GSocketControlMessage ***control_messages; guint *num_control_messages; }; Replies here or on the bug report please. Philip
Attachment:
signature.asc
Description: This is a digitally signed message part