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_condition_wait (socket, G_IO_OUT, cancellable, error) ||
90 g_socket_send_message (socket, NULL, NULL, 0, &scm, 1, 0, error) != 1)
91 /* XXX could it 'fail' with zero? */
93 g_object_unref (socket);
99 g_object_unref (socket);
100 g_object_unref (scm);
106 * g_unix_connection_receive_fd:
107 * @connection: a #GUnixConnection.
108 * @cancellable: optional #GCancellable object, %NULL to ignore.
109 * @error: #GError for error reporting, or %NULL to ignore.
111 * Recieves a file descriptor from the sending end of the
112 * connection. The sending end has to call g_unix_connection_send_fd()
115 * As well as reading the fd this also reads a single byte from the
116 * stream, as this is required for fd passing to work on some
119 * Returns: a file descriptor on success, -1 on error.
124 g_unix_connection_receive_fd (GUnixConnection *connection,
125 GCancellable *cancellable,
128 GSocketControlMessage **scms;
129 gint *fds, nfd, fd, nscm;
130 GUnixFDMessage *fdmsg;
133 g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), -1);
135 g_object_get (connection, "socket", &socket, NULL);
136 if (!g_socket_condition_wait (socket, G_IO_IN, cancellable, error) ||
137 g_socket_receive_message (socket, NULL, NULL, 0,
138 &scms, &nscm, NULL, error) != 1)
139 /* XXX it _could_ 'fail' with zero. */
141 g_object_unref (socket);
146 g_object_unref (socket);
152 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
153 _("Expecting 1 control message, got %d"), nscm);
155 for (i = 0; i < nscm; i++)
156 g_object_unref (scms[i]);
163 if (!G_IS_UNIX_FD_MESSAGE (scms[0]))
165 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
166 _("Unexpected type of ancillary data"));
167 g_object_unref (scms[0]);
173 fdmsg = G_UNIX_FD_MESSAGE (scms[0]);
176 fds = g_unix_fd_message_steal_fds (fdmsg, &nfd);
177 g_object_unref (fdmsg);
183 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
184 _("Expecting one fd, but got %d\n"), nfd);
186 for (i = 0; i < nfd; i++)
199 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
200 _("Received invalid fd"));
208 g_unix_connection_init (GUnixConnection *connection)
213 g_unix_connection_class_init (GUnixConnectionClass *class)
217 /* TODO: Other stuff we might want to add are:
218 void g_unix_connection_send_fd_async (GUnixConnection *connection,
222 GAsyncReadyCallback callback,
224 gboolean g_unix_connection_send_fd_finish (GUnixConnection *connection,
227 gboolean g_unix_connection_send_fds (GUnixConnection *connection,
231 void g_unix_connection_send_fds_async (GUnixConnection *connection,
235 GAsyncReadyCallback callback,
237 gboolean g_unix_connection_send_fds_finish (GUnixConnection *connection,
240 void g_unix_connection_receive_fd_async (GUnixConnection *connection,
242 GAsyncReadyCallback callback,
244 gint g_unix_connection_receive_fd_finish (GUnixConnection *connection,
248 gboolean g_unix_connection_send_credentials (GUnixConnection *connection,
250 void g_unix_connection_send_credentials_async (GUnixConnection *connection,
252 GAsyncReadyCallback callback,
254 gboolean g_unix_connection_send_credentials_finish (GUnixConnection *connection,
257 gboolean g_unix_connection_send_fake_credentials (GUnixConnection *connection,
262 void g_unix_connection_send_fake_credentials_async (GUnixConnection *connection,
267 GAsyncReadyCallback callback,
269 gboolean g_unix_connection_send_fake_credentials_finish (GUnixConnection *connection,
272 gboolean g_unix_connection_receive_credentials (GUnixConnection *connection,
277 void g_unix_connection_receive_credentials_async (GUnixConnection *connection,
279 GAsyncReadyCallback callback,
281 gboolean g_unix_connection_receive_credentials_finish (GUnixConnection *connection,
287 gboolean g_unix_connection_create_pair (GUnixConnection **one,
288 GUnixConnection **two,
292 #define __G_UNIX_CONNECTION_C__
293 #include "gioaliasdef.c"