/* vdagent-connection.h Copyright 2019 Red Hat, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef __VDAGENT_CONNECTION_H #define __VDAGENT_CONNECTION_H #include #include #include G_BEGIN_DECLS #define VDAGENT_TYPE_CONNECTION vdagent_connection_get_type() G_DECLARE_DERIVABLE_TYPE(VDAgentConnection, vdagent_connection, VDAGENT, CONNECTION, GObject) /* Sublasses of VDAgentConnection must implement * handle_header and handle_message. */ struct _VDAgentConnectionClass { GObjectClass parent_class; /* Called when a message header has been read. * * Handler must parse the @header_buf and * return the size of message's body. * * @header_buf must not be freed. */ gsize (*handle_header) (VDAgentConnection *self, gpointer header_buf); /* Called when a full message has been read. * * @header, @data must not be freed. */ void (*handle_message) (VDAgentConnection *self, gpointer header_buf, gpointer data_buf); }; /* Invoked when an error occurs during read or write. * * If @err is NULL, the connection was closed by the remote side, * otherwise the handler must free @err using g_error_free(). * * VDAgentConnection will not continue with the given I/O-op that failed. */ typedef void (*VDAgentConnErrorCb)(VDAgentConnection *self, GError *err); /* Open a file in @path for read and write. * Returns a new GIOStream to the given file or NULL when @err is set. */ GIOStream *vdagent_file_open(const gchar *path, GError **err); /* Create a socket and initiate a new connection to the socket in @path. * Returns a new GIOStream or NULL when @err is set. */ GIOStream *vdagent_socket_connect(const gchar *path, GError **err); /* Set up @self to use @io_stream and start reading from it. * * If @wait_on_opening is set to TRUE, EOF won't be treated as an error * until the first message is successfully read or written to the @io_stream. */ void vdagent_connection_setup(VDAgentConnection *self, GIOStream *io_stream, gboolean wait_on_opening, gsize header_size, VDAgentConnErrorCb error_cb); /* Cancel running I/O-operations, close the underlying FD and * unref the VDAgentConnection object. */ void vdagent_connection_destroy(gpointer p); /* Append a message to the write queue. * * VDAgentConnection takes ownership of @data * and frees it once the message is flushed. */ void vdagent_connection_write(VDAgentConnection *self, gpointer data, gsize size); /* Synchronously write all queued messages to the output stream. */ void vdagent_connection_flush(VDAgentConnection *self); typedef struct PidUid { pid_t pid; uid_t uid; } PidUid; /* Returns the PID and UID of the foreign process connected to the socket * or fill @err set. */ PidUid vdagent_connection_get_peer_pid_uid(VDAgentConnection *self, GError **err); G_END_DECLS #endif