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