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 * @include: gio/gunixconnection.h
24 * @see_also: #GSocketConnection.
26 * This is the subclass of #GSocketConnection that is created
27 * for UNIX domain sockets.
29 * It contains functions to do some of the UNIX socket specific
30 * functionality like passing file descriptors.
32 * Note that <filename><gio/gunixconnection.h></filename> belongs to
33 * the UNIX-specific GIO interfaces, thus you have to use the
34 * <filename>gio-unix-2.0.pc</filename> pkg-config file when using it.
39 #include <gio/gsocketcontrolmessage.h>
40 #include <gio/gunixfdmessage.h>
41 #include <gio/gsocket.h>
46 G_DEFINE_TYPE_WITH_CODE (GUnixConnection, g_unix_connection,
47 G_TYPE_SOCKET_CONNECTION,
48 g_socket_connection_factory_register_type (g_define_type_id,
51 G_SOCKET_PROTOCOL_DEFAULT);
55 * g_unix_connection_send_fd:
56 * @connection: a #GUnixConnection
57 * @fd: a file descriptor
58 * @cancellable: optional #GCancellable object, %NULL to ignore.
59 * @error: #GError for error reporting, or %NULL to ignore.
61 * Passes a file descriptor to the recieving side of the
62 * connection. The recieving end has to call g_unix_connection_receive_fd()
63 * to accept the file descriptor.
65 * As well as sending the fd this also writes a single byte to the
66 * stream, as this is required for fd passing to work on some
69 * Returns: a %TRUE on success, %NULL on error.
74 g_unix_connection_send_fd (GUnixConnection *connection,
76 GCancellable *cancellable,
79 GSocketControlMessage *scm;
82 g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), FALSE);
83 g_return_val_if_fail (fd >= 0, FALSE);
85 scm = g_unix_fd_message_new ();
87 if (!g_unix_fd_message_append_fd (G_UNIX_FD_MESSAGE (scm), fd, error))
93 g_object_get (connection, "socket", &socket, NULL);
94 if (g_socket_send_message (socket, NULL, NULL, 0, &scm, 1, 0, cancellable, error) != 1)
95 /* XXX could it 'fail' with zero? */
97 g_object_unref (socket);
103 g_object_unref (socket);
104 g_object_unref (scm);
110 * g_unix_connection_receive_fd:
111 * @connection: a #GUnixConnection
112 * @cancellable: optional #GCancellable object, %NULL to ignore
113 * @error: #GError for error reporting, or %NULL to ignore
115 * Receives a file descriptor from the sending end of the connection.
116 * The sending end has to call g_unix_connection_send_fd() for this
119 * As well as reading the fd this also reads a single byte from the
120 * stream, as this is required for fd passing to work on some
123 * Returns: a file descriptor on success, -1 on error.
128 g_unix_connection_receive_fd (GUnixConnection *connection,
129 GCancellable *cancellable,
132 GSocketControlMessage **scms;
133 gint *fds, nfd, fd, nscm;
134 GUnixFDMessage *fdmsg;
137 g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), -1);
139 g_object_get (connection, "socket", &socket, NULL);
140 if (g_socket_receive_message (socket, NULL, NULL, 0,
141 &scms, &nscm, NULL, cancellable, error) != 1)
142 /* XXX it _could_ 'fail' with zero. */
144 g_object_unref (socket);
149 g_object_unref (socket);
155 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
156 _("Expecting 1 control message, got %d"), nscm);
158 for (i = 0; i < nscm; i++)
159 g_object_unref (scms[i]);
166 if (!G_IS_UNIX_FD_MESSAGE (scms[0]))
168 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
169 _("Unexpected type of ancillary data"));
170 g_object_unref (scms[0]);
176 fdmsg = G_UNIX_FD_MESSAGE (scms[0]);
179 fds = g_unix_fd_message_steal_fds (fdmsg, &nfd);
180 g_object_unref (fdmsg);
186 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
187 _("Expecting one fd, but got %d\n"), nfd);
189 for (i = 0; i < nfd; i++)
202 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
203 _("Received invalid fd"));
211 g_unix_connection_init (GUnixConnection *connection)
216 g_unix_connection_class_init (GUnixConnectionClass *class)
220 /* TODO: Other stuff we might want to add are:
221 void g_unix_connection_send_fd_async (GUnixConnection *connection,
225 GAsyncReadyCallback callback,
227 gboolean g_unix_connection_send_fd_finish (GUnixConnection *connection,
230 gboolean g_unix_connection_send_fds (GUnixConnection *connection,
234 void g_unix_connection_send_fds_async (GUnixConnection *connection,
238 GAsyncReadyCallback callback,
240 gboolean g_unix_connection_send_fds_finish (GUnixConnection *connection,
243 void g_unix_connection_receive_fd_async (GUnixConnection *connection,
245 GAsyncReadyCallback callback,
247 gint g_unix_connection_receive_fd_finish (GUnixConnection *connection,
251 gboolean g_unix_connection_send_credentials (GUnixConnection *connection,
253 void g_unix_connection_send_credentials_async (GUnixConnection *connection,
255 GAsyncReadyCallback callback,
257 gboolean g_unix_connection_send_credentials_finish (GUnixConnection *connection,
260 gboolean g_unix_connection_send_fake_credentials (GUnixConnection *connection,
265 void g_unix_connection_send_fake_credentials_async (GUnixConnection *connection,
270 GAsyncReadyCallback callback,
272 gboolean g_unix_connection_send_fake_credentials_finish (GUnixConnection *connection,
275 gboolean g_unix_connection_receive_credentials (GUnixConnection *connection,
280 void g_unix_connection_receive_credentials_async (GUnixConnection *connection,
282 GAsyncReadyCallback callback,
284 gboolean g_unix_connection_receive_credentials_finish (GUnixConnection *connection,
290 gboolean g_unix_connection_create_pair (GUnixConnection **one,
291 GUnixConnection **two,
295 #define __G_UNIX_CONNECTION_C__
296 #include "gioaliasdef.c"