Reply with subject. CCL base command implemented.
[egate.git] / kernel / urp.c
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");