Add a diagnosis option to set the HTTP_COOKIE
[webgit] / src / options.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007, 2008,         Christian Thaeter <ct@pipapo.org>
6
7   This program is free software: you can redistribute it and/or modify
8   it under the terms of the GNU Affero General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (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 Affero General Public License for more details.
16
17   You should have received a copy of the GNU Affero General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "options.h"
22 #include "query.h"
23
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <stdint.h>
27
28 static int
29 conf_query_opt (struct webgit_query* query, char* arg)
30 {
31   (void) query;
32   if (arg)
33     setenv ("QUERY_STRING", arg, 1);
34   else
35     return -1;
36   return 0;
37 }
38
39 static int
40 conf_method_opt (struct webgit_query* query, char* arg)
41 {
42   (void) query;
43   if (arg)
44     setenv ("REQUEST_METHOD", arg, 1);
45   else
46     return -1;
47   return 0;
48 }
49
50 static int
51 conf_cookie_opt (struct webgit_query* query, char* arg)
52 {
53   (void) query;
54   if (arg)
55     setenv ("HTTP_COOKIE", arg, 1);
56   else
57     return -1;
58   return 0;
59 }
60
61 static int
62 conf_repo_opt (struct webgit_query* query, char* arg)
63 {
64   webgit_query_add_repo (query, arg);
65   return 0;
66 }
67
68 static int
69 conf_conf_opt (struct webgit_query* query, char* arg)
70 {
71   (void) query;
72   setenv ("WEBGIT_CONFIG", arg, 1);
73   return 0;
74 }
75
76 static int
77 conf_rxpd_opt (struct webgit_query* query, char* arg)
78 {
79   char* delim = strchr (arg, ':');
80
81   free (query->rxpd);
82   query->rxpd = cwa_strndup (arg, SIZE_MAX);
83   return 0;
84 }
85
86
87 static int
88 conf_skindir_opt (struct webgit_query* query, char* arg)
89 {
90   free (query->skindir);
91   query->skindir = cwa_strndup (arg, SIZE_MAX);
92   return 0;
93 }
94
95
96 static int
97 conf_webskindir_opt (struct webgit_query* query, char* arg)
98 {
99   free (query->webskindir);
100   query->webskindir = cwa_strndup (arg, SIZE_MAX);
101   return 0;
102 }
103
104
105 static int
106 conf_skin_opt (struct webgit_query* query, char* arg)
107 {
108   free (query->skin);
109   query->skin = cwa_strndup (arg, SIZE_MAX);
110   return 0;
111 }
112
113
114 static int
115 conf_maxage_opt (struct webgit_query* query, char* arg)
116 {
117   query->maxage = atol (arg) * 86400UL;
118   return 0;
119 }
120
121
122 static int
123 conf_count_opt (struct webgit_query* query, char* arg)
124 {
125   query->count_def = atoi (arg);
126   return 0;
127 }
128
129
130 int
131 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
132 {
133 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
134   struct cmd_table{
135     char* name;
136     int (*cb)(struct webgit_query* query, char* arg);
137   } cmds[] = {CONF_OPTS {"", NULL}};
138 #undef CONF_OPT
139
140   for (int i = 1; i<argc; ++i)
141     {
142       for (struct cmd_table* j = cmds; j->cb; ++j)
143         {
144           if (!strncmp (j->name, argv[i], strlen (j->name)))
145             {
146               if (j->cb (query, argv[i+1]))
147                 {
148                   html_list_append (error_log,
149                                     html_fmt (
150                                               "Commandline parsing error '%s' '%s'\n",
151                                               argv[i], argv[i+1])
152                                     );
153                   return -1;
154                 }
155               break;
156             }
157         }
158     }
159
160   return 0;
161 }
162
163 int
164 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
165 {
166 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
167   struct cmd_table{
168     char* name;
169     int (*cb)(struct webgit_query* query, char* arg);
170   } cmds[] = {CONF_OPTS {"", NULL}};
171 #undef CONF_OPT
172
173   if (!file || *file == '\0')
174     return 0;
175
176   FILE* f = fopen (file, "r");
177   if (!f)
178     {
179       html_list_append (error_log,
180                         html_fmt (
181                                   "Configfile opening error '%s'\n", file)
182                         );
183       return -1;
184     }
185
186   char buf[1024];
187
188   while (fgets(buf, 1024, f))
189     {
190       /* lines beginning with '#' are comments */
191       if (*buf == '#')
192         continue;
193
194       /* strip newline at end */
195       char* m = strchr (buf, '\n');
196       if (m)
197         *m = '\0';
198
199       /* first space char is delimiter */
200       m = strchr (buf, ' ');
201       if (m)
202         *m = '\0';
203       else
204         continue;
205
206       for (struct cmd_table* j = cmds; j->cb; ++j)
207         {
208           if (!strncmp (j->name, buf, strlen (j->name)))
209             {
210               if (j->cb (query, m+1))
211                 {
212                   fclose (f);
213                   html_list_append (error_log,
214                                     html_fmt (
215                                               "Configfile parsing error '%s' '%s'\n",
216                                               buf, m+1)
217                                     );
218                   return -1;
219                 }
220               break;
221             }
222         }
223
224     }
225
226   fclose (f);
227
228   return 0;
229 }
230
231
232 /*
233 //      Local Variables:
234 //      mode: C
235 //      c-file-style: "gnu"
236 //      indent-tabs-mode: nil
237 //      End:
238 */