Commit 12679f3871c941183b0979d6ca2ec53e6309fe12
1 parent
377115b6
Exists in
master
and in
1 other branch
If the session as an id try it first.
Showing
1 changed file
with
103 additions
and
65 deletions
Show diff stats
server/src/core/linux/start.c
| ... | ... | @@ -113,10 +113,7 @@ static gboolean |
| 113 | 113 | |
| 114 | 114 | } |
| 115 | 115 | |
| 116 | -void ipc3270_export_object(GObject *object, const char *name, GError **error) { | |
| 117 | - | |
| 118 | - char id; | |
| 119 | - gchar *ptr; | |
| 116 | +static gboolean register_object(ipc3270 *ipc, const char *name, char id) { | |
| 120 | 117 | |
| 121 | 118 | #pragma GCC diagnostic push |
| 122 | 119 | #pragma GCC diagnostic ignored "-Wmissing-field-initializers" |
| ... | ... | @@ -127,92 +124,133 @@ void ipc3270_export_object(GObject *object, const char *name, GError **error) { |
| 127 | 124 | }; |
| 128 | 125 | #pragma GCC diagnostic pop |
| 129 | 126 | |
| 130 | - ipc3270 * ipc = IPC3270(object); | |
| 127 | + GError * error = NULL; | |
| 128 | + gchar *ptr; | |
| 131 | 129 | |
| 132 | - ipc->dbus.connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, error); | |
| 133 | - if(*error) { | |
| 134 | - g_message("Can't get session bus: %s",(*error)->message); | |
| 135 | - return; | |
| 136 | - } | |
| 130 | + g_autofree gchar *object_name = g_strdup_printf(PW3270_IPC_SESSION_BUS_NAME,name,id); | |
| 137 | 131 | |
| 138 | - g_dbus_connection_set_exit_on_close(ipc->dbus.connection,FALSE); | |
| 132 | + for(ptr=object_name;*ptr;ptr++) | |
| 133 | + *ptr = g_ascii_tolower(*ptr); | |
| 139 | 134 | |
| 140 | - for(id='a'; id < 'z' && !ipc->dbus.id && !*error; id++) { | |
| 135 | + debug("Requesting \"%s\"",object_name); | |
| 141 | 136 | |
| 142 | - g_autofree gchar *object_name = g_strdup_printf(PW3270_IPC_SESSION_BUS_NAME,name,id); | |
| 137 | + // https://dbus.freedesktop.org/doc/dbus-specification.html | |
| 138 | + GVariant * response = | |
| 139 | + g_dbus_connection_call_sync ( | |
| 140 | + ipc->dbus.connection, | |
| 141 | + DBUS_SERVICE_DBUS, | |
| 142 | + DBUS_PATH_DBUS, | |
| 143 | + DBUS_INTERFACE_DBUS, | |
| 144 | + "RequestName", | |
| 145 | + g_variant_new ("(su)", object_name, DBUS_NAME_FLAG_DO_NOT_QUEUE), | |
| 146 | + NULL, | |
| 147 | + G_DBUS_CALL_FLAGS_NONE, | |
| 148 | + -1, | |
| 149 | + NULL, | |
| 150 | + &error | |
| 151 | + ); | |
| 143 | 152 | |
| 144 | - for(ptr=object_name;*ptr;ptr++) | |
| 145 | - *ptr = g_ascii_tolower(*ptr); | |
| 146 | 153 | |
| 147 | - debug("Requesting \"%s\"",object_name); | |
| 154 | + if(error) { | |
| 148 | 155 | |
| 149 | - // https://dbus.freedesktop.org/doc/dbus-specification.html | |
| 150 | - GError *err = NULL; | |
| 156 | + g_message("Can't request \"%s\": %s",object_name,error->message); | |
| 157 | + g_error_free(error); | |
| 158 | + return FALSE; | |
| 151 | 159 | |
| 152 | - GVariant * response = | |
| 153 | - g_dbus_connection_call_sync ( | |
| 154 | - ipc->dbus.connection, | |
| 155 | - DBUS_SERVICE_DBUS, | |
| 156 | - DBUS_PATH_DBUS, | |
| 157 | - DBUS_INTERFACE_DBUS, | |
| 158 | - "RequestName", | |
| 159 | - g_variant_new ("(su)", object_name, DBUS_NAME_FLAG_DO_NOT_QUEUE), | |
| 160 | - NULL, | |
| 161 | - G_DBUS_CALL_FLAGS_NONE, | |
| 162 | - -1, | |
| 163 | - NULL, | |
| 164 | - &err | |
| 165 | - ); | |
| 160 | + } | |
| 166 | 161 | |
| 167 | - if(err) { | |
| 162 | + if(!response) { | |
| 168 | 163 | |
| 169 | - g_message("Can't request \"%s\": %s",object_name,err->message); | |
| 170 | - g_error_free(err); | |
| 171 | - err = NULL; | |
| 164 | + g_message("Empty response when requesting \"%s\"",object_name); | |
| 165 | + return FALSE; | |
| 172 | 166 | |
| 173 | - } else if(response) { | |
| 167 | + } | |
| 174 | 168 | |
| 175 | - guint32 reply = 0; | |
| 176 | - g_variant_get(response, "(u)", &reply); | |
| 177 | - g_variant_unref(response); | |
| 169 | + guint32 reply = 0; | |
| 170 | + g_variant_get(response, "(u)", &reply); | |
| 171 | + g_variant_unref(response); | |
| 178 | 172 | |
| 179 | - if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { | |
| 173 | + if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { | |
| 180 | 174 | |
| 181 | - ipc->dbus.name = g_strdup(object_name); | |
| 182 | - g_message("Got %s", ipc->dbus.name); | |
| 175 | + ipc->dbus.name = g_strdup(object_name); | |
| 176 | + lib3270_set_session_id(ipc->hSession, id); | |
| 177 | + g_message("Got %s", ipc->dbus.name); | |
| 183 | 178 | |
| 184 | - lib3270_set_session_id(ipc->hSession, id); | |
| 179 | + // Introspection data for the service we are exporting | |
| 180 | + GString * introspection = g_string_new("<node><interface name='" PW3270_IPC_SESSION_INTERFACE_NAME "'>"); | |
| 181 | + ipc3270_add_terminal_introspection(introspection); | |
| 182 | + g_string_append(introspection,"</interface></node>"); | |
| 185 | 183 | |
| 186 | - // Introspection data for the service we are exporting | |
| 187 | - GString * introspection = g_string_new("<node><interface name='" PW3270_IPC_SESSION_INTERFACE_NAME "'>"); | |
| 188 | - ipc3270_add_terminal_introspection(introspection); | |
| 189 | - g_string_append(introspection,"</interface></node>"); | |
| 184 | + gchar * introspection_xml = g_string_free(introspection,FALSE); | |
| 190 | 185 | |
| 191 | - gchar * introspection_xml = g_string_free(introspection,FALSE); | |
| 186 | + // debug("\n%s\n",introspection_xml); | |
| 192 | 187 | |
| 193 | - // debug("\n%s\n",introspection_xml); | |
| 188 | + GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); | |
| 194 | 189 | |
| 195 | - GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); | |
| 190 | + // Register object-id | |
| 191 | + ipc->dbus.id = g_dbus_connection_register_object ( | |
| 192 | + ipc->dbus.connection, | |
| 193 | + PW3270_IPC_SESSION_OBJECT_PATH, | |
| 194 | + introspection_data->interfaces[0], | |
| 195 | + &interface_vtable, | |
| 196 | + ipc, | |
| 197 | + NULL, | |
| 198 | + &error | |
| 199 | + ); | |
| 196 | 200 | |
| 197 | - // Register object-id | |
| 198 | - ipc->dbus.id = g_dbus_connection_register_object ( | |
| 199 | - ipc->dbus.connection, | |
| 200 | - PW3270_IPC_SESSION_OBJECT_PATH, | |
| 201 | - introspection_data->interfaces[0], | |
| 202 | - &interface_vtable, | |
| 203 | - ipc, | |
| 204 | - NULL, | |
| 205 | - error | |
| 206 | - ); | |
| 201 | + g_dbus_node_info_unref(introspection_data); | |
| 202 | + g_free(introspection_xml); | |
| 207 | 203 | |
| 208 | - g_dbus_node_info_unref(introspection_data); | |
| 209 | - g_free(introspection_xml); | |
| 204 | + if(error) { | |
| 210 | 205 | |
| 211 | - return; | |
| 212 | - } | |
| 206 | + g_message("Can't register object \"%s\": %s",object_name,error->message); | |
| 207 | + g_error_free(error); | |
| 208 | + return FALSE; | |
| 213 | 209 | |
| 214 | 210 | } |
| 215 | 211 | |
| 212 | + return TRUE; | |
| 213 | + | |
| 216 | 214 | } |
| 217 | 215 | |
| 216 | + return FALSE; | |
| 217 | +} | |
| 218 | + | |
| 219 | +void ipc3270_export_object(GObject *object, const char *name, GError **error) { | |
| 220 | + | |
| 221 | + ipc3270 * ipc = IPC3270(object); | |
| 222 | + | |
| 223 | + ipc->dbus.connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, error); | |
| 224 | + if(*error) { | |
| 225 | + g_message("Can't get session bus: %s",(*error)->message); | |
| 226 | + return; | |
| 227 | + } | |
| 228 | + | |
| 229 | + g_autofree gchar *basename = g_strdup(name); | |
| 230 | + { | |
| 231 | + gchar *ptr = strrchr(basename,':'); | |
| 232 | + if(ptr) | |
| 233 | + *ptr = 0; | |
| 234 | + } | |
| 235 | + | |
| 236 | + g_dbus_connection_set_exit_on_close(ipc->dbus.connection,FALSE); | |
| 237 | + | |
| 238 | + char id = lib3270_get_session_id(ipc->hSession); | |
| 239 | + | |
| 240 | + if(id) { | |
| 241 | + | |
| 242 | + if(register_object(ipc,basename,id)) | |
| 243 | + return; | |
| 244 | + | |
| 245 | + } | |
| 246 | + | |
| 247 | + for(id='a'; id < 'z' && !ipc->dbus.id && !*error; id++) { | |
| 248 | + | |
| 249 | + if(register_object(ipc,basename,id)) | |
| 250 | + return; | |
| 251 | + | |
| 252 | + } | |
| 253 | + | |
| 254 | + g_message("Can't register IPC object for session \"%s\"",basename); | |
| 255 | + | |
| 218 | 256 | } | ... | ... |