static void g_socket_service_finalize (GObject *object) { GSocketService *service = G_SOCKET_SERVICE (object); g_object_unref (service->priv->cancellable); G_OBJECT_CLASS (g_socket_service_parent_class) ->finalize (object); }
/** * g_dbus_server_start: * @server: A #GDBusServer. * * Starts @server. * * Since: 2.26 */ void g_dbus_server_start (GDBusServer *server) { g_return_if_fail (G_IS_DBUS_SERVER (server)); if (server->active) return; /* Right now we don't have any transport not using the listener... */ g_assert (server->is_using_listener); g_socket_service_start (G_SOCKET_SERVICE (server->listener)); server->active = TRUE; g_object_notify (G_OBJECT (server), "active"); }
static gpointer sessions_cleaner_func(xr_server* server) { while (g_socket_service_is_active(G_SOCKET_SERVICE(server->service))) { server->current_time = time(NULL); g_static_rw_lock_writer_lock(&server->sessions_lock); g_hash_table_foreach_remove(server->sessions, _maybe_remove_servlet, server); g_static_rw_lock_writer_unlock(&server->sessions_lock); g_usleep(1000000); } return NULL; }
static gboolean initable_init (GInitable *initable, GCancellable *cancellable, GError **error) { g_debug (G_STRLOC ": %s", G_STRFUNC); DasomServer *server = DASOM_SERVER (initable); GSocketAddress *address; GError *local_error = NULL; server->listener = G_SOCKET_LISTENER (g_socket_service_new ()); /* server->listener = G_SOCKET_LISTENER (g_threaded_socket_service_new (-1)); */ if (g_unix_socket_address_abstract_names_supported ()) address = g_unix_socket_address_new_with_type (server->address, -1, G_UNIX_SOCKET_ADDRESS_ABSTRACT); else { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Abstract UNIX domain socket names are not supported."); return FALSE; } g_socket_listener_add_address (server->listener, address, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, NULL, NULL, &local_error); g_object_unref (address); if (local_error) { g_propagate_error (error, local_error); return FALSE; } server->is_using_listener = TRUE; server->run_signal_handler_id = g_signal_connect (G_SOCKET_SERVICE (server->listener), "incoming", (GCallback) on_new_connection, server); /* server->run_signal_handler_id = g_signal_connect (G_SOCKET_SERVICE (server->listener), "run", G_CALLBACK (on_run), server); */ return TRUE; }
/** * g_dbus_server_stop: * @server: A #GDBusServer. * * Stops @server. * * Since: 2.26 */ void g_dbus_server_stop (GDBusServer *server) { g_return_if_fail (G_IS_DBUS_SERVER (server)); if (!server->active) return; /* Right now we don't have any transport not using the listener... */ g_assert (server->is_using_listener); g_assert (server->run_signal_handler_id > 0); g_signal_handler_disconnect (server->listener, server->run_signal_handler_id); server->run_signal_handler_id = 0; g_socket_service_stop (G_SOCKET_SERVICE (server->listener)); server->active = FALSE; g_object_notify (G_OBJECT (server), "active"); }
int main (int argc, char *argv[]) { GMainLoop *main_loop = NULL; HevSocks5Service *service = NULL; main_loop = g_main_loop_new (NULL, FALSE); service = hev_socks5_service_new (20); GInetAddress *iaddr = g_inet_address_new_from_string ("127.0.0.1"); GSocketAddress *saddr = g_inet_socket_address_new (iaddr, 1082); if (g_socket_listener_add_address (G_SOCKET_LISTENER (service), saddr, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, NULL, NULL, NULL)) { g_socket_service_start (G_SOCKET_SERVICE (service)); g_main_loop_run (main_loop); g_socket_service_stop (G_SOCKET_SERVICE (service)); } g_object_unref (service); g_main_loop_unref (main_loop); return 0; }
gboolean xr_server_run(xr_server* server, GError** err) { GError* local_err = NULL; xr_trace(XR_DEBUG_SERVER_TRACE, "(server=%p, err=%p)", server, err); g_return_val_if_fail(server != NULL, FALSE); g_return_val_if_fail(err == NULL || *err == NULL, FALSE); g_socket_service_start(G_SOCKET_SERVICE(server->service)); server->loop = g_main_loop_new(NULL, TRUE); g_main_loop_run(server->loop); return TRUE; }
static void g_socket_service_changed (GSocketListener *listener) { GSocketService *service = G_SOCKET_SERVICE (listener); G_LOCK (active); if (service->priv->active) { if (service->priv->outstanding_accept) g_cancellable_cancel (service->priv->cancellable); else do_accept (service); } G_UNLOCK (active); }
static void g_socket_service_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GSocketService *service = G_SOCKET_SERVICE (object); switch (prop_id) { case PROP_ACTIVE: set_active (service, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
void dasom_server_stop (DasomServer *server) { g_debug (G_STRLOC ": %s", G_STRFUNC); g_return_if_fail (DASOM_IS_SERVER (server)); if (!server->active) return; g_assert (server->is_using_listener); g_assert (server->run_signal_handler_id > 0); g_signal_handler_disconnect (server->listener, server->run_signal_handler_id); server->run_signal_handler_id = 0; g_socket_service_stop (G_SOCKET_SERVICE (server->listener)); server->active = FALSE; }
static void g_socket_service_changed (GSocketListener *listener) { GSocketService *service = G_SOCKET_SERVICE (listener); G_LOCK (active); if (service->priv->active) { if (service->priv->outstanding_accept) g_cancellable_cancel (service->priv->cancellable); else { g_socket_listener_accept_async (listener, service->priv->cancellable, g_socket_service_ready, NULL); service->priv->outstanding_accept = TRUE; } } G_UNLOCK (active); }
static void g_threaded_socket_service_func (gpointer _data, gpointer user_data) { GThreadedSocketService *threaded = user_data; GThreadedSocketServiceData *data = _data; gboolean result; g_signal_emit (data->service, g_threaded_socket_service_run_signal, 0, data->connection, data->source_object, &result); g_object_unref (data->service); g_object_unref (data->connection); if (data->source_object) g_object_unref (data->source_object); g_slice_free (GThreadedSocketServiceData, data); G_LOCK (job_count); if (threaded->priv->job_count-- == threaded->priv->max_threads) g_socket_service_start (G_SOCKET_SERVICE (threaded)); G_UNLOCK (job_count); }
static gboolean initable_init (GInitable *initable, GCancellable *cancellable, GError **error) { GDBusServer *server = G_DBUS_SERVER (initable); gboolean ret; guint n; gchar **addr_array; GError *last_error; ret = FALSE; addr_array = NULL; last_error = NULL; if (!g_dbus_is_guid (server->guid)) { g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("The string '%s' is not a valid D-Bus GUID"), server->guid); goto out; } server->listener = G_SOCKET_LISTENER (g_threaded_socket_service_new (-1)); addr_array = g_strsplit (server->address, ";", 0); last_error = NULL; for (n = 0; addr_array != NULL && addr_array[n] != NULL; n++) { const gchar *address_entry = addr_array[n]; GHashTable *key_value_pairs; gchar *transport_name; GError *this_error; this_error = NULL; if (g_dbus_is_supported_address (address_entry, &this_error) && _g_dbus_address_parse_entry (address_entry, &transport_name, &key_value_pairs, &this_error)) { if (FALSE) { } #ifdef G_OS_UNIX else if (g_strcmp0 (transport_name, "unix") == 0) ret = try_unix (server, address_entry, key_value_pairs, &this_error); #endif else if (g_strcmp0 (transport_name, "tcp") == 0) ret = try_tcp (server, address_entry, key_value_pairs, FALSE, &this_error); else if (g_strcmp0 (transport_name, "nonce-tcp") == 0) ret = try_tcp (server, address_entry, key_value_pairs, TRUE, &this_error); else g_set_error (&this_error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("Cannot listen on unsupported transport '%s'"), transport_name); g_free (transport_name); if (key_value_pairs != NULL) g_hash_table_unref (key_value_pairs); if (ret) { g_assert (this_error == NULL); goto out; } } if (this_error != NULL) { if (last_error != NULL) g_error_free (last_error); last_error = this_error; } } out: g_strfreev (addr_array); if (ret) { if (last_error != NULL) g_error_free (last_error); /* Right now we don't have any transport not using the listener... */ g_assert (server->is_using_listener); server->run_signal_handler_id = g_signal_connect (G_SOCKET_SERVICE (server->listener), "run", G_CALLBACK (on_run), server); } else { g_assert (last_error != NULL); g_propagate_error (error, last_error); } return ret; }
int main (int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; GMainLoop *loop; GSocketAddress *address; GSocketService *listener; char *path, *base; char *http_address = NULL; int http_port = 0; int display = 1; const GOptionEntry entries[] = { { "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" }, { "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" }, { NULL } }; context = g_option_context_new ("[:DISPLAY] - broadway display daemon"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_printerr ("option parsing failed: %s\n", error->message); exit (1); } if (argc > 1) { if (*argv[1] != ':') { g_printerr ("Usage broadwayd [:DISPLAY]\n"); exit (1); } display = strtol(argv[1]+1, NULL, 10); if (display == 0) { g_printerr ("Failed to parse display num %s\n", argv[1]); exit (1); } } if (http_port == 0) http_port = 8080 + (display - 1); server = broadway_server_new (http_address, http_port, &error); if (server == NULL) { g_printerr ("%s\n", error->message); return 1; } base = g_strdup_printf ("broadway%d.socket", display); path = g_build_filename (g_get_user_runtime_dir (), base, NULL); g_free (base); g_print ("Listening on %s\n", path); address = g_unix_socket_address_new_with_type (path, -1, G_UNIX_SOCKET_ADDRESS_ABSTRACT); g_free (path); listener = g_socket_service_new (); if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener), address, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, G_OBJECT (server), NULL, &error)) { g_printerr ("Can't listen: %s\n", error->message); return 1; } g_object_unref (address); g_signal_connect (listener, "incoming", G_CALLBACK (incoming_client), NULL); g_socket_service_start (G_SOCKET_SERVICE (listener)); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); return 0; }
int main (int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; GMainLoop *loop; GInetAddress *inet; GSocketAddress *address; GSocketService *listener; char *path, *basename; char *http_address = NULL; char *unixsocket_address = NULL; int http_port = 0; char *ssl_cert = NULL; char *ssl_key = NULL; char *display; int port = 0; const GOptionEntry entries[] = { { "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" }, { "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" }, #ifdef G_OS_UNIX { "unixsocket", 'u', 0, G_OPTION_ARG_STRING, &unixsocket_address, "Unix domain socket address", "ADDRESS" }, #endif { "cert", 'c', 0, G_OPTION_ARG_STRING, &ssl_cert, "SSL certificate path", "PATH" }, { "key", 'k', 0, G_OPTION_ARG_STRING, &ssl_key, "SSL key path", "PATH" }, { NULL } }; setlocale (LC_ALL, ""); context = g_option_context_new ("[:DISPLAY] - broadway display daemon"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_printerr ("option parsing failed: %s\n", error->message); exit (1); } display = NULL; if (argc > 1) { if (*argv[1] != ':') { g_printerr ("Usage broadwayd [:DISPLAY]\n"); exit (1); } display = argv[1]; } if (display == NULL) { #ifdef G_OS_UNIX if (g_unix_socket_address_abstract_names_supported ()) display = ":0"; else #endif display = ":tcp"; } if (g_str_has_prefix (display, ":tcp")) { port = strtol (display + strlen (":tcp"), NULL, 10); inet = g_inet_address_new_from_string ("127.0.0.1"); g_print ("Listening on 127.0.0.1:%d\n", port + 9090); address = g_inet_socket_address_new (inet, port + 9090); g_object_unref (inet); } #ifdef G_OS_UNIX else if (display[0] == ':' && g_ascii_isdigit(display[1])) { port = strtol (display + strlen (":"), NULL, 10); basename = g_strdup_printf ("broadway%d.socket", port + 1); path = g_build_filename (g_get_user_runtime_dir (), basename, NULL); g_free (basename); g_print ("Listening on %s\n", path); address = g_unix_socket_address_new_with_type (path, -1, G_UNIX_SOCKET_ADDRESS_ABSTRACT); g_free (path); } #endif else { g_printerr ("Failed to parse display %s\n", display); exit (1); } if (http_port == 0) http_port = 8080 + port; if (unixsocket_address != NULL) server = broadway_server_on_unix_socket_new (unixsocket_address, &error); else server = broadway_server_new (http_address, http_port, ssl_cert, ssl_key, &error); if (server == NULL) { g_printerr ("%s\n", error->message); return 1; } listener = g_socket_service_new (); if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener), address, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, G_OBJECT (server), NULL, &error)) { g_printerr ("Can't listen: %s\n", error->message); return 1; } g_object_unref (address); g_signal_connect (listener, "incoming", G_CALLBACK (incoming_client), NULL); g_socket_service_start (G_SOCKET_SERVICE (listener)); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); return 0; }
void xr_server_stop(xr_server* server) { xr_trace(XR_DEBUG_SERVER_TRACE, "(server=%p)", server); g_return_if_fail(server != NULL); g_socket_service_stop(G_SOCKET_SERVICE(server->service)); g_main_loop_quit(server->loop); }