X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=kernel%2Furp.c;h=914e279b3cc971c9e2162d771cb17a5213c7217f;hb=7f332a840baf336e34d612cdee0ef27901f0dd11;hp=313d7e63f864ddcdbada8045c523ddd3b78b0e1b;hpb=2cbcbd42c8fafaa3e382279bcbdbb5b4d56aa3cd;p=egate.git diff --git a/kernel/urp.c b/kernel/urp.c index 313d7e6..914e279 100644 --- a/kernel/urp.c +++ b/kernel/urp.c @@ -45,7 +45,34 @@ * Europagate, 1995 * * $Log: urp.c,v $ - * Revision 1.43 1995/07/11 11:49:13 adam + * Revision 1.51 2001/02/26 14:32:36 adam + * Updated for YAZ 1.7. HTML output tidy up. Added LOC target. + * + * Revision 1.50 1996/03/01 16:09:30 adam + * New setting: gw.msg.replyto that sets Reply-To in user response. + * + * Revision 1.49 1996/03/01 14:25:28 adam + * Email gateway obeys 'Reply-To:' in header. + * + * Revision 1.48 1996/02/12 10:04:57 adam + * The gateway doesn't try to reconnect if it is already known that + * it will fail (connect_fail flag introduced). + * + * Revision 1.47 1996/01/18 13:54:48 adam + * Help gives help information about individual commands. + * Status without arguments gives list of available predefined targets. + * + * Revision 1.46 1995/07/28 10:51:09 adam + * Bug fix: account from previous session had effect when new target command + * was executed. + * + * Revision 1.45 1995/07/20 08:20:24 adam + * Minor changes. + * + * Revision 1.44 1995/07/11 12:28:53 adam + * New functions ccl_token_simple and ccl_token_del used. + * + * Revision 1.43 1995/07/11 11:49:13 adam * LINE_MAX renamed to STR_LINE_MAX. * * Revision 1.42 1995/07/03 12:59:29 adam @@ -236,6 +263,7 @@ int reopen_target (void) gw_res_get (info.kernel_res, "gw.err.connect", "Cannot connect to target"), info.hostname, info.port); + info.connect_failed = 1; return -1; } v = gw_res_get (info.kernel_res, "gw.description", NULL); @@ -270,14 +298,13 @@ struct command_word { char *resource_suffix; }; -static int command_search (struct command_word *tab, struct ccl_token *cmd, -const char *resource_prefix) +static int command_search_str (struct command_word *tab, const char *cmd_name, + int cmd_len, const char *resource_prefix) { int no = 1; assert (resource_prefix); assert (tab); - assert (cmd); while (tab->default_value) { char *cp, command_names[60]; @@ -296,8 +323,8 @@ const char *resource_prefix) if ((split = strchr (cp, ' '))) *split = '\0'; - if (cmd->len == strlen(cp) && - !memcmp (cmd->name, cp, cmd->len)) + if (cmd_len == strlen(cp) && + !memcmp (cmd_name, cp, cmd_len)) return no; if (!split) break; @@ -309,6 +336,12 @@ const char *resource_prefix) return 0; } +static int command_search (struct command_word *tab, struct ccl_token *cmd, + const char *resource_prefix) +{ + return command_search_str (tab, cmd->name, cmd->len, resource_prefix); +} + static struct error_no_struct { int no; char *resource_name; @@ -352,6 +385,8 @@ static int email_header (struct str_queue *sq, return 0; if (memcmp (line_buf, "From ", 5) == 0) sscanf (line_buf+4, "%s", from_str); + if (memcmp (line_buf, "Reply-To: ", 10) == 0) + sscanf (line_buf+10, "%s", from_str); if (memcmp (line_buf, "Subject: ", 9) == 0 && sscanf (line_buf+9, "%s", subject_str+1) == 1) strcpy (subject_str, line_buf+9); @@ -365,33 +400,83 @@ static void help_general (void) "Commands available in this service:\n")); } +static struct command_word command_tab [] = +{ +{ "find", "find"}, +{ "show", "show"}, +{ "base", "base" }, +{ "help", "help" }, +{ "info", "info" }, +{ "continue", "continue" }, +{ "status", "status" }, +{ "stop", "stop" }, +{ "target", "target" }, +{ "def", "def" }, +{ "account", "account" }, +{ NULL, NULL } +}; + + static int exec_help (struct ccl_token *list) { + int no = 0; static char *sep = "-------------------------------\\n"; - help_general (); + if (list->kind != CCL_TOK_EOL) + no = command_search_str (command_tab, list->name, list->len, + "ccl.command."); + if (!no) + help_general (); - put_esc_str (sep); - put_esc_str (gw_res_get (info.kernel_res, "gw.help.target", - "target - selects a given target\n")); + if (!no || no == 9) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.target", + "target - selects a given target\n")); + } - put_esc_str (sep); - put_esc_str (gw_res_get (info.kernel_res, "gw.help.base", + if (!no || no == 3) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.base", "base .. - selects databases\n")); + } + + if (!no || no == 1) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.find", + "find - performs a search\n")); + } + + if (!no || no == 2) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.show", + "show - retrieves and displays " + "records\n")); + } + + if (!no || no == 10) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.def", + "def user definitons\n")); + } + + if (!no || no == 11) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.account", + "account sets authentication\n")); + } + + if (!no || no == 7) + { + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.status", + "status status information\n")); + } - put_esc_str (sep); - put_esc_str (gw_res_get (info.kernel_res, "gw.help.find", - "find - performs a search request\n")); - - put_esc_str (sep); - put_esc_str (gw_res_get (info.kernel_res, "gw.help.show", - "show - retrieves and displays " - "records\n")); - put_esc_str (sep); - put_esc_str (gw_res_get (info.kernel_res, "gw.help.def", - "def sets/gets definitons\n")); - put_esc_str (sep); - put_esc_str (gw_res_get (info.kernel_res, "gw.help.account", - "account sets authentication string\n")); return 0; } @@ -501,6 +586,39 @@ static int exec_account (struct ccl_token *list) } else *info.account = '\0'; + info.account_in_session = 1; + return 0; +} + +void handle_target_list (const char *name, const char *value) +{ + GwRes res; + const char *p; + + if (strlen(name) < 10) + return; + if (memcmp (name, "gw.target.", 10)) + return; + fprintf (reply_fd, "%s\n", name+10); + res = gw_res_init (); + gw_res_merge (res, value); + p = gw_res_get (res, "gw.description", NULL); + if (p) + { + put_esc_str (p); + put_esc_str ("\\n"); + } + p = gw_res_get (res, "gw.databases", NULL); + if (p) + fprintf (reply_fd, " Databases: %s\n", p); + fprintf (reply_fd, "\n"); + gw_res_close (res); +} + +static int exec_target_list (void) +{ + gw_res_trav (info.kernel_res, NULL, handle_target_list); + fprintf (reply_fd, "\n"); return 0; } @@ -508,12 +626,16 @@ static int exec_target (struct ccl_token *list) { int len; if (list->kind == CCL_TOK_EOL) - return -1; + return exec_target_list (); len = list->len; memcpy (info.target, list->name, len); info.target [len] = '\0'; - + + if (!info.account_in_session) + *info.account = '\0'; + info.account_in_session = 0; read_kernel_res (); + info.connect_failed = 0; return reopen_target (); } @@ -628,40 +750,45 @@ static void present (const char *set, int offset, int number, continue; } } - if (record_log_fd != -1) - write (record_log_fd, pp->record, strlen(pp->record)); - rec = iso2709_cvt (pp->record); - if (rec) - { + if (pp->record) + { + if (record_log_fd != -1) + write (record_log_fd, pp->record, strlen(pp->record)); + rec = iso2709_cvt (pp->record); + if (rec) + { #if USE_FML - strcpy (format_str, - gw_res_get (info.kernel_res, - "gw.display.format", "")); - if (format_token) - { - len = format_token->len; - if (len >= sizeof(format_str)) - len = sizeof(format_str)-1; - memcpy (format_str, format_token->name, len); - format_str[len] = '\0'; - } - if (info.fml && *format_str && - (!strcmp (format_str, "0") || !strcmp (format_str, "1") - || !strcmp(format_str, "2"))) - { - arg_ar[0] = "\\f"; - arg_ar[1] = format_str; - arg_ar[2] = " \\list"; - arg_ar[3] = marc_to_str (info.fml, rec); - arg_ar[4] = NULL; - fml_exec_call_argv (info.fml, arg_ar); - } - else - iso2709_display (rec, reply_fd); + strcpy (format_str, + gw_res_get (info.kernel_res, + "gw.display.format", "")); + if (format_token) + { + len = format_token->len; + if (len >= sizeof(format_str)) + len = sizeof(format_str)-1; + memcpy (format_str, format_token->name, len); + format_str[len] = '\0'; + } + if (info.fml && *format_str && + (!strcmp (format_str, "0") || !strcmp (format_str, "1") + || !strcmp(format_str, "2"))) + { + arg_ar[0] = "\\f"; + arg_ar[1] = format_str; + arg_ar[2] = " \\list"; + arg_ar[3] = marc_to_str (info.fml, rec); + arg_ar[4] = NULL; + fml_exec_call_argv (info.fml, arg_ar); + } + else + iso2709_display (rec, reply_fd); #else - iso2709_display (rec, reply_fd); + iso2709_display (rec, reply_fd); #endif - iso2709_rm (rec); + iso2709_rm (rec); + } + else + fprintf (reply_fd, "Record type not supported\n"); } else fprintf (reply_fd, "Not a MARC record\n"); @@ -964,35 +1091,24 @@ static int exec_def (struct ccl_token *list) */ static int exec_command (const char *str, int *stop_flag) { - static struct command_word command_tab [] = - { - { "find", "find"}, - { "show", "show"}, - { "base", "base" }, - { "help", "help" }, - { "info", "info" }, - { "continue", "continue" }, - { "status", "status" }, - { "stop", "stop" }, - { "target", "target" }, - { "def", "def" }, - { "account", "account" }, - { NULL, NULL } - }; - - struct ccl_token *cmd = ccl_tokenize (str); + struct ccl_token *cmd; + const char *cp = str; int no; + while (*cp && *cp != ' ' && *cp != '\n' && *cp != '\t' && *cp != '\r') + cp++; + *stop_flag = 0; - if (cmd->kind != CCL_TOK_EOL && - (no = command_search (command_tab, cmd, "ccl.command."))) + no = command_search_str (command_tab, str, cp-str, "ccl.command."); + if (no) { if (no == 1 || no == 2 || no == 3) /* find/show/base? */ { - if (!info.zass) /* open if not already opened */ + if (!info.connect_failed && !info.zass) + /* open if not already opened */ reopen_target (); fprintf (reply_fd, "\n> %s\n", str); - if (!info.zass) /* fail? */ + if (!info.zass) /* fail? */ { fprintf (reply_fd, "\n%s\n", gw_res_get (info.kernel_res, "gw.err.no.target", @@ -1005,33 +1121,50 @@ static int exec_command (const char *str, int *stop_flag) fprintf (reply_fd, "\n> %s\n", str); switch (no) { - case 1: - return exec_find (cmd->next, str); - case 2: - return exec_show (cmd->next); - case 3: - return exec_base (cmd->next); - case 4: - return exec_help (cmd->next); + case 1: /* find */ + cmd = ccl_tokenize (cp); + exec_find (cmd, str); + break; + case 2: /* show */ + cmd = ccl_tokenize (cp); + exec_show (cmd); + break; + case 3: /* base */ + cmd = ccl_token_simple (cp); + exec_base (cmd); + break; + case 4: /* help */ + cmd = ccl_token_simple (cp); + exec_help (cmd); + break; case 6: /* continue */ *stop_flag = 2; return 0; case 7: /* status */ - return exec_status (cmd->next); + exec_status (cmd); + return 0; case 8: /* stop */ *stop_flag = 1; return 0; case 9: /* target */ - return exec_target (cmd->next); + cmd = ccl_token_simple (cp); + exec_target (cmd); + break; case 10: /* def */ - return exec_def (cmd->next); - case 11: - return exec_account (cmd->next); + cmd = ccl_token_simple (cp); + exec_def (cmd); + break; + case 11: /* account */ + cmd = ccl_token_simple (cp); + exec_account (cmd); + break; default: + cmd = NULL; fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res, "gw.err.unimplemented", "Not implemented yet")); } + ccl_token_del (cmd); } else { @@ -1047,6 +1180,7 @@ static int exec_command (const char *str, int *stop_flag) int urp_start (int continuation, struct str_queue *queue) { char subject_str[128]; + const char *cp; info.command_no = 0; info.reply_fname = NULL; @@ -1073,7 +1207,11 @@ int urp_start (int continuation, struct str_queue *queue) } tty_init (reply_fd, 0, 0); fprintf (reply_fd, "From: %s\n", - gw_res_get (info.kernel_res, "gw.msg.from","Email-gateway")); + gw_res_get (info.kernel_res, "gw.msg.from", + "Email-Z39.50 gateway")); + cp = gw_res_get (info.kernel_res, "gw.msg.replyto", NULL); + if (cp) + fprintf (reply_fd, "Reply-To: %s\n", cp); fprintf (reply_fd, "Subject: "); if (*subject_str) fprintf (reply_fd, "Z39.50 Re: %s", subject_str);