1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright © 2009 Codethink Limited
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published
7 * by the Free Software Foundation; either version 2 of the licence or (at
8 * your option) any later version.
10 * See the included COPYING file for more information.
12 * Authors: Ryan Lortie <desrt@desrt.ca>
16 #include "gunixconnection.h"
20 * SECTION: gunixconnection
21 * @title: GUnixConnection
22 * @short_description: a Unix domain #GSocketConnection
23 * @see_also: #GSocketConnection.
25 * This is the subclass of #GSocketConnection that is created
26 * for UNIX domain sockets.
28 * It contains functions to do some of the unix socket specific
29 * functionallity like passing file descriptors.
34 #include <gio/gsocketcontrolmessage.h>
35 #include <gio/gunixfdmessage.h>
36 #include <gio/gsocket.h>
41 G_DEFINE_TYPE_WITH_CODE (GUnixConnection, g_unix_connection,
42 G_TYPE_SOCKET_CONNECTION,
43 g_socket_connection_factory_register_type (g_define_type_id,
46 G_SOCKET_PROTOCOL_DEFAULT);
50 * g_unix_connection_send_fd:
51 * @connection: a #GUnixConnection
52 * @fd: a file descriptor
53 * @cancellable: optional #GCancellable object, %NULL to ignore.
54 * @error: #GError for error reporting, or %NULL to ignore.
56 * Passes a file descriptor to the recieving side of the
57 * connection. The recieving end has to call g_unix_connection_receive_fd()
58 * to accept the file descriptor.
60 * As well as sending the fd this also writes a single byte to the
61 * stream, as this is required for fd passing to work on some
64 * Returns: a %TRUE on success, %NULL on error.
69 g_unix_connection_send_fd (GUnixConnection *connection,
71 GCancellable *cancellable,
74 GSocketControlMessage *scm;
77 g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), FALSE);
78 g_return_val_if_fail (fd >= 0, FALSE);
80 scm = g_unix_fd_message_new ();
82 if (!g_unix_fd_message_append_fd (G_UNIX_FD_MESSAGE (scm), fd, error))
88 g_object_get (connection, "socket", &socket, NULL);
89 if (g_socket_send_message (socket, NULL, NULL, 0, &scm, 1, 0, cancellable, error) != 1)
90 /* XXX could it 'fail' with zero? */
92 g_object_unref (socket);
98 g_object_unref (socket);
105 * g_unix_connection_receive_fd:
106 * @connection: a #GUnixConnection
107 * @cancellable: optional #GCancellable object, %NULL to ignore
108 * @error: #GError for error reporting, or %NULL to ignore
110 * Receives a file descriptor from the sending end of the connection.
111 * The sending end has to call g_unix_connection_send_fd() for this
114 * As well as reading the fd this also reads a single byte from the
115 * stream, as this is required for fd passing to work on some
118 * Returns: a file descriptor on success, -1 on error.
123 g_unix_connection_receive_fd (GUnixConnection *connection,
124 GCancellable *cancellable,
127 GSocketControlMessage **scms;
128 gint *fds, nfd, fd, nscm;
129 GUnixFDMessage *fdmsg;
132 g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), -1);
134 g_object_get (connection, "socket", &socket, NULL);
135 if (g_socket_receive_message (socket, NULL, NULL, 0,
136 &scms, &nscm, NULL, cancellable, error) != 1)
137 /* XXX it _could_ 'fail' with zero. */
139 g_object_unref (socket);
144 g_object_unref (socket);
150 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
151 _("Expecting 1 control message, got %d"), nscm);
153 for (i = 0; i < nscm; i++)
154 g_object_unref (scms[i]);
161 if (!G_IS_UNIX_FD_MESSAGE (scms[0]))
163 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
164 _("Unexpected type of ancillary data"));
165 g_object_unref (scms[0]);
171 fdmsg = G_UNIX_FD_MESSAGE (scms[0]);
174 fds = g_unix_fd_message_steal_fds (fdmsg, &nfd);
175 g_object_unref (fdmsg);
181 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
182 _("Expecting one fd, but got %d\n"), nfd);
184 for (i = 0; i < nfd; i++)
197 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
198 _("Received invalid fd"));
206 g_unix_connection_init (GUnixConnection *connection)
211 g_unix_connection_class_init (GUnixConnectionClass *class)
215 /* TODO: Other stuff we might want to add are:
216 void g_unix_connection_send_fd_async (GUnixConnection *connection,
220 GAsyncReadyCallback callback,
222 gboolean g_unix_connection_send_fd_finish (GUnixConnection *connection,
225 gboolean g_unix_connection_send_fds (GUnixConnection *connection,
229 void g_unix_connection_send_fds_async (GUnixConnection *connection,
233 GAsyncReadyCallback callback,
235 gboolean g_unix_connection_send_fds_finish (GUnixConnection *connection,
238 void g_unix_connection_receive_fd_async (GUnixConnection *connection,
240 GAsyncReadyCallback callback,
242 gint g_unix_connection_receive_fd_finish (GUnixConnection *connection,
246 gboolean g_unix_connection_send_credentials (GUnixConnection *connection,
248 void g_unix_connection_send_credentials_async (GUnixConnection *connection,
250 GAsyncReadyCallback callback,
252 gboolean g_unix_connection_send_credentials_finish (GUnixConnection *connection,
255 gboolean g_unix_connection_send_fake_credentials (GUnixConnection *connection,
260 void g_unix_connection_send_fake_credentials_async (GUnixConnection *connection,
265 GAsyncReadyCallback callback,
267 gboolean g_unix_connection_send_fake_credentials_finish (GUnixConnection *connection,
270 gboolean g_unix_connection_receive_credentials (GUnixConnection *connection,
275 void g_unix_connection_receive_credentials_async (GUnixConnection *connection,
277 GAsyncReadyCallback callback,
279 gboolean g_unix_connection_receive_credentials_finish (GUnixConnection *connection,
285 gboolean g_unix_connection_create_pair (GUnixConnection **one,
286 GUnixConnection **two,
290 #define __G_UNIX_CONNECTION_C__
291 #include "gioaliasdef.c"