config file loading
authorChristian Thaeter <ct@pipapo.org>
Mon, 17 Dec 2007 21:46:23 +0000 (22:46 +0100)
committerChristian Thaeter <ct@pipapo.org>
Mon, 17 Dec 2007 21:46:23 +0000 (22:46 +0100)
src/ctgit.c
src/options.c
src/options.h

index d7616d2ef0ce9fbc8c9787b62212a4dad1fa8901..c838debb17c61185d834df5fdb2a49448e4350a3 100644 (file)
 
 #include "ctgit.h"
 
+#ifndef CTGIT_CONFIG
+#define CTGIT_CONFIG "/etc/ctgit.conf"
+#endif
+
 #include "actions.h"
 #include "query.h"
 #include "options.h"
@@ -45,6 +49,7 @@ main (int argc, char**argv)
   /* set some defaults if not already set */
   setenv ("REQUEST_METHOD", "GET", 0);
   setenv ("SCRIPT_NAME", argv[0], 0);
+  setenv ("CTGIT_CONFIG", CTGIT_CONFIG, 0);
 
   if (ctgit_commandline_dispatch (argc, argv, &query))
     {
@@ -53,6 +58,12 @@ main (int argc, char**argv)
     }
 
   // read config
+  if (ctgit_configfile_dispatch (getenv("CTGIT_CONFIG"), &query))
+    {
+      fprintf (stderr, "Configfile parsing error\n");
+      return 10;
+    }
+
 
 
   // parse request/query What to show?
index 2ecf0e1eb4612d5a5ebe39d1837636d9d3ef669b..a54bbba17168914beed322ae16857f3d0e5627b3 100644 (file)
@@ -55,6 +55,14 @@ conf_repo_opt (struct ctgit_query* query, char* arg)
   return 0;
 }
 
+static int
+conf_conf_opt (struct ctgit_query* query, char* arg)
+{
+  (void) query;
+  setenv ("CTGIT_CONFIG", arg, 1);
+  return 0;
+}
+
 int
 ctgit_commandline_dispatch (int argc, char**argv, struct ctgit_query* query)
 {
@@ -63,7 +71,7 @@ ctgit_commandline_dispatch (int argc, char**argv, struct ctgit_query* query)
     char* name;
     int (*cb)(struct ctgit_query* query, char* arg);
   } cmds[] = {CONF_OPTS {"", NULL}};
-#undef CMD_OPT
+#undef CONF_OPT
 
   for (int i = 1; i<argc; ++i)
     {
@@ -81,3 +89,60 @@ ctgit_commandline_dispatch (int argc, char**argv, struct ctgit_query* query)
   return 0;
 }
 
+int
+ctgit_configfile_dispatch (const char* file, struct ctgit_query* query)
+{
+#define CONF_OPT(name, _) {#name, conf_##name##_opt},
+  struct cmd_table{
+    char* name;
+    int (*cb)(struct ctgit_query* query, char* arg);
+  } cmds[] = {CONF_OPTS {"", NULL}};
+#undef CONF_OPT
+
+  if (!file || *file == '\0')
+    return 0;
+
+  FILE* f = fopen (file, "r");
+  if (!f)
+    return -1;
+
+  char buf[1024];
+
+  while (fgets(buf, 1024, f))
+    {
+      /* lines beginning with '#' are comments */
+      if (*buf == '#')
+        continue;
+
+      /* strip newline at end */
+      char* m = strchr (buf, '\n');
+      if (m)
+        *m = '\0';
+
+      /* first space char is delimiter */
+      m = strchr (buf, ' ');
+      if (m)
+        *m = '\0';
+      else
+        continue;
+
+      for (struct cmd_table* j = cmds; j->cb; ++j)
+        {
+          if (!strncmp (j->name, buf, strlen (j->name)))
+            {
+              if (j->cb (query, m+1))
+                {
+                  fclose (f);
+                  return -1;
+                }
+              break;
+            }
+        }
+
+    }
+
+  fclose (f);
+
+  return 0;
+}
+
index 8a9c8de17375d1eb095304db142824dd244ea03a..b744e671bda3c38c6d3fdf299920c324dad9d723 100644 (file)
 /*
   config options
 */
-#define CONF_OPTS                               \
- CONF_OPT(query, "Set the QUERY_STRING [diag]") \
- CONF_OPT(method, "Set REQUEST_METHOD [diag]")  \
+#define CONF_OPTS                                       \
+ CONF_OPT(query, "Set the QUERY_STRING [diag]")         \
+ CONF_OPT(method, "Set REQUEST_METHOD [diag]")          \
+ CONF_OPT(conf, "Set config file, may be empty")        \
  CONF_OPT(repo, "Add a repository")
 
 // CONF_OPT(conffile) CONF_OPT(include)
@@ -39,7 +40,7 @@ cgit_options_defaults (struct ctgit_query* query);
 int
 ctgit_commandline_dispatch (int argc, char**argv, struct ctgit_query* query);
 
-//int
-//ctgit_configfile_dispatch (const char* file, struct ctgit_query* query);
+int
+ctgit_configfile_dispatch (const char* file, struct ctgit_query* query);
 
 #endif