static void read_connections (SCPluginIfcfg *plugin) { GDir *dir; GError *err = NULL; dir = g_dir_open (IFCFG_DIR, 0, &err); if (dir) { const char *item; while ((item = g_dir_read_name (dir))) { char *full_path; if (utils_should_ignore_file (item, TRUE)) continue; full_path = g_build_filename (IFCFG_DIR, item, NULL); if (utils_get_ifcfg_name (full_path, TRUE)) _internal_new_connection (plugin, full_path, NULL, NULL); g_free (full_path); } g_dir_close (dir); } else { PLUGIN_WARN (IFCFG_PLUGIN_NAME, "Can not read directory '%s': %s", IFCFG_DIR, err->message); g_error_free (err); } }
char * utils_cert_path (const char *parent, const char *suffix) { const char *name; char *dir, *path; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (suffix != NULL, NULL); name = utils_get_ifcfg_name (parent, FALSE); dir = g_path_get_dirname (parent); path = g_strdup_printf ("%s/%s-%s", dir, name, suffix); g_free (dir); return path; }
static void test_get_ifcfg_name (const char *desc, const char *path, gboolean only_ifcfg, const char *expected) { const char *result; result = utils_get_ifcfg_name (path, only_ifcfg); if (expected == NULL) { ASSERT (result == NULL, desc, "unexpected valid ifcfg name '%s'", result); } else { ASSERT (result != NULL, desc, "failed to create ifcfg name for '%s'", path); ASSERT (strcmp (result, expected) == 0, desc, "unexpected ifcfg name '%s' created for '%s'", result, path); } }
/* Used to get any ifcfg/extra file path from any other ifcfg/extra path * in the form <tag><name>. */ static char * utils_get_extra_path (const char *parent, const char *tag) { char *item_path = NULL, *dirname; const char *name; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (tag != NULL, NULL); dirname = g_path_get_dirname (parent); if (!dirname) return NULL; name = utils_get_ifcfg_name (parent, FALSE); if (name) { if (!strcmp (dirname, ".")) item_path = g_strdup_printf ("%s%s", tag, name); else item_path = g_strdup_printf ("%s/%s%s", dirname, tag, name); } g_free (dirname); return item_path; }
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); } }