Initial import (again)
[srvx.git] / src / expnhelp.c
1 #include "log.h"
2 #include "recdb.h"
3
4 /* because recdb likes to log stuff.. */
5 struct log_type *MAIN_LOG;
6 void log_module(UNUSED_ARG(struct log_type *lt), UNUSED_ARG(enum log_severity ls), const char *format, ...)
7 {
8     va_list va;
9     va_start(va, format);
10     vfprintf(stderr, format, va);
11     va_end(va);
12     fflush(stderr);
13 }
14
15 struct string_list *new_argv;
16 const char *hidden_host_suffix;
17
18 struct cfg_scan {
19     struct cfg_scan *parent;
20     char *path;
21 };
22
23 int
24 scan_db(const char *key, void *data, void *extra)
25 {
26     struct record_data *rd = data;
27     struct cfg_scan child, *self = extra;
28
29     child.parent = extra;
30
31     switch (rd->type) {
32     case RECDB_QSTRING:
33         if ((irccasestr(key, "enable")
34              || (irccasestr(key, "disable"))
35              || (irccasestr(key, "require")))
36             && enabled_string(rd->d.qstring)) {
37             char *new_arg;
38             new_arg = malloc(strlen(self->path)+strlen(key)+4);
39             sprintf(new_arg, "-D%s/%s", self->path, key);
40             string_list_append(new_argv, new_arg);
41         }
42         break;
43     case RECDB_OBJECT:
44         child.path = malloc(strlen(self->path) + strlen(key) + 2);
45         sprintf(child.path, "%s/%s", self->path, key);
46         dict_foreach(rd->d.object, scan_db, &child);
47         free(child.path);
48         break;
49     default: /* ignore */ break;
50     }
51     return 0;
52 }
53
54 int
55 main(int argc, char *argv[])
56 {
57     const char *cfg_file;
58     struct cfg_scan scanner;
59     dict_t cfg_db;
60
61     tools_init();
62     new_argv = alloc_string_list(4);
63     string_list_append(new_argv, strdup("m4"));
64
65     if (argc > 1) {
66         cfg_file = argv[1];
67     } else {
68         cfg_file = "srvx.conf";
69     }
70
71     if (!(cfg_db = parse_database(cfg_file))) {
72         fprintf(stderr, "Unable to parse config file %s; you will get a 'default' expansion.\n", cfg_file);
73     } else {
74         scanner.parent = NULL;
75         scanner.path = "";
76         dict_foreach(cfg_db, scan_db, &scanner);
77     }
78
79     string_list_append(new_argv, NULL);
80     execvp("m4", new_argv->list);
81     fprintf(stderr, "Error in exec: %s (%d)\n", strerror(errno), errno);
82     fprintf(stderr, "Maybe you do not have the 'm4' program installed?\n");
83     return 1;
84 }