X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=kernel%2Fmain.c;h=f1f1694fefb88a82df69c0d0ce0e84d1604303ef;hb=4938d0c2e8f4e1eec397c2bfbbc7e23fd150c369;hp=daa054a71730d2d0e79f24afb0cc3e211ff2eefe;hpb=272f54128f5b48a61b2aa6dbb7859eca1c1296ae;p=egate.git diff --git a/kernel/main.c b/kernel/main.c index daa054a..f1f1694 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -1,8 +1,74 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ /* Gateway kernel - Main * Europagate, 1995 * * $Log: main.c,v $ - * Revision 1.23 1995/05/03 16:34:18 adam + * Revision 1.30 1996/02/12 10:04:54 adam + * The gateway doesn't try to reconnect if it is already known that + * it will fail (connect_fail flag introduced). + * + * Revision 1.29 1995/07/28 10:51:08 adam + * Bug fix: account from previous session had effect when new target command + * was executed. + * + * Revision 1.28 1995/07/03 08:20:15 adam + * More help information and better diagnostics. + * + * Revision 1.27 1995/05/19 13:25:59 adam + * Bug fixes. Better command line options. + * + * Revision 1.26 1995/05/18 12:03:08 adam + * Bug fixes and minor improvements. + * + * Revision 1.25 1995/05/16 09:40:42 adam + * LICENSE. Setting of CCL token names (and/or/not/set) in read_kernel_res. + * + * Revision 1.24 1995/05/04 10:40:07 adam + * More work on Def-settings. + * + * Revision 1.23 1995/05/03 16:34:18 adam * CCL def command, i.e. user definitions - saved as resource files. * * Revision 1.22 1995/05/03 07:37:39 adam @@ -112,6 +178,7 @@ static void kernel_events (struct str_queue *queue) int continuation = 0; int extra_fd; int persist_flag; + int stop_flag = 0; persist_flag = gw_res_bool (info.kernel_res, "gw.persist", 0); timeout = gw_res_int (info.kernel_res, "gw.timeout", 600); @@ -121,7 +188,7 @@ static void kernel_events (struct str_queue *queue) sprintf (fifo_server_name, "fifo.s.%d", info.userid); gip = gips_initialize (fifo_server_name); - gips_open (gip, fifo_client_name); + gips_open (gip, fifo_client_name, 1); gip_fd = gip_infileno (gip); extra_fd = open (fifo_server_name, O_WRONLY); @@ -129,7 +196,10 @@ static void kernel_events (struct str_queue *queue) { FD_ZERO (&set_r); FD_SET (gip_fd, &set_r); - tv.tv_sec = timeout; + if (stop_flag) + tv.tv_sec = 1; + else + tv.tv_sec = timeout; tv.tv_usec = 0; gw_log (GW_LOG_DEBUG, KERNEL_LOG, "IPC select"); @@ -141,8 +211,11 @@ static void kernel_events (struct str_queue *queue) } if (r == 0) { - gw_log (GW_LOG_STAT, KERNEL_LOG, "Timeout after %d seconds", - timeout); + if (stop_flag) + gw_log (GW_LOG_STAT, KERNEL_LOG, "Stopping"); + else + gw_log (GW_LOG_STAT, KERNEL_LOG, "Timeout after %d seconds", + timeout); if (info.zass && persist_flag) save_p_state (info.userid); break; @@ -168,8 +241,14 @@ static void kernel_events (struct str_queue *queue) if (persist_flag && !continuation) load_p_state (info.userid); r = urp_command (queue); - if (persist_flag && r == 1) - del_p_state (info.userid); + if (r == 1) /* stop? */ + { + info.zass = NULL; /* delete association */ + *info.target = 0; /* indicate no target */ + read_kernel_res(); /* reread resources */ + if (persist_flag) + del_p_state (info.userid); /* remove persist file */ + } urp_end (); while (str_queue_deq (queue, 0, 0)) ; @@ -177,21 +256,18 @@ static void kernel_events (struct str_queue *queue) else if (!strcmp (command, "stop")) { gw_log (GW_LOG_DEBUG, KERNEL_LOG, "stop"); - break; + while (lgets (line_buf, sizeof(line_buf)-1, gip_fd)) + ; + break; } else - { gw_log (GW_LOG_WARN, KERNEL_LOG, "Unknown IPC: %s", command); - } continuation = 1; } } close (extra_fd); gips_close (gip); gips_destroy (gip); - - unlink (fifo_client_name); - unlink (fifo_server_name); } int main (int argc, char **argv) @@ -203,6 +279,7 @@ int main (int argc, char **argv) info.override_res = NULL; *info.target = 0; *info.account = 0; + info.account_in_session = 1; info.lang = NULL; info.bibset = NULL; info.zass = NULL; @@ -212,6 +289,7 @@ int main (int argc, char **argv) info.database = NULL; info.setno = -1; info.userid = -1; + info.connect_failed = 0; #if USE_FML info.fml = NULL; #endif @@ -226,8 +304,8 @@ int main (int argc, char **argv) switch (argv[0][1]) { case 'H': - fprintf (stderr, "kernel [option..] [resource]\n"); - fprintf (stderr, "If no resource file is given"); + fprintf (stderr, "kernel [options] [resourceFile]\n"); + fprintf (stderr, "If no resource file is specified"); fprintf (stderr, " default.res is used\n"); fprintf (stderr, "Options:\n"); fprintf (stderr, " -d Enable debugging log\n"); @@ -342,9 +420,11 @@ int main (int argc, char **argv) gw_log (GW_LOG_FATAL, KERNEL_LOG, "missing user id"); exit (1); } + gw_log_session (info.userid); break; default: - gw_log (GW_LOG_FATAL, KERNEL_LOG, "unknown option %s", *argv); + gw_log (GW_LOG_FATAL, KERNEL_LOG, "unknown option %s;" + " use -H for help", *argv); exit (1); } } @@ -438,8 +518,6 @@ static int fml_inf_read (void) void read_kernel_res (void) { - char path_prefix[128]; - char fname[160]; const char *v; char *cp; char resource_name[256]; @@ -470,23 +548,19 @@ void read_kernel_res (void) info.default_res); return; } - strcpy (path_prefix, gw_res_get (info.kernel_res, "gw.path", ".")); - /* 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) - { - sprintf (fname, "%s/%s", path_prefix, v); - gw_res_merge (info.kernel_res, fname); - } + gw_res_merge (info.kernel_res, v); } /* fetch user definitions (if user-id is specified) */ if (info.userid >= 0) { - sprintf (fname, "%s/user.%d.r", path_prefix, info.userid); + char fname[250]; + sprintf (fname, "user.%d.r", info.userid); gw_res_merge (info.kernel_res, fname); } /* fetch language definitions (if specified at all) */ @@ -497,16 +571,14 @@ void read_kernel_res (void) v = gw_res_get (info.kernel_res, resource_name, NULL); if (v) { - sprintf (fname, "%s/%s", path_prefix, v); - gw_res_merge (info.kernel_res, fname); + 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) - { - sprintf (fname, "%s/%s", path_prefix, info.override_res); - gw_res_merge (info.kernel_res, fname); - } + gw_res_merge (info.kernel_res, info.override_res); /* read bibset definition for ccl */ v = gw_res_get (info.kernel_res, "gw.bibset", NULL); @@ -514,13 +586,12 @@ void read_kernel_res (void) { FILE *bib_inf; - sprintf (fname, "%s/%s", path_prefix, v); - bib_inf = fopen (fname, "r"); + bib_inf = fopen (v, "r"); if (!bib_inf) - gw_log (GW_LOG_WARN, KERNEL_LOG, "cannot open %s", fname); + gw_log (GW_LOG_WARN, KERNEL_LOG, "cannot open %s", v); else { - gw_log (GW_LOG_DEBUG, KERNEL_LOG, "reading bib file %s", fname); + gw_log (GW_LOG_DEBUG, KERNEL_LOG, "reading bib file %s", v); ccl_qual_file (info.bibset, bib_inf); fclose (bib_inf); } @@ -552,6 +623,7 @@ void read_kernel_res (void) sizeof(info.hostname)-1); info.port = gw_res_int (info.kernel_res, "gw.portno", 210); strcpy (info.account, gw_res_get (info.kernel_res, "gw.account", "")); + info.account_in_session = 0; } /* set info.databases (all available databases for target) */ /* set info.database (first database for target) */ @@ -591,6 +663,11 @@ void read_kernel_res (void) strncpy (info.hostname, info.override_hostname, sizeof(info.hostname)-1); + ccl_token_and = gw_res_get (info.kernel_res, "ccl.token.and", "and"); + ccl_token_or = gw_res_get (info.kernel_res, "ccl.token.or", "or"); + ccl_token_not = gw_res_get (info.kernel_res, "ccl.token.not", "not"); + ccl_token_set = gw_res_get (info.kernel_res, "ccl.token.set", "set"); + /* determine if more than one result-set names is supported */ if (gw_res_bool (info.kernel_res, "gw.result.set", 1)) info.setno = 0; @@ -600,11 +677,9 @@ void read_kernel_res (void) if (!info.fml) { v = gw_res_get (info.kernel_res, "gw.fml", "default.fml"); - sprintf (fname, "%s/%s", path_prefix, v); - fml_inf = fopen (fname, "r"); + fml_inf = fopen (v, "r"); if (!fml_inf) - gw_log (GW_LOG_WARN, KERNEL_LOG, - "cannot open fml script %s", fname); + gw_log (GW_LOG_WARN, KERNEL_LOG, "cannot open fml script %s", v); else { info.fml = fml_open ();