refactored file_load into file_new and then file_load
authorChristian Thaeter <ct@pipapo.org>
Fri, 5 Oct 2007 14:02:02 +0000 (16:02 +0200)
committerChristian Thaeter <ct@pipapo.org>
Fri, 5 Oct 2007 14:02:02 +0000 (16:02 +0200)
main.c
rxpd.c
rxpd.h

diff --git a/main.c b/main.c
index e064fca..e82fdc4 100644 (file)
--- a/main.c
+++ b/main.c
@@ -65,7 +65,8 @@ main (int argc, char** argv)
   // parse commandline args
 
   // read files
-  rxpd_file_load (rxpd, "test");
+  struct rxpd_file* file = rxpd_file_new (rxpd, "test");
+  rxpd_file_load (file);
 
   // initialize listening connections
   // port 2374
diff --git a/rxpd.c b/rxpd.c
index e87e72c..93e5277 100644 (file)
--- a/rxpd.c
+++ b/rxpd.c
@@ -133,54 +133,33 @@ rxpd_rule_delete (struct rxpd_rule* rule)
 //
 
 
-int
-rxpd_file_load (struct rxpd_base* base, const char* filename)
+struct rxpd_file*
+rxpd_file_new (struct rxpd_base* base, const char* filename)
 {
   char buf[4096];
+  struct rxpd_file* self = NULL;
 
   // TODO better filenname validation / error handling
   if (!filename ||
       strchr (filename, '/') ||
       strlen (filename) + strlen (base->rulesdir) > 4097)
-    abort();
+    return NULL;
 
   strcpy (buf, base->rulesdir);
   strcat (buf, filename);
   filename = strdup (buf);
-
-  struct rxpd_file* file = malloc (sizeof (struct rxpd_file));
-  if (!file || !filename) abort();
-
-  psplay_init (&file->node, filename);
-  llist_init (&file->rules);
-  
-  FILE* f = fopen (filename, "r");
-  // TODO error handling
-  if (!f) abort();
-
-  // TODO test excess line length = error
-  while (fgets (buf, 4096, f))
+  if (filename)
     {
-      size_t last = strlen(buf);
-      if (buf[last-1] == '\n')
-        buf[last-1] = '\0';
-
-      struct rxpd_rule* rule;
-      rule = rxpd_rule_new (buf);
-      if (!rule)
-        abort();
-
-
-      printf("%s\n", rule->string);
+      self = malloc (sizeof (struct rxpd_file));
+      if (self)
+        {
+          psplay_init (&self->node, filename);
+          llist_init (&self->rules);
 
-      llist_insert_tail (&file->rules, &rule->node);
+          psplay_insert (&base->files, &self->node);
+        }
     }
-
-  fclose (f);
-
-  psplay_insert (&base->files, &file->node);
-
-  return 0;
+  return self;
 }
 
 void
@@ -199,6 +178,41 @@ rxpd_file_delete (PSplay f)
     }
 }
 
+int
+rxpd_file_load (struct rxpd_file* self)
+{
+  const char* filename = self->node.key;
+
+  FILE* f = fopen (filename, "r");
+  // TODO error handling
+  if (f)
+    {
+      // TODO test excess line length = error
+      char buf[4096];
+
+      while (fgets (buf, 4096, f))
+        {
+          size_t last = strlen(buf);
+          if (buf[last-1] == '\n')
+            buf[last-1] = '\0';
+
+          struct rxpd_rule* rule;
+          rule = rxpd_rule_new (buf);
+          if (!rule)
+            abort();
+
+          printf("%s\n", rule->string);
+
+          llist_insert_tail (&self->rules, &rule->node);
+        }
+
+      fclose (f);
+      return 1;
+    }
+  else
+    return 0;
+}
+
 int
 rxpd_file_cmp (const void* A, const void* B)
 {
diff --git a/rxpd.h b/rxpd.h
index ed45055..43d0185 100644 (file)
--- a/rxpd.h
+++ b/rxpd.h
@@ -104,12 +104,15 @@ struct rxpd_file
   llist rules;
 };
 
-int
-rxpd_file_load (struct rxpd_base* base, const char* filename);
+struct rxpd_file*
+rxpd_file_new (struct rxpd_base* base, const char* filename);
 
 void
 rxpd_file_delete (PSplay file);
 
+int
+rxpd_file_load (struct rxpd_file* self);
+
 int
 rxpd_file_cmp (const void* A, const void* B);