diff --git a/server/src/core/linux/start.c b/server/src/core/linux/start.c index d9d9e70..93f50db 100644 --- a/server/src/core/linux/start.c +++ b/server/src/core/linux/start.c @@ -113,10 +113,7 @@ static gboolean } -void ipc3270_export_object(GObject *object, const char *name, GError **error) { - - char id; - gchar *ptr; +static gboolean register_object(ipc3270 *ipc, const char *name, char id) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" @@ -127,92 +124,133 @@ void ipc3270_export_object(GObject *object, const char *name, GError **error) { }; #pragma GCC diagnostic pop - ipc3270 * ipc = IPC3270(object); + GError * error = NULL; + gchar *ptr; - ipc->dbus.connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, error); - if(*error) { - g_message("Can't get session bus: %s",(*error)->message); - return; - } + g_autofree gchar *object_name = g_strdup_printf(PW3270_IPC_SESSION_BUS_NAME,name,id); - g_dbus_connection_set_exit_on_close(ipc->dbus.connection,FALSE); + for(ptr=object_name;*ptr;ptr++) + *ptr = g_ascii_tolower(*ptr); - for(id='a'; id < 'z' && !ipc->dbus.id && !*error; id++) { + debug("Requesting \"%s\"",object_name); - g_autofree gchar *object_name = g_strdup_printf(PW3270_IPC_SESSION_BUS_NAME,name,id); + // https://dbus.freedesktop.org/doc/dbus-specification.html + GVariant * response = + g_dbus_connection_call_sync ( + ipc->dbus.connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "RequestName", + g_variant_new ("(su)", object_name, DBUS_NAME_FLAG_DO_NOT_QUEUE), + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error + ); - for(ptr=object_name;*ptr;ptr++) - *ptr = g_ascii_tolower(*ptr); - debug("Requesting \"%s\"",object_name); + if(error) { - // https://dbus.freedesktop.org/doc/dbus-specification.html - GError *err = NULL; + g_message("Can't request \"%s\": %s",object_name,error->message); + g_error_free(error); + return FALSE; - GVariant * response = - g_dbus_connection_call_sync ( - ipc->dbus.connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS, - "RequestName", - g_variant_new ("(su)", object_name, DBUS_NAME_FLAG_DO_NOT_QUEUE), - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &err - ); + } - if(err) { + if(!response) { - g_message("Can't request \"%s\": %s",object_name,err->message); - g_error_free(err); - err = NULL; + g_message("Empty response when requesting \"%s\"",object_name); + return FALSE; - } else if(response) { + } - guint32 reply = 0; - g_variant_get(response, "(u)", &reply); - g_variant_unref(response); + guint32 reply = 0; + g_variant_get(response, "(u)", &reply); + g_variant_unref(response); - if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - ipc->dbus.name = g_strdup(object_name); - g_message("Got %s", ipc->dbus.name); + ipc->dbus.name = g_strdup(object_name); + lib3270_set_session_id(ipc->hSession, id); + g_message("Got %s", ipc->dbus.name); - lib3270_set_session_id(ipc->hSession, id); + // Introspection data for the service we are exporting + GString * introspection = g_string_new(""); + ipc3270_add_terminal_introspection(introspection); + g_string_append(introspection,""); - // Introspection data for the service we are exporting - GString * introspection = g_string_new(""); - ipc3270_add_terminal_introspection(introspection); - g_string_append(introspection,""); + gchar * introspection_xml = g_string_free(introspection,FALSE); - gchar * introspection_xml = g_string_free(introspection,FALSE); + // debug("\n%s\n",introspection_xml); - // debug("\n%s\n",introspection_xml); + GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); - GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + // Register object-id + ipc->dbus.id = g_dbus_connection_register_object ( + ipc->dbus.connection, + PW3270_IPC_SESSION_OBJECT_PATH, + introspection_data->interfaces[0], + &interface_vtable, + ipc, + NULL, + &error + ); - // Register object-id - ipc->dbus.id = g_dbus_connection_register_object ( - ipc->dbus.connection, - PW3270_IPC_SESSION_OBJECT_PATH, - introspection_data->interfaces[0], - &interface_vtable, - ipc, - NULL, - error - ); + g_dbus_node_info_unref(introspection_data); + g_free(introspection_xml); - g_dbus_node_info_unref(introspection_data); - g_free(introspection_xml); + if(error) { - return; - } + g_message("Can't register object \"%s\": %s",object_name,error->message); + g_error_free(error); + return FALSE; } + return TRUE; + } + return FALSE; +} + +void ipc3270_export_object(GObject *object, const char *name, GError **error) { + + ipc3270 * ipc = IPC3270(object); + + ipc->dbus.connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, error); + if(*error) { + g_message("Can't get session bus: %s",(*error)->message); + return; + } + + g_autofree gchar *basename = g_strdup(name); + { + gchar *ptr = strrchr(basename,':'); + if(ptr) + *ptr = 0; + } + + g_dbus_connection_set_exit_on_close(ipc->dbus.connection,FALSE); + + char id = lib3270_get_session_id(ipc->hSession); + + if(id) { + + if(register_object(ipc,basename,id)) + return; + + } + + for(id='a'; id < 'z' && !ipc->dbus.id && !*error; id++) { + + if(register_object(ipc,basename,id)) + return; + + } + + g_message("Can't register IPC object for session \"%s\"",basename); + } -- libgit2 0.21.2