+
+/**
+ * Afs command handlers run as a process which is not related to the afs
+ * process, i.e. they can not change the address space of afs directly.
+ * Therefore afs commands typically consist of two functions: The command
+ * handler and the corresponding callback function that runs in afs context.
+ *
+ * \sa send_callback_request().
+ */
+typedef void callback_function(int fd, const struct osl_object *);
+
+/**
+ * Callbacks send chunks to data back to the command handler. Pointers to
+ * this type of function are used by \ref send_callback_request and friends
+ * to deal with the data in the command handler process.
+ *
+ * \sa \ref send_callback_request().
+ */
+typedef int callback_result_handler(struct osl_object *result, uint8_t band, void *private);
+int afs_cb_result_handler(struct osl_object *result, uint8_t band, void *private);
+int pass_buffer_as_shm(int fd, uint8_t band, const char *buf, size_t size);
+
+/** Structure passed to the AFS max_size handler. */
+struct afs_max_size_handler_data {
+ /** Local socket connecting the command handler and the AFS process. */
+ int fd;
+ /** The sideband designator for this data packet. */
+ uint8_t band;
+};
+
+/**
+ * Standard max_size handler for AFS commands.
+ *
+ * \param buf Contains (part of) the AFS command output.
+ * \param size The number of bytes in \a buf.
+ * \param private Pointer to a \ref afs_max_size_handler_data structure.
+ *
+ * Whenever the output of an AFS command exceeds the maximal size of a shared
+ * memory area, the max size handler of the para_buffer which holds the command
+ * output is called with \a private being a pointer to a structure of type
+ * afs_max_size_handler_data.
+ *
+ * \return The return value of the underlying call to \ref
+ * pass_buffer_as_shm().
+ */
+_static_inline_ int afs_max_size_handler(char *buf, size_t size, void *private)
+{
+ struct afs_max_size_handler_data *amshd = private;
+ return pass_buffer_as_shm(amshd->fd, amshd->band, buf, size);
+}
+
+__noreturn void afs_init(uint32_t cookie, int socket_fd);
+void afs_event(enum afs_events event, struct para_buffer *pb,
+ void *data);