X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=kernel%2Furp.c;h=29b0e6251f38fc39d25e8e1c2a2bbc9033295d6c;hb=575bffe2804a7aac433102ee786b9f94ceaf1e27;hp=d047cac515c96195ffa84fd0753cfdee0c762d89;hpb=92d83f4da8146d58af3997cc489514ecd64aca32;p=egate.git diff --git a/kernel/urp.c b/kernel/urp.c index d047cac..29b0e62 100644 --- a/kernel/urp.c +++ b/kernel/urp.c @@ -2,7 +2,16 @@ * Europagate, 1995 * * $Log: urp.c,v $ - * Revision 1.3 1995/02/16 18:35:09 adam + * Revision 1.6 1995/02/17 14:41:14 quinn + * Added simple display of records. + * + * Revision 1.5 1995/02/17 14:22:13 adam + * First steps of CCL show command. Not finished yet. + * + * Revision 1.4 1995/02/17 09:08:36 adam + * Reply with subject. CCL base command implemented. + * + * Revision 1.3 1995/02/16 18:35:09 adam * First use of Zdist library. Search requests are supported. * Present requests are not supported yet. * @@ -22,8 +31,10 @@ #include #include #include +#include #include "kernel.h" +#include #define LINE_MAX 256 @@ -141,15 +152,19 @@ static char *error_no_search (struct error_no_struct *tab, int no) return NULL; } -static int email_header (FILE *inf, char *from_str) +static int email_header (FILE *inf, char *from_str, char *subject_str) { *from_str = '\0'; + *subject_str = '\0'; while (fgets (line_buf, LINE_MAX, inf)) { if (line_buf[0] == '\n') return 0; if (strncmp (line_buf, "From ", 5) == 0) sscanf (line_buf+4, "%s", from_str); + if (strncmp (line_buf, "Subject: ", 9) == 0 && + sscanf (line_buf+9, "%s", subject_str+1) == 1) + strcpy (subject_str, line_buf+9); } return 1; } @@ -201,15 +216,82 @@ static int exec_find (struct ccl_token *list) static int exec_target (struct ccl_token *list) { + int len; if (list->kind == CCL_TOK_EOL) return -1; - memcpy (info.target, list->name, list->len); - info.target [list->len] = '\0'; + len = list->len; + memcpy (info.target, list->name, len); + info.target [len] = '\0'; read_kernel_res (); return reopen_target (); } +static int exec_base (struct ccl_token *list) +{ + struct ccl_token *li = list; + int len = 0; + + if (list->kind == CCL_TOK_EOL) + return -1; + free (info.databases); + while (li->kind != CCL_TOK_EOL) + { + len += li->len + 1; + li = li->next; + if (li->kind == CCL_TOK_COMMA) + li = li->next; + } + info.databases = malloc (len); + assert (info.databases); + len = 0; + li = list; + while (li->kind != CCL_TOK_EOL) + { + memcpy (info.databases+len, li->name, li->len); + len += li->len; + info.databases[len++] = ','; + li = li->next; + if (li->kind == CCL_TOK_COMMA) + li = li->next; + } + info.databases[len-1] = '\0'; + return 0; +} + +static int exec_show (struct ccl_token *list) +{ + const struct zass_presentent *zp; + zass_record *pp; + char num_str[20]; + int num; + + if (list->kind == CCL_TOK_EOL) + return -1; + if (!info.zass) + return -2; + + memcpy (num_str, list->name, list->len); + num_str[list->len] = '\0'; + + num = atoi (num_str); + if (!num) + return -3; + gw_log (GW_LOG_DEBUG, "urp", "zass_present of %d records", num); + zp = zass_present(info.zass, "Default", 1, num); + if (zp) + { + fprintf(reply_fd, "Got %d records\n", zp->num); + for (pp = zp->records; pp; pp = pp->next) + { + Iso2709Rec p = iso2709_cvt(pp->record); + iso2709_display(p, reply_fd); + iso2709_rm(p); + } + } + return 0; +} + static int exec_command (const char *str) { struct ccl_token *cmd = ccl_tokenize (str); @@ -225,10 +307,12 @@ static int exec_command (const char *str) { case 1: return exec_find (cmd->next); - break; + case 2: + return exec_show (cmd->next); + case 3: + return exec_base (cmd->next); case 9: return exec_target (cmd->next); - break; default: fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res, "gw.err.unimplemented", @@ -237,6 +321,7 @@ static int exec_command (const char *str) } else { + fprintf (reply_fd, "\n> %s", str); fprintf (reply_fd, " ^ %s\n", gw_res_get (info.kernel_res, "gw.err.unknown.command", "unknown command")); @@ -247,10 +332,11 @@ static int exec_command (const char *str) int urp (FILE *inf) { char from_str[128]; + char subject_str[128]; int command_no = 0; char *reply_fname = NULL; - if (email_header (inf, from_str)) + if (email_header (inf, from_str, subject_str)) { gw_log (GW_LOG_WARN, "urp", "No message body"); return -1; @@ -269,6 +355,14 @@ int urp (FILE *inf) reply_fname); return -1; } + fprintf (reply_fd, "Subject: "); + if (*subject_str) + fprintf (reply_fd, "Z39.50 Re: %s", subject_str); + else + fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res, + "gw.msg.subject", + "Your Z39.50 Query")); + fprintf (reply_fd, "\n"); } else gw_log (GW_LOG_WARN, "urp", "No From in email header");