summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-03-02 14:41:59 +0100
committerThomas Haller <thaller@redhat.com>2017-03-02 15:10:25 +0100
commitb2b8d4df23284612b54f4f9c8208a0093c5eff3f (patch)
tree46dc2238c8e7c50455fbc55caa0133ff0d9096c2
parentcd5fe38dbf1627b14f2fc02a9fe0b371c4af3397 (diff)
downloadNetworkManager-th/ifcfg-pack.tar.gz
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c71
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h3
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c19
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;