Add some more cases to the app-id unit tests
[glib.git] / gio / tests / gdbus-example-peer.c
blobb954f7426d9ffe08512f3b98614454ce1a71e0bb
1 /*
3 Usage examples (modulo addresses / credentials).
5 UNIX domain socket transport:
7 Server:
8 $ ./gdbus-example-peer --server --address unix:abstract=myaddr
9 Server is listening at: unix:abstract=myaddr
10 Client connected.
11 Peer credentials: GCredentials:unix-user=500,unix-group=500,unix-process=13378
12 Negotiated capabilities: unix-fd-passing=1
13 Client said: Hey, it's 1273093080 already!
15 Client:
16 $ ./gdbus-example-peer --address unix:abstract=myaddr
17 Connected.
18 Negotiated capabilities: unix-fd-passing=1
19 Server said: You said 'Hey, it's 1273093080 already!'. KTHXBYE!
21 Nonce-secured TCP transport on the same host:
23 Server:
24 $ ./gdbus-example-peer --server --address nonce-tcp:
25 Server is listening at: nonce-tcp:host=localhost,port=43077,noncefile=/tmp/gdbus-nonce-file-X1ZNCV
26 Client connected.
27 Peer credentials: (no credentials received)
28 Negotiated capabilities: unix-fd-passing=0
29 Client said: Hey, it's 1273093206 already!
31 Client:
32 $ ./gdbus-example-peer -address nonce-tcp:host=localhost,port=43077,noncefile=/tmp/gdbus-nonce-file-X1ZNCV
33 Connected.
34 Negotiated capabilities: unix-fd-passing=0
35 Server said: You said 'Hey, it's 1273093206 already!'. KTHXBYE!
37 TCP transport on two different hosts with a shared home directory:
39 Server:
40 host1 $ ./gdbus-example-peer --server --address tcp:host=0.0.0.0
41 Server is listening at: tcp:host=0.0.0.0,port=46314
42 Client connected.
43 Peer credentials: (no credentials received)
44 Negotiated capabilities: unix-fd-passing=0
45 Client said: Hey, it's 1273093337 already!
47 Client:
48 host2 $ ./gdbus-example-peer -a tcp:host=host1,port=46314
49 Connected.
50 Negotiated capabilities: unix-fd-passing=0
51 Server said: You said 'Hey, it's 1273093337 already!'. KTHXBYE!
53 TCP transport on two different hosts without authentication:
55 Server:
56 host1 $ ./gdbus-example-peer --server --address tcp:host=0.0.0.0 --allow-anonymous
57 Server is listening at: tcp:host=0.0.0.0,port=59556
58 Client connected.
59 Peer credentials: (no credentials received)
60 Negotiated capabilities: unix-fd-passing=0
61 Client said: Hey, it's 1273093652 already!
63 Client:
64 host2 $ ./gdbus-example-peer -a tcp:host=host1,port=59556
65 Connected.
66 Negotiated capabilities: unix-fd-passing=0
67 Server said: You said 'Hey, it's 1273093652 already!'. KTHXBYE!
71 #include <gio/gio.h>
72 #include <stdlib.h>
74 /* ---------------------------------------------------------------------------------------------------- */
76 static GDBusNodeInfo *introspection_data = NULL;
78 /* Introspection data for the service we are exporting */
79 static const gchar introspection_xml[] =
80 "<node>"
81 " <interface name='org.gtk.GDBus.TestPeerInterface'>"
82 " <method name='HelloWorld'>"
83 " <arg type='s' name='greeting' direction='in'/>"
84 " <arg type='s' name='response' direction='out'/>"
85 " </method>"
86 " </interface>"
87 "</node>";
89 /* ---------------------------------------------------------------------------------------------------- */
91 static void
92 handle_method_call (GDBusConnection *connection,
93 const gchar *sender,
94 const gchar *object_path,
95 const gchar *interface_name,
96 const gchar *method_name,
97 GVariant *parameters,
98 GDBusMethodInvocation *invocation,
99 gpointer user_data)
101 if (g_strcmp0 (method_name, "HelloWorld") == 0)
103 const gchar *greeting;
104 gchar *response;
106 g_variant_get (parameters, "(&s)", &greeting);
107 response = g_strdup_printf ("You said '%s'. KTHXBYE!", greeting);
108 g_dbus_method_invocation_return_value (invocation,
109 g_variant_new ("(s)", response));
110 g_free (response);
111 g_print ("Client said: %s\n", greeting);
115 static const GDBusInterfaceVTable interface_vtable =
117 handle_method_call,
118 NULL,
119 NULL,
122 /* ---------------------------------------------------------------------------------------------------- */
124 static gboolean
125 on_new_connection (GDBusServer *server,
126 GDBusConnection *connection,
127 gpointer user_data)
129 guint registration_id;
130 GCredentials *credentials;
131 gchar *s;
133 credentials = g_dbus_connection_get_peer_credentials (connection);
134 if (credentials == NULL)
135 s = g_strdup ("(no credentials received)");
136 else
137 s = g_credentials_to_string (credentials);
140 g_print ("Client connected.\n"
141 "Peer credentials: %s\n"
142 "Negotiated capabilities: unix-fd-passing=%d\n",
144 g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING);
146 g_object_ref (connection);
147 registration_id = g_dbus_connection_register_object (connection,
148 "/org/gtk/GDBus/TestObject",
149 introspection_data->interfaces[0],
150 &interface_vtable,
151 NULL, /* user_data */
152 NULL, /* user_data_free_func */
153 NULL); /* GError** */
154 g_assert (registration_id > 0);
156 return TRUE;
159 /* ---------------------------------------------------------------------------------------------------- */
162 main (int argc, char *argv[])
164 gint ret;
165 gboolean opt_server;
166 gchar *opt_address;
167 GOptionContext *opt_context;
168 gboolean opt_allow_anonymous;
169 GError *error;
170 GOptionEntry opt_entries[] =
172 { "server", 's', 0, G_OPTION_ARG_NONE, &opt_server, "Start a server instead of a client", NULL },
173 { "address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, "D-Bus address to use", NULL },
174 { "allow-anonymous", 'n', 0, G_OPTION_ARG_NONE, &opt_allow_anonymous, "Allow anonymous authentication", NULL },
175 { NULL}
178 ret = 1;
180 opt_address = NULL;
181 opt_server = FALSE;
182 opt_allow_anonymous = FALSE;
184 opt_context = g_option_context_new ("peer-to-peer example");
185 error = NULL;
186 g_option_context_add_main_entries (opt_context, opt_entries, NULL);
187 if (!g_option_context_parse (opt_context, &argc, &argv, &error))
189 g_printerr ("Error parsing options: %s\n", error->message);
190 g_error_free (error);
191 goto out;
193 if (opt_address == NULL)
195 g_printerr ("Incorrect usage, try --help.\n");
196 goto out;
198 if (!opt_server && opt_allow_anonymous)
200 g_printerr ("The --allow-anonymous option only makes sense when used with --server.\n");
201 goto out;
204 /* We are lazy here - we don't want to manually provide
205 * the introspection data structures - so we just build
206 * them from XML.
208 introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
209 g_assert (introspection_data != NULL);
211 if (opt_server)
213 GDBusServer *server;
214 gchar *guid;
215 GMainLoop *loop;
216 GDBusServerFlags server_flags;
218 guid = g_dbus_generate_guid ();
220 server_flags = G_DBUS_SERVER_FLAGS_NONE;
221 if (opt_allow_anonymous)
222 server_flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS;
224 error = NULL;
225 server = g_dbus_server_new_sync (opt_address,
226 server_flags,
227 guid,
228 NULL, /* GDBusAuthObserver */
229 NULL, /* GCancellable */
230 &error);
231 g_dbus_server_start (server);
232 g_free (guid);
234 if (server == NULL)
236 g_printerr ("Error creating server at address %s: %s\n", opt_address, error->message);
237 g_error_free (error);
238 goto out;
240 g_print ("Server is listening at: %s\n", g_dbus_server_get_client_address (server));
241 g_signal_connect (server,
242 "new-connection",
243 G_CALLBACK (on_new_connection),
244 NULL);
246 loop = g_main_loop_new (NULL, FALSE);
247 g_main_loop_run (loop);
249 g_object_unref (server);
250 g_main_loop_unref (loop);
252 else
254 GDBusConnection *connection;
255 const gchar *greeting_response;
256 GVariant *value;
257 gchar *greeting;
259 error = NULL;
260 connection = g_dbus_connection_new_for_address_sync (opt_address,
261 G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
262 NULL, /* GDBusAuthObserver */
263 NULL, /* GCancellable */
264 &error);
265 if (connection == NULL)
267 g_printerr ("Error connecting to D-Bus address %s: %s\n", opt_address, error->message);
268 g_error_free (error);
269 goto out;
272 g_print ("Connected.\n"
273 "Negotiated capabilities: unix-fd-passing=%d\n",
274 g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING);
276 greeting = g_strdup_printf ("Hey, it's %" G_GUINT64_FORMAT " already!", (guint64) time (NULL));
277 value = g_dbus_connection_call_sync (connection,
278 NULL, /* bus_name */
279 "/org/gtk/GDBus/TestObject",
280 "org.gtk.GDBus.TestPeerInterface",
281 "HelloWorld",
282 g_variant_new ("(s)", greeting),
283 G_VARIANT_TYPE ("(s)"),
284 G_DBUS_CALL_FLAGS_NONE,
286 NULL,
287 &error);
288 if (value == NULL)
290 g_printerr ("Error invoking HelloWorld(): %s\n", error->message);
291 g_error_free (error);
292 goto out;
294 g_variant_get (value, "(&s)", &greeting_response);
295 g_print ("Server said: %s\n", greeting_response);
296 g_variant_unref (value);
298 g_object_unref (connection);
300 g_dbus_node_info_unref (introspection_data);
302 ret = 0;
304 out:
305 return ret;