diff options
author | Thomas Haller <thaller@redhat.com> | 2017-03-02 14:41:59 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-03-02 15:10:25 +0100 |
commit | b2b8d4df23284612b54f4f9c8208a0093c5eff3f (patch) | |
tree | 46dc2238c8e7c50455fbc55caa0133ff0d9096c2 | |
parent | cd5fe38dbf1627b14f2fc02a9fe0b371c4af3397 (diff) | |
download | NetworkManager-th/ifcfg-pack.tar.gz |
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c | 71 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h | 3 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 19 |
3 files changed, 72 insertions, 21 deletions
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c index 2fb7fcf3d7..6a743bdafc 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c @@ -369,12 +369,30 @@ utils_detect_ifcfg_path (const char *path, gboolean only_ifcfg) struct _NMSIfcfgRhPack { shvarFile *main_ifcfg; + GHashTable *subfiles; }; +static void +_sv_close_file (gpointer data) +{ + if (data) + svCloseFile (data); +} + +static NMSIfcfgRhPack * +_pack_new (shvarFile *ifcfg) +{ + NMSIfcfgRhPack *self; + + self = g_slice_new0 (NMSIfcfgRhPack); + self->main_ifcfg = ifcfg; + self->subfiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, _sv_close_file); + return self; +} + NMSIfcfgRhPack * nms_ifcfg_rh_pack_new_open_file (const char *filename, GError **error) { - NMSIfcfgRhPack *self; shvarFile *ifcfg; g_return_val_if_fail (filename, NULL); @@ -383,16 +401,12 @@ nms_ifcfg_rh_pack_new_open_file (const char *filename, GError **error) ifcfg = svOpenFile (filename, error); if (!ifcfg) return NULL; - - self = g_slice_new0 (NMSIfcfgRhPack); - self->main_ifcfg = ifcfg; - return self; + return _pack_new (ifcfg); } NMSIfcfgRhPack * nms_ifcfg_rh_pack_new_create_file (const char *filename) { - NMSIfcfgRhPack *self; shvarFile *ifcfg; g_return_val_if_fail (filename, NULL); @@ -401,9 +415,7 @@ nms_ifcfg_rh_pack_new_create_file (const char *filename) if (!ifcfg) g_return_val_if_reached (NULL); - self = g_slice_new0 (NMSIfcfgRhPack); - self->main_ifcfg = ifcfg; - return self; + return _pack_new (ifcfg); } void @@ -413,6 +425,8 @@ nms_ifcfg_rh_pack_unref (NMSIfcfgRhPack *self) svCloseFile (self->main_ifcfg); + g_hash_table_destroy (self->subfiles); + g_slice_free (NMSIfcfgRhPack, self); } @@ -432,12 +446,51 @@ nms_ifcfg_rh_pack_get_filename (NMSIfcfgRhPack *self) return svFileGetName (self->main_ifcfg); } +void nms_ifcfg_rh_pack_subfile_prune (NMSIfcfgRhPack *self, const char *filename) +{ + g_return_if_fail (self); + g_return_if_fail (filename); + + if (!nm_g_hash_table_insert (self->subfiles, g_strdup (filename), NULL)) + g_return_if_reached (); +} + +shvarFile * +nms_ifcfg_rh_pack_subfile_create (NMSIfcfgRhPack *self, const char *filename) +{ + shvarFile *ifcfg; + + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (filename, NULL); + + ifcfg = svCreateFile (filename); + if (!nm_g_hash_table_insert (self->subfiles, g_strdup (filename), ifcfg)) + g_return_val_if_reached (ifcfg); + return ifcfg; +} + gboolean nms_ifcfg_rh_pack_write_file (NMSIfcfgRhPack *self, GError **error) { + GHashTableIter iter; + shvarFile *ifcfg; + const char *filename; + g_return_val_if_fail (self, FALSE); g_return_val_if_fail (!error || !*error, FALSE); + g_hash_table_iter_init (&iter, self->subfiles); + while (g_hash_table_iter_next (&iter, (gpointer *) &filename, (gpointer *) &ifcfg)) { + if (!ifcfg) + unlink (filename); + } + + g_hash_table_iter_init (&iter, self->subfiles); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &ifcfg)) { + if (ifcfg) + svWriteFile (ifcfg, 0644, NULL); + } + if (!svWriteFile (self->main_ifcfg, 0644, error)) return FALSE; return TRUE; diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h index d657391307..83f6e58b37 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h @@ -67,6 +67,9 @@ void nms_ifcfg_rh_pack_unref (NMSIfcfgRhPack *self); shvarFile *nms_ifcfg_rh_pack_get_main (NMSIfcfgRhPack *self); const char *nms_ifcfg_rh_pack_get_filename (NMSIfcfgRhPack *self); +void nms_ifcfg_rh_pack_subfile_prune (NMSIfcfgRhPack *self, const char *filename); +shvarFile *nms_ifcfg_rh_pack_subfile_create (NMSIfcfgRhPack *self, const char *filename); + gboolean nms_ifcfg_rh_pack_write_file (NMSIfcfgRhPack *self, GError **error); static inline void diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index 23a39bf4c1..506c0f48c5 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -2283,13 +2283,14 @@ write_ip4_setting (NMConnection *connection, shvarFile *ifcfg, GError **error) } static void -write_ip4_aliases (NMConnection *connection, const char *base_ifcfg_path) +write_ip4_aliases (NMSIfcfgRhPack *ifcfg_pack, NMConnection *connection) { NMSettingIPConfig *s_ip4; gs_free char *base_ifcfg_dir = NULL, *base_ifcfg_name = NULL; const char*base_name; int i, num, base_ifcfg_name_len, base_name_len; GDir *dir; + const char *base_ifcfg_path = nms_ifcfg_rh_pack_get_filename (ifcfg_pack); base_ifcfg_dir = g_path_get_dirname (base_ifcfg_path); base_ifcfg_name = g_path_get_basename (base_ifcfg_path); @@ -2312,7 +2313,7 @@ write_ip4_aliases (NMConnection *connection, const char *base_ifcfg_path) continue; full_path = g_build_filename (base_ifcfg_dir, item, NULL); - unlink (full_path); + nms_ifcfg_rh_pack_subfile_prune (ifcfg_pack, full_path); g_free (full_path); } @@ -2329,7 +2330,7 @@ write_ip4_aliases (NMConnection *connection, const char *base_ifcfg_path) for (i = 0; i < num; i++) { GVariant *label_var; const char *label, *p; - char *path, *tmp; + char *path; NMIPAddress *addr; shvarFile *ifcfg; @@ -2351,20 +2352,14 @@ write_ip4_aliases (NMConnection *connection, const char *base_ifcfg_path) continue; path = g_strdup_printf ("%s%s", base_ifcfg_path, label + base_name_len); - ifcfg = svCreateFile (path); + ifcfg = nms_ifcfg_rh_pack_subfile_create (ifcfg_pack, path); g_free (path); svSetValueStr (ifcfg, "DEVICE", label); addr = nm_setting_ip_config_get_address (s_ip4, i); svSetValueStr (ifcfg, "IPADDR", nm_ip_address_get_address (addr)); - - tmp = g_strdup_printf ("%u", nm_ip_address_get_prefix (addr)); - svSetValueStr (ifcfg, "PREFIX", tmp); - g_free (tmp); - - svWriteFile (ifcfg, 0644, NULL); - svCloseFile (ifcfg); + svSetValueInt64 (ifcfg, "PREFIX", nm_ip_address_get_prefix (addr)); } } @@ -2840,7 +2835,7 @@ write_connection (NMConnection *connection, if (!write_ip4_setting (connection, ifcfg, error)) return FALSE; - write_ip4_aliases (connection, nms_ifcfg_rh_pack_get_filename (ifcfg_pack)); + write_ip4_aliases (ifcfg_pack, connection); if (!write_ip6_setting (connection, ifcfg, error)) return FALSE; |