Big rename! ctgit is dead, long live webgit
[webgit] / src / options.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007,               Christian Thaeter <ct@pipapo.org>
6
7   This program is free software; you can redistribute it and/or
8   modify it under the terms of the GNU General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "options.h"
23
24 #include <stdlib.h>
25 #include <stdio.h>
26
27
28 static int
29 conf_query_opt (struct webgit_query* query, char* arg)
30 {
31   if (arg)
32     setenv ("QUERY_STRING", arg, 1);
33   else
34     return -1;
35   return 0;
36 }
37
38 static int
39 conf_method_opt (struct webgit_query* query, char* arg)
40 {
41   if (arg)
42     setenv ("REQUEST_METHOD", arg, 1);
43   else
44     return -1;
45   return 0;
46 }
47
48 static int
49 conf_repo_opt (struct webgit_query* query, char* arg)
50 {
51   //fprintf (stderr, "add repo '%s'\n", arg);
52
53   webgit_query_add_repo (query, arg);
54
55   return 0;
56 }
57
58 static int
59 conf_conf_opt (struct webgit_query* query, char* arg)
60 {
61   (void) query;
62   setenv ("WEBGIT_CONFIG", arg, 1);
63   return 0;
64 }
65
66 int
67 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
68 {
69 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
70   struct cmd_table{
71     char* name;
72     int (*cb)(struct webgit_query* query, char* arg);
73   } cmds[] = {CONF_OPTS {"", NULL}};
74 #undef CONF_OPT
75
76   for (int i = 1; i<argc; ++i)
77     {
78       for (struct cmd_table* j = cmds; j->cb; ++j)
79         {
80           if (!strncmp (j->name, argv[i], strlen (j->name)))
81             {
82               if (j->cb (query, argv[i+1]))
83                 {
84                   html_list_append (error_log,
85                                     html_fmt (
86                                               "Commandline parsing error '%s' '%s'\n",
87                                               argv[i], argv[i+1])
88                                     );
89                   return -1;
90                 }
91               break;
92             }
93         }
94     }
95
96   return 0;
97 }
98
99 int
100 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
101 {
102 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
103   struct cmd_table{
104     char* name;
105     int (*cb)(struct webgit_query* query, char* arg);
106   } cmds[] = {CONF_OPTS {"", NULL}};
107 #undef CONF_OPT
108
109   if (!file || *file == '\0')
110     return 0;
111
112   FILE* f = fopen (file, "r");
113   if (!f)
114     {
115       html_list_append (error_log,
116                         html_fmt (
117                                   "Configfile opening error '%s'\n", file)
118                         );
119       return -1;
120     }
121
122   char buf[1024];
123
124   while (fgets(buf, 1024, f))
125     {
126       /* lines beginning with '#' are comments */
127       if (*buf == '#')
128         continue;
129
130       /* strip newline at end */
131       char* m = strchr (buf, '\n');
132       if (m)
133         *m = '\0';
134
135       /* first space char is delimiter */
136       m = strchr (buf, ' ');
137       if (m)
138         *m = '\0';
139       else
140         continue;
141
142       for (struct cmd_table* j = cmds; j->cb; ++j)
143         {
144           if (!strncmp (j->name, buf, strlen (j->name)))
145             {
146               if (j->cb (query, m+1))
147                 {
148                   fclose (f);
149                   html_list_append (error_log,
150                                     html_fmt (
151                                               "Configfile parsing error '%s' '%s'\n",
152                                               buf, m+1)
153                                     );
154                   return -1;
155                 }
156               break;
157             }
158         }
159
160     }
161
162   fclose (f);
163
164   return 0;
165 }
166