add some trace points
[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   TRACE (webgit);
156 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
157   struct cmd_table{
158     char* name;
159     int (*cb)(struct webgit_query* query, char* arg);
160   } cmds[] = {CONF_OPTS {"", NULL}};
161 #undef CONF_OPT
162
163   for (int i = 1; i<argc; ++i)
164     {
165       for (struct cmd_table* j = cmds; j->cb; ++j)
166         {
167           if (!strncmp (j->name, argv[i], strlen (j->name)))
168             {
169               if (j->cb (query, argv[i+1]))
170                 {
171                   html_list_append (error_log,
172                                     html_fmt (
173                                               "Commandline parsing error '%s' '%s'\n",
174                                               argv[i], argv[i+1])
175                                     );
176                   return -1;
177                 }
178               break;
179             }
180         }
181     }
182
183   return 0;
184 }
185
186 int
187 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
188 {
189   TRACE (webgit);
190 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
191   struct cmd_table{
192     char* name;
193     int (*cb)(struct webgit_query* query, char* arg);
194   } cmds[] = {CONF_OPTS {"", NULL}};
195 #undef CONF_OPT
196
197   if (!file || *file == '\0')
198     return 0;
199
200   FILE* f = fopen (file, "r");
201   if (!f)
202     {
203       html_list_append (error_log,
204                         html_fmt (
205                                   "Configfile opening error '%s'\n", file)
206                         );
207       return -1;
208     }
209
210   char buf[1024];
211
212   while (fgets(buf, 1024, f))
213     {
214       /* lines beginning with '#' are comments */
215       if (*buf == '#')
216         continue;
217
218       /* strip newline at end */
219       char* m = strchr (buf, '\n');
220       if (m)
221         *m = '\0';
222
223       /* first space char is delimiter */
224       m = strchr (buf, ' ');
225       if (m)
226         *m = '\0';
227       else
228         continue;
229
230       for (struct cmd_table* j = cmds; j->cb; ++j)
231         {
232           if (!strncmp (j->name, buf, strlen (j->name)))
233             {
234               if (j->cb (query, m+1))
235                 {
236                   fclose (f);
237                   html_list_append (error_log,
238                                     html_fmt (
239                                               "Configfile parsing error '%s' '%s'\n",
240                                               buf, m+1)
241                                     );
242                   return -1;
243                 }
244               break;
245             }
246         }
247
248     }
249
250   fclose (f);
251
252   return 0;
253 }
254
255
256 /*
257 //      Local Variables:
258 //      mode: C
259 //      c-file-style: "gnu"
260 //      indent-tabs-mode: nil
261 //      End:
262 */