factored the single object types out into their own sources
[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
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_count_opt (struct webgit_query* query, char* arg)
68 {
69   query->count_def = atoi (arg);
70   return 0;
71 }
72
73 int
74 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
75 {
76 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
77   struct cmd_table{
78     char* name;
79     int (*cb)(struct webgit_query* query, char* arg);
80   } cmds[] = {CONF_OPTS {"", NULL}};
81 #undef CONF_OPT
82
83   for (int i = 1; i<argc; ++i)
84     {
85       for (struct cmd_table* j = cmds; j->cb; ++j)
86         {
87           if (!strncmp (j->name, argv[i], strlen (j->name)))
88             {
89               if (j->cb (query, argv[i+1]))
90                 {
91                   html_list_append (error_log,
92                                     html_fmt (
93                                               "Commandline parsing error '%s' '%s'\n",
94                                               argv[i], argv[i+1])
95                                     );
96                   return -1;
97                 }
98               break;
99             }
100         }
101     }
102
103   return 0;
104 }
105
106 int
107 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
108 {
109 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
110   struct cmd_table{
111     char* name;
112     int (*cb)(struct webgit_query* query, char* arg);
113   } cmds[] = {CONF_OPTS {"", NULL}};
114 #undef CONF_OPT
115
116   if (!file || *file == '\0')
117     return 0;
118
119   FILE* f = fopen (file, "r");
120   if (!f)
121     {
122       html_list_append (error_log,
123                         html_fmt (
124                                   "Configfile opening error '%s'\n", file)
125                         );
126       return -1;
127     }
128
129   char buf[1024];
130
131   while (fgets(buf, 1024, f))
132     {
133       /* lines beginning with '#' are comments */
134       if (*buf == '#')
135         continue;
136
137       /* strip newline at end */
138       char* m = strchr (buf, '\n');
139       if (m)
140         *m = '\0';
141
142       /* first space char is delimiter */
143       m = strchr (buf, ' ');
144       if (m)
145         *m = '\0';
146       else
147         continue;
148
149       for (struct cmd_table* j = cmds; j->cb; ++j)
150         {
151           if (!strncmp (j->name, buf, strlen (j->name)))
152             {
153               if (j->cb (query, m+1))
154                 {
155                   fclose (f);
156                   html_list_append (error_log,
157                                     html_fmt (
158                                               "Configfile parsing error '%s' '%s'\n",
159                                               buf, m+1)
160                                     );
161                   return -1;
162                 }
163               break;
164             }
165         }
166
167     }
168
169   fclose (f);
170
171   return 0;
172 }
173