dbcbc89d02da4c22b4ea036e307c61d180d31c13
[egate.git] / kernel / main.c
1 /* Gateway kernel
2  * Europagate, 1995
3  *
4  * $Log: main.c,v $
5  * Revision 1.2  1995/02/16 13:21:00  adam
6  * Organization of resource files for targets and conversion
7  * language implemented.
8  *
9  * Revision 1.1  1995/02/15  17:45:29  adam
10  * First version of email gateway kernel. Email requests are read
11  * from stdin. The output is transferred to an MTA if 'From' is
12  * found in the header - or stdout if absent. No Z39.50 client is used.
13  *
14  */
15
16 #include <stdio.h>
17 #include <stdlib.h>
18
19 #include "kernel.h"
20
21 GwRes kernel_res = NULL;
22 const char *default_res = "default.res";
23 const char *target = NULL;
24 const char *lang = NULL;
25 CCL_bibset bibset = NULL;
26
27 FILE *reply_fd = stdout;
28
29 int main (int argc, char **argv)
30 {
31     gw_log_init (*argv);
32     kernel_res = gw_res_init ();
33     while (--argc > 0)
34     {
35         if (**++argv == '-')
36         {
37             switch (argv[0][1])
38             {
39             case 'd':
40                 gw_log_level (GW_LOG_ALL);
41                 break;
42             case 't':
43                 if (argv[0][2])
44                     target = argv[0]+2;
45                 else if (argc > 0)
46                 {
47                     --argc;
48                     target= *++argv;
49                 }
50                 else
51                 {
52                     gw_log (GW_LOG_FATAL, "main", "missing target name");
53                     exit (1);
54                 }
55                 break;
56             case 'l':
57                 if (argv[0][2])
58                     lang = argv[0]+2;
59                 else if (argc > 0)
60                 {
61                     --argc;
62                     lang = *++argv;
63                 }
64                 else
65                 {
66                     gw_log (GW_LOG_FATAL, "main", "missing language name");
67                     exit (1);
68                 }
69                 break;
70             default:
71                 gw_log (GW_LOG_FATAL, "main", "unknown option %s", *argv);
72                 exit (1);
73             }
74         }
75         else
76             default_res = *argv;
77     }
78     read_kernel_res ();
79     urp (stdin);
80     return 0;
81 }
82
83 void read_kernel_res (void)
84 {
85     char path_prefix[128];
86     char fname[160];
87     const char *v;
88     char resource_name[256];
89
90     bibset = ccl_qual_mk ();
91
92     gw_log (GW_LOG_DEBUG, "main", "reading kernel resource, default %s",
93             default_res);
94     if (target)
95         gw_log (GW_LOG_DEBUG, "main", "reading kernel resource, target %s",
96                 target);
97     if (lang)
98         gw_log (GW_LOG_DEBUG, "main", "reading kernel resource, lang %s",
99                 lang);
100     if (kernel_res)
101         gw_res_close (kernel_res);
102     kernel_res = gw_res_init ();
103     if (gw_res_merge (kernel_res, default_res))
104     {
105         gw_log (GW_LOG_WARN, "main", "Couldn't read resource file %s",
106                 default_res);
107         return;
108     }
109     strcpy (path_prefix, gw_res_get (kernel_res, "gw.path", "."));
110     
111     if (target)
112     {
113         sprintf (resource_name, "gw.target.%s", target);
114         v = gw_res_get (kernel_res, resource_name, NULL);
115         if (v)
116         {
117             sprintf (fname, "%s/%s", path_prefix, v);
118             gw_res_merge (kernel_res, fname);
119         }
120     }    
121     if (lang)
122     {
123         sprintf (resource_name, "gw.lang.%s", lang);
124         v = gw_res_get (kernel_res, resource_name, NULL);
125         if (v)
126         {
127             sprintf (fname, "%s/%s", path_prefix, v);
128             gw_res_merge (kernel_res, fname);
129         }
130     }
131     v = gw_res_get (kernel_res, "gw.bibset", NULL);
132     if (v)
133     {
134         FILE *bib_inf;
135
136         sprintf (fname, "%s/%s", path_prefix, v);
137         bib_inf = fopen (fname, "r");
138         if (!bib_inf)
139             gw_log (GW_LOG_WARN, "main", "cannot open %s", fname);
140         else
141         {
142             gw_log (GW_LOG_DEBUG, "main", "reading bib file %s", fname);
143             ccl_qual_file (bibset, bib_inf);
144             fclose (bib_inf);
145         }
146     }
147 }