+ info.default_res = *argv;
+ }
+ if (!(queue = str_queue_mk ()))
+ {
+ gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, KERNEL_LOG, "str_queue_mk");
+ exit (1);
+ }
+ if (info.userid != -1)
+ {
+ read_kernel_res ();
+ kernel_events (queue);
+ }
+ else
+ {
+ char line_buf[512];
+ read_kernel_res ();
+ while (lgets (line_buf, sizeof(line_buf)-1, 0))
+ str_queue_enq (queue, line_buf);
+ urp_start (0, queue);
+ urp_command (queue);
+ urp_end ();
+ }
+ return 0;
+}
+
+struct gw_user_set *user_set_add (const char *name, int hits,
+ const char *database,
+ struct ccl_rpn_node *rpn,
+ int present_flag,
+ const char *search_str)
+{
+ struct gw_user_set *s;
+
+ s = malloc (sizeof (*s));
+ assert (s);
+
+ s->name = gw_strdup (name);
+ s->hits = hits;
+ s->database = gw_strdup (database);
+ s->rpn = rpn;
+ s->present_flag = present_flag;
+ s->search_str = gw_strdup (search_str);
+ s->prev = info.sets;
+ info.sets = s;
+ return s;
+}
+
+void user_set_init (void)
+{
+ struct gw_user_set *s, *s1;
+
+ for (s = info.sets; s; s = s1)
+ {
+ free (s->name);
+ free (s->database);
+ ccl_rpn_delete (s->rpn);
+ s1 = s->prev;
+ free (s);
+ }
+ info.sets = NULL;
+}
+
+struct gw_user_set *user_set_search (const char *name)
+{
+ struct gw_user_set *s;
+
+ if (!name)
+ return info.sets;
+ for (s = info.sets; s; s = s->prev)
+ if (!strcmp (s->name, name))
+ return s;
+ return NULL;
+}
+
+#if USE_FML
+static void fml_inf_write (int ch)
+{
+ putc (ch, reply_fd);
+}
+static FILE *fml_inf;
+
+static int fml_inf_read (void)
+{
+ return getc (fml_inf);
+}
+#endif
+
+void read_kernel_res (void)
+{
+ const char *v;
+ char *cp;
+ char resource_name[256];
+
+ user_set_init ();
+
+ if (info.bibset)
+ ccl_qual_rm (&info.bibset);
+ info.bibset = ccl_qual_mk ();
+
+ if (info.kernel_res)
+ gw_res_close (info.kernel_res);
+ info.kernel_res = gw_res_init ();
+
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "reading kernel resource, default %s",
+ info.default_res);
+ if (*info.target)
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "reading kernel resource, target %s",
+ info.target);
+ if (info.lang)
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "reading kernel resource, lang %s",
+ info.lang);
+
+ /* read default resources. These should exist */
+ if (gw_res_merge (info.kernel_res, info.default_res))
+ {
+ gw_log (GW_LOG_WARN, KERNEL_LOG, "Couldn't read resource file %s",
+ info.default_res);
+ return;
+ }
+ /* fetch target definitions (if defined at all) */
+ if (*info.target)
+ {
+ sprintf (resource_name, "gw.target.%s", info.target);
+ v = gw_res_get (info.kernel_res, resource_name, NULL);
+ if (v)
+ gw_res_merge (info.kernel_res, v);
+ }
+ /* fetch user definitions (if user-id is specified) */
+ if (info.userid >= 0)
+ {
+ char fname[250];
+ sprintf (fname, "user.%d.r", info.userid);
+ gw_res_merge (info.kernel_res, fname);
+ }
+ /* fetch language definitions (if specified at all) */
+ v = gw_res_get (info.kernel_res, "gw.language", info.lang);
+ if (v)
+ {
+ sprintf (resource_name, "gw.lang.%s", v);
+ v = gw_res_get (info.kernel_res, resource_name, NULL);
+ if (v)
+ {
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Reading language resources %s",
+ v);
+ gw_res_merge (info.kernel_res, v);
+ }
+ }
+ /* fetch overriding resources from file (if specified) */
+ if (info.override_res)
+ gw_res_merge (info.kernel_res, info.override_res);
+
+ /* read bibset definition for ccl */
+ v = gw_res_get (info.kernel_res, "gw.bibset", NULL);
+ if (v)
+ {
+ FILE *bib_inf;
+
+ bib_inf = fopen (v, "r");
+ if (!bib_inf)
+ gw_log (GW_LOG_WARN, KERNEL_LOG, "cannot open %s", v);
+ else