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 test_get_ifcfg_path (const char *desc, const char *path, const char *expected) { char *result; result = utils_get_ifcfg_path (path); 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); } g_free (result); }
char * utils_detect_ifcfg_path (const char *path, gboolean only_ifcfg) { gs_free char *base = NULL; char *ptr, *ifcfg = NULL; g_return_val_if_fail (path != NULL, NULL); if (utils_should_ignore_file (path, only_ifcfg)) return NULL; base = g_path_get_basename (path); if (strncmp (base, IFCFG_TAG, NM_STRLEN (IFCFG_TAG)) == 0) { if (base[NM_STRLEN (IFCFG_TAG)] == '\0') return NULL; if (utils_is_ifcfg_alias_file (base, NULL)) { ifcfg = g_strdup (path); ptr = strrchr (ifcfg, ':'); if (ptr && ptr > ifcfg) { *ptr = '\0'; if (g_file_test (ifcfg, G_FILE_TEST_EXISTS)) { /* the file has a colon, so it is probably an alias. * To be ~more~ certain that this is an alias file, * check whether a corresponding base file exists. */ if (only_ifcfg) { g_free (ifcfg); return NULL; } return ifcfg; } } g_free (ifcfg); } return g_strdup (path); } if (only_ifcfg) return NULL; return utils_get_ifcfg_path (path); }