aboutsummaryrefslogtreecommitdiffstats
path: root/filter/rule-context.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/rule-context.c')
-rw-r--r--filter/rule-context.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/filter/rule-context.c b/filter/rule-context.c
index 389ef7296a..f77f77b9d0 100644
--- a/filter/rule-context.c
+++ b/filter/rule-context.c
@@ -22,6 +22,10 @@
#include <config.h>
#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
#include <errno.h>
#include <string.h>
#include <gtk/gtksignal.h>
@@ -356,6 +360,8 @@ save (RuleContext *f, const char *user)
GList *l;
FilterRule *rule;
struct _rule_set_map *map;
+ char *usersav, *userbak, *slash;
+ int ret;
doc = xmlNewDoc ("1.0");
root = xmlNewDocNode (doc, NULL, "filteroptions", NULL);
@@ -373,9 +379,23 @@ save (RuleContext *f, const char *user)
}
l = g_list_next (l);
}
- xmlSaveFile (user, doc);
+
+ usersav = alloca(strlen(user)+5);
+ userbak = alloca(strlen(user)+5);
+ slash = strrchr(user, '/');
+ if (slash)
+ sprintf(usersav, "%.*s.#%s", slash-user+1, user, slash+1);
+ else
+ sprintf(usersav, ".#%s", user);
+ sprintf(userbak, "%s~", user);
+ printf("saving rules to '%s' then backup '%s'\n", usersav, userbak);
+ ret = xmlSaveFile(usersav, doc);
+ if (ret != -1) {
+ rename(user, userbak);
+ ret = rename(usersav, user);
+ }
xmlFreeDoc (doc);
- return 0;
+ return ret;
}
FilterPart *
@@ -432,9 +452,6 @@ rule_context_add_rule (RuleContext *f, FilterRule *new)
static void
new_rule_clicked (GtkWidget *dialog, int button, RuleContext *context)
{
-#ifndef NO_WARNINGS
-#warning "Need a changed signal for this to work best"
-#endif
if (button == 0) {
FilterRule *rule = gtk_object_get_data (GTK_OBJECT (dialog), "rule");
char *user = gtk_object_get_data (GTK_OBJECT (dialog), "path");