add stylesheet and rxpd option / config
[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_stylesheet_opt (struct webgit_query* query, char* arg)
60 {
61   query->stylesheet = cwa_strndup (arg, SIZE_MAX);
62   return 0;
63 }
64
65 static int
66 conf_conf_opt (struct webgit_query* query, char* arg)
67 {
68   (void) query;
69   setenv ("WEBGIT_CONFIG", arg, 1);
70   return 0;
71 }
72
73 static int
74 conf_rxpd_opt (struct webgit_query* query, char* arg)
75 {
76   char* delim = strchr (arg, ':');
77
78   if (delim)
79     {
80       query->rxpd_name = cwa_strndup (arg, delim-arg-1);
81       query->rxpd_port = atoi (delim+1);
82     }
83   else if (strchr (arg, '/'))
84     {
85       query->rxpd_name = cwa_strndup (arg, SIZE_MAX);
86       query->rxpd_port = 0;
87       return -1; /* rxpd doesnt yet support unix domain sockets */
88     }
89   else
90     {
91       return -1;
92     }
93
94   return 0;
95 }
96
97 static int
98 conf_count_opt (struct webgit_query* query, char* arg)
99 {
100   query->count_def = atoi (arg);
101   return 0;
102 }
103
104 int
105 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
106 {
107 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
108   struct cmd_table{
109     char* name;
110     int (*cb)(struct webgit_query* query, char* arg);
111   } cmds[] = {CONF_OPTS {"", NULL}};
112 #undef CONF_OPT
113
114   for (int i = 1; i<argc; ++i)
115     {
116       for (struct cmd_table* j = cmds; j->cb; ++j)
117         {
118           if (!strncmp (j->name, argv[i], strlen (j->name)))
119             {
120               if (j->cb (query, argv[i+1]))
121                 {
122                   html_list_append (error_log,
123                                     html_fmt (
124                                               "Commandline parsing error '%s' '%s'\n",
125                                               argv[i], argv[i+1])
126                                     );
127                   return -1;
128                 }
129               break;
130             }
131         }
132     }
133
134   return 0;
135 }
136
137 int
138 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
139 {
140 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
141   struct cmd_table{
142     char* name;
143     int (*cb)(struct webgit_query* query, char* arg);
144   } cmds[] = {CONF_OPTS {"", NULL}};
145 #undef CONF_OPT
146
147   if (!file || *file == '\0')
148     return 0;
149
150   FILE* f = fopen (file, "r");
151   if (!f)
152     {
153       html_list_append (error_log,
154                         html_fmt (
155                                   "Configfile opening error '%s'\n", file)
156                         );
157       return -1;
158     }
159
160   char buf[1024];
161
162   while (fgets(buf, 1024, f))
163     {
164       /* lines beginning with '#' are comments */
165       if (*buf == '#')
166         continue;
167
168       /* strip newline at end */
169       char* m = strchr (buf, '\n');
170       if (m)
171         *m = '\0';
172
173       /* first space char is delimiter */
174       m = strchr (buf, ' ');
175       if (m)
176         *m = '\0';
177       else
178         continue;
179
180       for (struct cmd_table* j = cmds; j->cb; ++j)
181         {
182           if (!strncmp (j->name, buf, strlen (j->name)))
183             {
184               if (j->cb (query, m+1))
185                 {
186                   fclose (f);
187                   html_list_append (error_log,
188                                     html_fmt (
189                                               "Configfile parsing error '%s' '%s'\n",
190                                               buf, m+1)
191                                     );
192                   return -1;
193                 }
194               break;
195             }
196         }
197
198     }
199
200   fclose (f);
201
202   return 0;
203 }
204