first simple rxpd access check
[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 #include "query.h"
24
25 #include <stdlib.h>
26 #include <stdio.h>
27 #include <stdint.h>
28
29 static int
30 conf_query_opt (struct webgit_query* query, char* arg)
31 {
32   (void) query;
33   if (arg)
34     setenv ("QUERY_STRING", arg, 1);
35   else
36     return -1;
37   return 0;
38 }
39
40 static int
41 conf_method_opt (struct webgit_query* query, char* arg)
42 {
43   (void) query;
44   if (arg)
45     setenv ("REQUEST_METHOD", arg, 1);
46   else
47     return -1;
48   return 0;
49 }
50
51 static int
52 conf_repo_opt (struct webgit_query* query, char* arg)
53 {
54   webgit_query_add_repo (query, arg);
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 static int
67 conf_rxpd_opt (struct webgit_query* query, char* arg)
68 {
69   char* delim = strchr (arg, ':');
70
71   free (query->rxpd);
72   query->rxpd = cwa_strndup (arg, SIZE_MAX);
73   return 0;
74 }
75
76
77 static int
78 conf_skindir_opt (struct webgit_query* query, char* arg)
79 {
80   free (query->skindir);
81   query->skindir = cwa_strndup (arg, SIZE_MAX);
82   return 0;
83 }
84
85
86 static int
87 conf_webskindir_opt (struct webgit_query* query, char* arg)
88 {
89   free (query->webskindir);
90   query->webskindir = cwa_strndup (arg, SIZE_MAX);
91   return 0;
92 }
93
94
95 static int
96 conf_skin_opt (struct webgit_query* query, char* arg)
97 {
98   free (query->skin);
99   query->skin = cwa_strndup (arg, SIZE_MAX);
100   return 0;
101 }
102
103
104 static int
105 conf_count_opt (struct webgit_query* query, char* arg)
106 {
107   query->count_def = atoi (arg);
108   return 0;
109 }
110
111 int
112 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
113 {
114 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
115   struct cmd_table{
116     char* name;
117     int (*cb)(struct webgit_query* query, char* arg);
118   } cmds[] = {CONF_OPTS {"", NULL}};
119 #undef CONF_OPT
120
121   for (int i = 1; i<argc; ++i)
122     {
123       for (struct cmd_table* j = cmds; j->cb; ++j)
124         {
125           if (!strncmp (j->name, argv[i], strlen (j->name)))
126             {
127               if (j->cb (query, argv[i+1]))
128                 {
129                   html_list_append (error_log,
130                                     html_fmt (
131                                               "Commandline parsing error '%s' '%s'\n",
132                                               argv[i], argv[i+1])
133                                     );
134                   return -1;
135                 }
136               break;
137             }
138         }
139     }
140
141   return 0;
142 }
143
144 int
145 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
146 {
147 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
148   struct cmd_table{
149     char* name;
150     int (*cb)(struct webgit_query* query, char* arg);
151   } cmds[] = {CONF_OPTS {"", NULL}};
152 #undef CONF_OPT
153
154   if (!file || *file == '\0')
155     return 0;
156
157   FILE* f = fopen (file, "r");
158   if (!f)
159     {
160       html_list_append (error_log,
161                         html_fmt (
162                                   "Configfile opening error '%s'\n", file)
163                         );
164       return -1;
165     }
166
167   char buf[1024];
168
169   while (fgets(buf, 1024, f))
170     {
171       /* lines beginning with '#' are comments */
172       if (*buf == '#')
173         continue;
174
175       /* strip newline at end */
176       char* m = strchr (buf, '\n');
177       if (m)
178         *m = '\0';
179
180       /* first space char is delimiter */
181       m = strchr (buf, ' ');
182       if (m)
183         *m = '\0';
184       else
185         continue;
186
187       for (struct cmd_table* j = cmds; j->cb; ++j)
188         {
189           if (!strncmp (j->name, buf, strlen (j->name)))
190             {
191               if (j->cb (query, m+1))
192                 {
193                   fclose (f);
194                   html_list_append (error_log,
195                                     html_fmt (
196                                               "Configfile parsing error '%s' '%s'\n",
197                                               buf, m+1)
198                                     );
199                   return -1;
200                 }
201               break;
202             }
203         }
204
205     }
206
207   fclose (f);
208
209   return 0;
210 }
211
212
213 /*
214 //      Local Variables:
215 //      mode: C
216 //      c-file-style: "gnu"
217 //      indent-tabs-mode: nil
218 //      End:
219 */