From 0886ad03a73988611a1d7c8bb7b65cc00dae89cf Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 17 Feb 1995 09:08:35 +0000 Subject: [PATCH] Reply with subject. CCL base command implemented. --- kernel/Makefile | 7 ++++-- kernel/default.res | 4 ++-- kernel/urp.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/kernel/Makefile b/kernel/Makefile index d2e74af..a0110ed 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -2,7 +2,10 @@ # Europagate, 1995 # # $Log: Makefile,v $ -# Revision 1.2 1995/02/16 18:35:07 adam +# Revision 1.3 1995/02/17 09:08:35 adam +# Reply with subject. CCL base command implemented. +# +# Revision 1.2 1995/02/16 18:35:07 adam # First use of Zdist library. Search requests are supported. # Present requests are not supported yet. # @@ -14,7 +17,7 @@ # SHELL=/bin/sh INCLUDE=-I../include -CFLAGS=-g -Wall -pedantic -ansi +CFLAGS=-g -Wall #CC=gcc TPROG1=kernel O=main.o urp.o diff --git a/kernel/default.res b/kernel/default.res index 20c06d6..7e79300 100644 --- a/kernel/default.res +++ b/kernel/default.res @@ -1,5 +1,5 @@ # Email gateway - general kernel resources -# $Id: default.res,v 1.3 1995/02/16 18:35:08 adam Exp $ +# $Id: default.res,v 1.4 1995/02/17 09:08:36 adam Exp $ # # Important directories, programs, etc. gw.reply.mta: /usr/bin/smail @@ -18,7 +18,7 @@ gw.databases: Default gw.lang.dk: lang.dk.res # Messages -gw.msg.subject: Your gateway query +gw.msg.subject: Your Z39.50 Query... gw.msg.greeting: Europagate email-Z39.50 gateway gw.err.nullbody: Empty body ccl.command.find: find f diff --git a/kernel/urp.c b/kernel/urp.c index d047cac..ddbec97 100644 --- a/kernel/urp.c +++ b/kernel/urp.c @@ -2,7 +2,10 @@ * Europagate, 1995 * * $Log: urp.c,v $ - * Revision 1.3 1995/02/16 18:35:09 adam + * 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,6 +25,7 @@ #include #include #include +#include #include "kernel.h" @@ -141,15 +145,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 +209,49 @@ 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_command (const char *str) { struct ccl_token *cmd = ccl_tokenize (str); @@ -225,10 +267,10 @@ static int exec_command (const char *str) { case 1: return exec_find (cmd->next); - break; + 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", @@ -247,10 +289,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 +312,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"); -- 1.7.10.4