Reply with subject. CCL base command implemented.
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 17 Feb 1995 09:08:35 +0000 (09:08 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 17 Feb 1995 09:08:35 +0000 (09:08 +0000)
kernel/Makefile
kernel/default.res
kernel/urp.c

index d2e74af..a0110ed 100644 (file)
@@ -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
index 20c06d6..7e79300 100644 (file)
@@ -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
index d047cac..ddbec97 100644 (file)
@@ -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 <assert.h>
 #include <ctype.h>
 #include <string.h>
+#include <unistd.h>
 
 #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");