void _odccm_connection_broker_take_connection (OdccmConnectionBroker *self, GConn *conn) { OdccmConnectionBrokerPrivate *priv = ODCCM_CONNECTION_BROKER_GET_PRIVATE (self); GRand *rnd; GIOChannel *chan; guint uid; g_assert (priv->conn == NULL); priv->conn = conn; rnd = g_rand_new (); priv->filename = g_strdup_printf ("/tmp/odccm-%08x%08x%08x%08x.sock", g_rand_int (rnd), g_rand_int (rnd), g_rand_int (rnd), g_rand_int (rnd)); g_rand_free (rnd); priv->server = gnet_unix_socket_server_new (priv->filename); _odccm_get_dbus_sender_uid (dbus_g_method_get_sender (priv->ctx), &uid); chmod (priv->filename, S_IRUSR | S_IWUSR); chown (priv->filename, uid, -1); chan = gnet_unix_socket_get_io_channel (priv->server); g_io_add_watch (chan, G_IO_IN, server_socket_readable_cb, self); dbus_g_method_return (priv->ctx, priv->filename); priv->ctx = NULL; }
static void normal_echoserver(gchar *path, gboolean abstract) { GUnixSocket *client = NULL; gchar buffer[1024]; gsize n; GIOChannel *ioclient = NULL; GIOError e; g_assert(path != NULL); /* Create the server */ if (abstract) server = gnet_unix_socket_server_new_abstract(path); else server = gnet_unix_socket_server_new(path); g_assert(server != NULL); while ((client = gnet_unix_socket_server_accept(server)) != NULL) { ioclient = gnet_unix_socket_get_io_channel(client); g_assert(ioclient != NULL); while ((e = gnet_io_channel_readline(ioclient, buffer, sizeof(buffer), &n)) == G_IO_ERROR_NONE && (n > 0)) { e = gnet_io_channel_writen(ioclient, buffer, n, &n); if (e != G_IO_ERROR_NONE) break; if (fwrite(buffer, n, 1, stdout) != 1) { fprintf (stderr, "Error: fwrite to stdout failed: %s\n", g_strerror (errno)); } } if (e != G_IO_ERROR_NONE) fprintf(stderr, "\nRecieved error %d (closing socket).\n", e); gnet_unix_socket_delete (client); } }
static void async_echoserver(gchar *path, gboolean abstract) { GIOChannel *iochannel = NULL; GMainLoop *main_loop = NULL; g_assert(path != NULL); if (abstract) server = gnet_unix_socket_server_new_abstract(path); else server = gnet_unix_socket_server_new(path); g_assert(server != NULL); main_loop = g_main_new(FALSE); /* Add a watch for incoming clients */ iochannel = gnet_unix_socket_get_io_channel(server); g_io_add_watch(iochannel, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL, async_server_iofunc, server); /* Start the main loop */ g_main_run(main_loop); }