static gboolean load_connection (NMSettingsPlugin *config, const char *filename) { SettingsPluginIfcfg *plugin = SETTINGS_PLUGIN_IFCFG (config); NMIfcfgConnection *connection; int dir_len = strlen (IFCFG_DIR); char *ifcfg_path; if ( strncmp (filename, IFCFG_DIR, dir_len) != 0 || filename[dir_len] != '/' || strchr (filename + dir_len + 1, '/') != NULL) return FALSE; /* get the real ifcfg-path. This allows us to properly * handle load command using a route-* file etc. */ ifcfg_path = utils_detect_ifcfg_path (filename, FALSE); if (!ifcfg_path) return FALSE; connection = find_by_path (plugin, ifcfg_path); update_connection (plugin, NULL, ifcfg_path, connection, TRUE, NULL, NULL); if (!connection) connection = find_by_path (plugin, ifcfg_path); g_free (ifcfg_path); return (connection != NULL); }
static void ifcfg_dir_changed (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, gpointer user_data) { SettingsPluginIfcfg *plugin = SETTINGS_PLUGIN_IFCFG (user_data); char *path, *ifcfg_path; NMIfcfgConnection *connection; path = g_file_get_path (file); ifcfg_path = utils_detect_ifcfg_path (path, FALSE); _LOGD ("ifcfg_dir_changed(%s) = %d // %s", path, event_type, ifcfg_path ? ifcfg_path : "(none)"); if (ifcfg_path) { connection = find_by_path (plugin, ifcfg_path); switch (event_type) { case G_FILE_MONITOR_EVENT_DELETED: if (connection) remove_connection (plugin, connection); break; case G_FILE_MONITOR_EVENT_CREATED: case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: /* Update or new */ update_connection (plugin, NULL, ifcfg_path, connection, TRUE, NULL, NULL); break; default: break; } g_free (ifcfg_path); } g_free (path); }
static void handle_port_connection_change(jack_port_id_t port_id_1, jack_port_id_t port_id_2, int connected, void *arg) { jack_port_t *port_1; jack_port_t *port_2; if ((remote_in_port != NULL) && (remote_out_port != NULL)) { return; } port_1 = jack_port_by_id(client, port_id_1); port_2 = jack_port_by_id(client, port_id_2); /* The 'update_connection' call is not RT-safe. It calls 'jack_port_get_connections' and 'jack_free'. This might be a problem with JACK 1, as this callback runs in the process thread in JACK 1. */ if (port_1 == in_port) { remote_in_port = update_connection(port_2, connected, in_port, remote_in_port, target_in_port_name); } else if (port_2 == in_port) { remote_in_port = update_connection(port_1, connected, in_port, remote_in_port, target_in_port_name); } else if (port_1 == out_port) { remote_out_port = update_connection(port_2, connected, out_port, remote_out_port, target_out_port_name); } else if (port_2 == out_port) { remote_out_port = update_connection(port_1, connected, out_port, remote_out_port, target_out_port_name); } if ((remote_in_port != NULL) && (remote_out_port != NULL)) { connections_established = 1; if (! signal_semaphore(connect_semaphore)) { /* Sigh ... */ die("post_semaphore", get_semaphore_error()); } if (! signal_semaphore(init_semaphore)) { /* Sigh ... */ die("post_semaphore", get_semaphore_error()); } } }
static void apply_edits (NetConnectionEditor *editor) { update_connection (editor); if (editor->is_new_connection) { nm_remote_settings_add_connection (editor->settings, editor->orig_connection, added_connection_cb, editor); } else { nm_remote_connection_commit_changes (NM_REMOTE_CONNECTION (editor->orig_connection), updated_connection_cb, editor); } }
static NMSettingsConnection * add_connection (NMSystemConfigInterface *config, NMConnection *connection, gboolean save_to_disk, GError **error) { SCPluginKeyfile *self = SC_PLUGIN_KEYFILE (config); gs_free char *path = NULL; if (save_to_disk) { if (!nm_keyfile_plugin_write_connection (connection, NULL, &path, error)) return NULL; } return NM_SETTINGS_CONNECTION (update_connection (self, connection, path, NULL, FALSE, NULL, error)); }
static void ifcfg_dir_changed (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, gpointer user_data) { SCPluginIfcfg *plugin = SC_PLUGIN_IFCFG (user_data); char *path, *base, *ifcfg_path; NMIfcfgConnection *connection; path = g_file_get_path (file); if (utils_should_ignore_file (path, FALSE)) { g_free (path); return; } _LOGD ("ifcfg_dir_changed(%s) = %d", path, event_type); base = g_file_get_basename (file); if (utils_is_ifcfg_alias_file (base, NULL)) { /* Alias file changed. Get the base ifcfg file from it */ ifcfg_path = utils_get_ifcfg_from_alias (path); } else { /* Given any ifcfg, keys, or routes file, get the ifcfg file path */ ifcfg_path = utils_get_ifcfg_path (path); } if (ifcfg_path) { connection = find_by_path (plugin, ifcfg_path); switch (event_type) { case G_FILE_MONITOR_EVENT_DELETED: if (connection) remove_connection (plugin, connection); break; case G_FILE_MONITOR_EVENT_CREATED: case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: /* Update or new */ update_connection (plugin, NULL, ifcfg_path, connection, TRUE, NULL, NULL); break; default: break; } g_free (ifcfg_path); } g_free (path); g_free (base); }
static void connection_ifcfg_changed (NMIfcfgConnection *connection, gpointer user_data) { SCPluginIfcfg *self = SC_PLUGIN_IFCFG (user_data); SCPluginIfcfgPrivate *priv = SC_PLUGIN_IFCFG_GET_PRIVATE (self); const char *path; path = nm_settings_connection_get_filename (NM_SETTINGS_CONNECTION (connection)); g_return_if_fail (path != NULL); if (!priv->ifcfg_monitor) { _LOGD ("connection_ifcfg_changed("NM_IFCFG_CONNECTION_LOG_FMTD"): %s", NM_IFCFG_CONNECTION_LOG_ARGD (connection), "ignore event"); return; } _LOGD ("connection_ifcfg_changed("NM_IFCFG_CONNECTION_LOG_FMTD"): %s", NM_IFCFG_CONNECTION_LOG_ARGD (connection), "reload"); update_connection (self, NULL, path, connection, TRUE, NULL, NULL); }
static gboolean load_connection (NMSystemConfigInterface *config, const char *filename) { SCPluginKeyfile *self = SC_PLUGIN_KEYFILE (config); NMKeyfileConnection *connection; int dir_len = strlen (KEYFILE_DIR); if ( strncmp (filename, KEYFILE_DIR, dir_len) != 0 || filename[dir_len] != '/' || strchr (filename + dir_len + 1, '/') != NULL) return FALSE; if (nm_keyfile_plugin_utils_should_ignore_file (filename + dir_len + 1)) return FALSE; connection = update_connection (self, NULL, filename, find_by_path (self, filename), TRUE, NULL, NULL); return (connection != NULL); }
static NMSettingsConnection * add_connection (NMSystemConfigInterface *config, NMConnection *connection, gboolean save_to_disk, GError **error) { SCPluginIfcfg *self = SC_PLUGIN_IFCFG (config); gs_free char *path = NULL; /* Ensure we reject attempts to add the connection long before we're * asked to write it to disk. */ if (!writer_can_write_connection (connection, error)) return NULL; if (save_to_disk) { if (!writer_new_connection (connection, IFCFG_DIR, &path, error)) return NULL; } return NM_SETTINGS_CONNECTION (update_connection (self, connection, path, NULL, FALSE, NULL, error)); }
static void dir_changed (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, gpointer user_data) { NMSystemConfigInterface *config = NM_SYSTEM_CONFIG_INTERFACE (user_data); SCPluginKeyfile *self = SC_PLUGIN_KEYFILE (config); NMKeyfileConnection *connection; char *full_path; gboolean exists; full_path = g_file_get_path (file); if (nm_keyfile_plugin_utils_should_ignore_file (full_path)) { g_free (full_path); return; } exists = g_file_test (full_path, G_FILE_TEST_EXISTS); nm_log_dbg (LOGD_SETTINGS, "dir_changed(%s) = %d; file %s", full_path, event_type, exists ? "exists" : "does not exist"); connection = find_by_path (self, full_path); switch (event_type) { case G_FILE_MONITOR_EVENT_DELETED: if (!exists && connection) remove_connection (SC_PLUGIN_KEYFILE (config), connection); break; case G_FILE_MONITOR_EVENT_CREATED: case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: if (exists) update_connection (SC_PLUGIN_KEYFILE (config), NULL, full_path, connection, TRUE, NULL, NULL); break; default: break; } g_free (full_path); }
static gboolean load_connection (NMSystemConfigInterface *config, const char *filename) { SCPluginIfcfg *plugin = SC_PLUGIN_IFCFG (config); NMIfcfgConnection *connection; int dir_len = strlen (IFCFG_DIR); if ( strncmp (filename, IFCFG_DIR, dir_len) != 0 || filename[dir_len] != '/' || strchr (filename + dir_len + 1, '/') != NULL) return FALSE; if (utils_should_ignore_file (filename + dir_len + 1, TRUE)) return FALSE; connection = find_by_path (plugin, filename); update_connection (plugin, NULL, filename, connection, TRUE, NULL, NULL); if (!connection) connection = find_by_path (plugin, filename); return (connection != NULL); }
static void read_connections (SCPluginIfcfg *plugin) { SCPluginIfcfgPrivate *priv = SC_PLUGIN_IFCFG_GET_PRIVATE (plugin); GDir *dir; GError *err = NULL; const char *item; GHashTable *alive_connections; GHashTableIter iter; NMIfcfgConnection *connection; GPtrArray *dead_connections = NULL; guint i; GPtrArray *filenames; GHashTable *paths; dir = g_dir_open (IFCFG_DIR, 0, &err); if (!dir) { _LOGW ("Could not read directory '%s': %s", IFCFG_DIR, err->message); g_error_free (err); return; } alive_connections = g_hash_table_new (NULL, NULL); filenames = g_ptr_array_new_with_free_func (g_free); while ((item = g_dir_read_name (dir))) { char *full_path; if (utils_should_ignore_file (item, TRUE)) continue; if (utils_is_ifcfg_alias_file (item, NULL)) continue; full_path = g_build_filename (IFCFG_DIR, item, NULL); if (!utils_get_ifcfg_name (full_path, TRUE)) g_free (full_path); else g_ptr_array_add (filenames, full_path); } g_dir_close (dir); /* While reloading, we don't replace connections that we already loaded while * iterating over the files. * * To have sensible, reproducible behavior, sort the paths by last modification * time prefering older files. */ paths = _paths_from_connections (priv->connections); g_ptr_array_sort_with_data (filenames, (GCompareDataFunc) _sort_paths, paths); g_hash_table_destroy (paths); for (i = 0; i < filenames->len; i++) { connection = update_connection (plugin, NULL, filenames->pdata[i], NULL, FALSE, alive_connections, NULL); if (connection) g_hash_table_add (alive_connections, connection); } g_ptr_array_free (filenames, TRUE); g_hash_table_iter_init (&iter, priv->connections); while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &connection)) { if ( !g_hash_table_contains (alive_connections, connection) && nm_settings_connection_get_filename (NM_SETTINGS_CONNECTION (connection))) { if (!dead_connections) dead_connections = g_ptr_array_new (); g_ptr_array_add (dead_connections, connection); } } g_hash_table_destroy (alive_connections); if (dead_connections) { for (i = 0; i < dead_connections->len; i++) remove_connection (plugin, dead_connections->pdata[i]); g_ptr_array_free (dead_connections, TRUE); } }
static void handle_bluetooth(bool connected) { bluetooth_connected = connected; update_connection(); }
static void read_connections (NMSystemConfigInterface *config) { SCPluginKeyfile *self = SC_PLUGIN_KEYFILE (config); SCPluginKeyfilePrivate *priv = SC_PLUGIN_KEYFILE_GET_PRIVATE (self); GDir *dir; GError *error = NULL; const char *item; GHashTable *alive_connections; GHashTableIter iter; NMKeyfileConnection *connection; GPtrArray *dead_connections = NULL; guint i; GPtrArray *filenames; GHashTable *paths; dir = g_dir_open (KEYFILE_DIR, 0, &error); if (!dir) { nm_log_warn (LOGD_SETTINGS, "keyfile: cannot read directory '%s': (%d) %s", KEYFILE_DIR, error ? error->code : -1, error && error->message ? error->message : "(unknown)"); g_clear_error (&error); return; } alive_connections = g_hash_table_new (NULL, NULL); filenames = g_ptr_array_new_with_free_func (g_free); while ((item = g_dir_read_name (dir))) { if (nm_keyfile_plugin_utils_should_ignore_file (item)) continue; g_ptr_array_add (filenames, g_build_filename (KEYFILE_DIR, item, NULL)); } g_dir_close (dir); /* While reloading, we don't replace connections that we already loaded while * iterating over the files. * * To have sensible, reproducible behavior, sort the paths by last modification * time prefering older files. */ paths = _paths_from_connections (priv->connections); g_ptr_array_sort_with_data (filenames, (GCompareDataFunc) _sort_paths, paths); g_hash_table_destroy (paths); for (i = 0; i < filenames->len; i++) { connection = update_connection (self, NULL, filenames->pdata[i], NULL, FALSE, alive_connections, NULL); if (connection) g_hash_table_add (alive_connections, connection); } g_ptr_array_free (filenames, TRUE); g_hash_table_iter_init (&iter, priv->connections); while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &connection)) { if ( !g_hash_table_contains (alive_connections, connection) && nm_settings_connection_get_filename (NM_SETTINGS_CONNECTION (connection))) { if (!dead_connections) dead_connections = g_ptr_array_new (); g_ptr_array_add (dead_connections, connection); } } g_hash_table_destroy (alive_connections); if (dead_connections) { for (i = 0; i < dead_connections->len; i++) remove_connection (self, dead_connections->pdata[i]); g_ptr_array_free (dead_connections, TRUE); } }