f87c0eab9ecb9f25c02cc9b9ab03aa6888412ac3
[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_repo_opt (struct webgit_query* query, char* arg)
52 {
53   webgit_query_add_repo (query, arg);
54   return 0;
55 }
56
57 static int
58 conf_conf_opt (struct webgit_query* query, char* arg)
59 {
60   (void) query;
61   setenv ("WEBGIT_CONFIG", arg, 1);
62   return 0;
63 }
64
65 static int
66 conf_rxpd_opt (struct webgit_query* query, char* arg)
67 {
68   char* delim = strchr (arg, ':');
69
70   free (query->rxpd);
71   query->rxpd = cwa_strndup (arg, SIZE_MAX);
72   return 0;
73 }
74
75
76 static int
77 conf_skindir_opt (struct webgit_query* query, char* arg)
78 {
79   free (query->skindir);
80   query->skindir = cwa_strndup (arg, SIZE_MAX);
81   return 0;
82 }
83
84
85 static int
86 conf_webskindir_opt (struct webgit_query* query, char* arg)
87 {
88   free (query->webskindir);
89   query->webskindir = cwa_strndup (arg, SIZE_MAX);
90   return 0;
91 }
92
93
94 static int
95 conf_skin_opt (struct webgit_query* query, char* arg)
96 {
97   free (query->skin);
98   query->skin = cwa_strndup (arg, SIZE_MAX);
99   return 0;
100 }
101
102
103 static int
104 conf_maxage_opt (struct webgit_query* query, char* arg)
105 {
106   query->maxage = atol (arg) * 86400UL;
107   return 0;
108 }
109
110
111 static int
112 conf_count_opt (struct webgit_query* query, char* arg)
113 {
114   query->count_def = atoi (arg);
115   return 0;
116 }
117
118
119 int
120 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
121 {
122 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
123   struct cmd_table{
124     char* name;
125     int (*cb)(struct webgit_query* query, char* arg);
126   } cmds[] = {CONF_OPTS {"", NULL}};
127 #undef CONF_OPT
128
129   for (int i = 1; i<argc; ++i)
130     {
131       for (struct cmd_table* j = cmds; j->cb; ++j)
132         {
133           if (!strncmp (j->name, argv[i], strlen (j->name)))
134             {
135               if (j->cb (query, argv[i+1]))
136                 {
137                   html_list_append (error_log,
138                                     html_fmt (
139                                               "Commandline parsing error '%s' '%s'\n",
140                                               argv[i], argv[i+1])
141                                     );
142                   return -1;
143                 }
144               break;
145             }
146         }
147     }
148
149   return 0;
150 }
151
152 int
153 webgit_configfile_dispatch (const char* file, 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   if (!file || *file == '\0')
163     return 0;
164
165   FILE* f = fopen (file, "r");
166   if (!f)
167     {
168       html_list_append (error_log,
169                         html_fmt (
170                                   "Configfile opening error '%s'\n", file)
171                         );
172       return -1;
173     }
174
175   char buf[1024];
176
177   while (fgets(buf, 1024, f))
178     {
179       /* lines beginning with '#' are comments */
180       if (*buf == '#')
181         continue;
182
183       /* strip newline at end */
184       char* m = strchr (buf, '\n');
185       if (m)
186         *m = '\0';
187
188       /* first space char is delimiter */
189       m = strchr (buf, ' ');
190       if (m)
191         *m = '\0';
192       else
193         continue;
194
195       for (struct cmd_table* j = cmds; j->cb; ++j)
196         {
197           if (!strncmp (j->name, buf, strlen (j->name)))
198             {
199               if (j->cb (query, m+1))
200                 {
201                   fclose (f);
202                   html_list_append (error_log,
203                                     html_fmt (
204                                               "Configfile parsing error '%s' '%s'\n",
205                                               buf, m+1)
206                                     );
207                   return -1;
208                 }
209               break;
210             }
211         }
212
213     }
214
215   fclose (f);
216
217   return 0;
218 }
219
220
221 /*
222 //      Local Variables:
223 //      mode: C
224 //      c-file-style: "gnu"
225 //      indent-tabs-mode: nil
226 //      End:
227 */