Merge branch 'goibhniu' of git://git.pipapo.org/mob/webgit
[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 #define SHA1_HEADER <openssl/sha.h>
29 #include "git/cache.h"
30
31 static int
32 conf_query_opt (struct webgit_query* query, char* arg)
33 {
34   (void) query;
35   if (arg)
36     setenv ("QUERY_STRING", arg, 1);
37   else
38     return -1;
39   return 0;
40 }
41
42 static int
43 conf_method_opt (struct webgit_query* query, char* arg)
44 {
45   (void) query;
46   if (arg)
47     setenv ("REQUEST_METHOD", arg, 1);
48   else
49     return -1;
50   return 0;
51 }
52
53 static int
54 conf_cookie_opt (struct webgit_query* query, char* arg)
55 {
56   (void) query;
57   if (arg)
58     setenv ("HTTP_COOKIE", arg, 1);
59   else
60     return -1;
61   return 0;
62 }
63
64 static int
65 conf_repo_opt (struct webgit_query* query, char* arg)
66 {
67   webgit_query_add_repo (query, arg);
68   return 0;
69 }
70
71 static int
72 conf_conf_opt (struct webgit_query* query, char* arg)
73 {
74   (void) query;
75   setenv ("WEBGIT_CONFIG", arg, 1);
76   return 0;
77 }
78
79 static int
80 conf_rxpd_opt (struct webgit_query* query, char* arg)
81 {
82   free (query->rxpd);
83   query->rxpd = cwa_strndup (arg, SIZE_MAX);
84   return 0;
85 }
86
87
88 static int
89 conf_skindir_opt (struct webgit_query* query, char* arg)
90 {
91   free (query->skindir);
92   query->skindir = cwa_strndup (arg, SIZE_MAX);
93   return 0;
94 }
95
96
97 static int
98 conf_webskindir_opt (struct webgit_query* query, char* arg)
99 {
100   free (query->webskindir);
101   query->webskindir = cwa_strndup (arg, SIZE_MAX);
102   return 0;
103 }
104
105
106 static int
107 conf_skin_opt (struct webgit_query* query, char* arg)
108 {
109   free (query->skin);
110   query->skin = cwa_strndup (arg, SIZE_MAX);
111   return 0;
112 }
113
114
115 static int
116 conf_maxage_opt (struct webgit_query* query, char* arg)
117 {
118   query->maxage = atol (arg) * 86400UL;
119   return 0;
120 }
121
122
123 static int
124 conf_count_opt (struct webgit_query* query, char* arg)
125 {
126   query->count_def = atoi (arg);
127   return 0;
128 }
129
130
131 static int
132 conf_secret_opt (struct webgit_query* query, char* arg)
133 {
134   if (strlen (arg) < 6)
135     die ("secret to short");
136
137   free (query->secret);
138   query->secret = cwa_strndup (sha1_to_hex (SHA1 (arg, strlen(arg), NULL)), 40);
139   return 0;
140 }
141
142
143 static int
144 conf_accountdir_opt (struct webgit_query* query, char* arg)
145 {
146   free (query->accountdir);
147   query->accountdir = cwa_strndup (arg, SIZE_MAX);
148   return 0;
149 }
150
151
152 int
153 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
154 {
155 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
156   struct cmd_table{
157     char* name;
158     int (*cb)(struct webgit_query* query, char* arg);
159   } cmds[] = {CONF_OPTS {"", NULL}};
160 #undef CONF_OPT
161
162   for (int i = 1; i<argc; ++i)
163     {
164       for (struct cmd_table* j = cmds; j->cb; ++j)
165         {
166           if (!strncmp (j->name, argv[i], strlen (j->name)))
167             {
168               if (j->cb (query, argv[i+1]))
169                 {
170                   html_list_append (error_log,
171                                     html_fmt (
172                                               "Commandline parsing error '%s' '%s'\n",
173                                               argv[i], argv[i+1])
174                                     );
175                   return -1;
176                 }
177               break;
178             }
179         }
180     }
181
182   return 0;
183 }
184
185 int
186 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
187 {
188 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
189   struct cmd_table{
190     char* name;
191     int (*cb)(struct webgit_query* query, char* arg);
192   } cmds[] = {CONF_OPTS {"", NULL}};
193 #undef CONF_OPT
194
195   if (!file || *file == '\0')
196     return 0;
197
198   FILE* f = fopen (file, "r");
199   if (!f)
200     {
201       html_list_append (error_log,
202                         html_fmt (
203                                   "Configfile opening error '%s'\n", file)
204                         );
205       return -1;
206     }
207
208   char buf[1024];
209
210   while (fgets(buf, 1024, f))
211     {
212       /* lines beginning with '#' are comments */
213       if (*buf == '#')
214         continue;
215
216       /* strip newline at end */
217       char* m = strchr (buf, '\n');
218       if (m)
219         *m = '\0';
220
221       /* first space char is delimiter */
222       m = strchr (buf, ' ');
223       if (m)
224         *m = '\0';
225       else
226         continue;
227
228       for (struct cmd_table* j = cmds; j->cb; ++j)
229         {
230           if (!strncmp (j->name, buf, strlen (j->name)))
231             {
232               if (j->cb (query, m+1))
233                 {
234                   fclose (f);
235                   html_list_append (error_log,
236                                     html_fmt (
237                                               "Configfile parsing error '%s' '%s'\n",
238                                               buf, m+1)
239                                     );
240                   return -1;
241                 }
242               break;
243             }
244         }
245
246     }
247
248   fclose (f);
249
250   return 0;
251 }
252
253
254 /*
255 //      Local Variables:
256 //      mode: C
257 //      c-file-style: "gnu"
258 //      indent-tabs-mode: nil
259 //      End:
260 */