First work on Z39.50 persistence.
[egate.git] / kernel / urp.c
index 5e2d9b1..032392c 100644 (file)
@@ -1,8 +1,17 @@
-/* Gateway kernel
+/* Gateway kernel - User Request Processor
  * Europagate, 1995
  *
  * $Log: urp.c,v $
- * Revision 1.23  1995/03/28 08:01:28  adam
+ * Revision 1.26  1995/04/19 07:31:12  adam
+ * First work on Z39.50 persistence.
+ *
+ * Revision 1.25  1995/04/17  09:34:33  adam
+ * Timeout (idletime) adjustable. Minor changes in kernel.
+ *
+ * Revision 1.24  1995/03/28  11:42:35  adam
+ * First use of string-queue utility.
+ *
+ * Revision 1.23  1995/03/28  08:01:28  adam
  * FIFO existence is used to test for a running kernel.
  *
  * Revision 1.22  1995/03/27  12:51:05  adam
 #include <unistd.h>
 #include <fcntl.h>
 
+#include <ttyemit.h>
+#include <strqueue.h>
 #include "kernel.h"
 
-#define LINE_MAX 256
+static char line_buf[LINE_MAX+1];
 
 static void put_esc_str (const char *s)
 {
@@ -121,7 +132,7 @@ int lgets (char *buf, int max, int fd)
     return 1;
 }
 
-static int reopen_target (void)
+int reopen_target (void)
 {
     const char *v;
     if (info.zass)
@@ -158,7 +169,6 @@ static int reopen_target (void)
     return 0;
 }
 
-static char line_buf[LINE_MAX+1];
 
 static struct command_word {
     char *default_value;
@@ -249,17 +259,18 @@ static char *error_no_search (struct error_no_struct *tab, int no)
     return NULL;
 }
 
-static int email_header (int fd, char *from_str, char *subject_str)
+static int email_header (struct str_queue *sq,
+                         char *from_str, char *subject_str)
 {
     *from_str = '\0';
-    *subject_str = '\0';
-    while (lgets (line_buf, LINE_MAX, fd))
+    *subject_str = '\0';    
+    while (str_queue_deq (sq, line_buf, LINE_MAX))
     {
         if (line_buf[0] == '\n')
             return 0;
-        if (strncmp (line_buf, "From ", 5) == 0)
+        if (memcmp (line_buf, "From ", 5) == 0)
             sscanf (line_buf+4, "%s", from_str);
-        if (strncmp (line_buf, "Subject: ", 9) == 0 &&
+        if (memcmp (line_buf, "Subject: ", 9) == 0 &&
             sscanf (line_buf+9, "%s", subject_str+1) == 1)
             strcpy (subject_str, line_buf+9);
     }
@@ -314,12 +325,16 @@ static int exec_find (struct ccl_token *list)
 {
     const struct zass_searchent *p;
     struct gw_user_set *us;
+    char setname[32];
 
     struct ccl_rpn_node *rpn;
     int error;
     const char *pos;
 
-    us = user_set_add ("Default", -1);
+    if (info.setno == -1)
+        strcpy (setname, "Default");
+    else
+        sprintf (setname, "%d", info.setno);
     rpn = ccl_find (info.bibset, list, &error, &pos);
     if (!rpn)
     {
@@ -352,9 +367,13 @@ static int exec_find (struct ccl_token *list)
     gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Searching in database %s",
             info.database );
     assert (info.zass);
-    p = zass_search (info.zass, rpn, "Default", info.database );
+    fprintf (reply_fd, "Searching in database %s\n", info.database);
+    p = zass_p_search (info.zass, rpn, setname, info.database, info.sets);
     if (!p)
+    {
+        fprintf (reply_fd, "Search fail\n");
         return -1;
+    }
     if (p->errcode != -1)
     {
         display_diag_error (p->errcode, p->errstring);
@@ -362,7 +381,10 @@ static int exec_find (struct ccl_token *list)
     }
     fprintf (reply_fd, "%d %s\n", p->num,
              gw_res_get (info.kernel_res, "gw.msg.hits", "hit(s)"));
-    us->hits = p->num;
+    us = user_set_add (setname, p->num, info.database, rpn, 1);
+    fprintf (reply_fd, "Result-set %s created\n", setname);
+    if (info.setno >= 0)
+        info.setno++;
     return 0;
 }
 
@@ -434,7 +456,7 @@ static void present (const char *set, int offset, int number,
     gw_log (GW_LOG_DEBUG, KERNEL_LOG, "present in set %s", set);
     gw_log (GW_LOG_DEBUG, KERNEL_LOG, "present of %d records from offset %d",
             number, offset);
-    zp = zass_present(info.zass, (char *) set, offset, number);
+    zp = zass_p_present(info.zass, (char *) set, offset, number);
     if (zp)
     {
         int i;
@@ -729,31 +751,31 @@ static int exec_command (const char *str)
     return 0;
 }
 
-int urp (int fd)
+int urp_start (int continuation, struct str_queue *queue)
 {
-    char from_str[128];
     char subject_str[128];
-    int command_no = 0;
-    char *reply_fname = NULL;
 
-    if (email_header (fd, from_str, subject_str))
+    info.command_no = 0;
+    info.reply_fname = NULL;
+
+    if (email_header (queue, info.from_str, subject_str))
     {
         gw_log (GW_LOG_WARN, KERNEL_LOG, "No message body");
         return -1;
     }
     tty_init (stdout, 40, 70);
-    if (*from_str)
+    if (*info.from_str)
     {
-        reply_fname = tempnam (gw_res_get (info.kernel_res,
+        info.reply_fname = tempnam (gw_res_get (info.kernel_res,
                                            "gw.reply.tmp.dir", NULL),
                                gw_res_get (info.kernel_res,
                                            "gw.reply.tmp.prefix", "gwr"));
                                                  
-        reply_fd = fopen (reply_fname, "w");
+        reply_fd = fopen (info.reply_fname, "w");
         if (!reply_fd)
         {
             gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, KERNEL_LOG, "Cannot create %s",
-                    reply_fname);
+                    info.reply_fname);
             return -1;
         }
         tty_init (reply_fd, 0, 0);
@@ -767,20 +789,33 @@ int urp (int fd)
                                                    "gw.msg.subject",
                                                    "Your Query"));
         fprintf (reply_fd, "\n");
-        gw_log (GW_LOG_ACCT, KERNEL_LOG, "User start %s", from_str);
+        gw_log (GW_LOG_ACCT, KERNEL_LOG, "User start %s", info.from_str);
     }
     else
         gw_log (GW_LOG_WARN, KERNEL_LOG, "No From in email header");
     fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res, "gw.msg.greeting",
                                            "Email->Z39.50 gateway"));
-    while (lgets (line_buf, LINE_MAX, fd))
-    {
-        char *cp;
+    if (continuation)
+        fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res,
+                                              "gw.msg.cont",
+                                              "Continued..."));
+    ccl_token_and = gw_res_get (info.kernel_res, "ccl.token.and", "and");
+    ccl_token_or = gw_res_get (info.kernel_res, "ccl.token.or", "or");
+    ccl_token_not = gw_res_get (info.kernel_res, "ccl.token.not", "not");
+    ccl_token_set = gw_res_get (info.kernel_res, "ccl.token.set", "set");
+    return 0;
+}
+
+int urp_command (struct str_queue *queue)
+{
+    char *cp;
 
+    while (str_queue_deq (queue, line_buf, LINE_MAX))
+    {
         if (line_buf[0] == '\n')
-            if (command_no)
+            if (info.command_no)
            {
-               while (lgets (line_buf, LINE_MAX, fd))
+               while (str_queue_deq (queue, 0, 0))
                    ;
                 break;
            }
@@ -789,41 +824,42 @@ int urp (int fd)
         if ((cp = strchr (line_buf, '\n')))
             *cp = '\0';
         gw_log (GW_LOG_ACCT, KERNEL_LOG, "cmd: %s", line_buf);
-        ccl_token_and = gw_res_get (info.kernel_res, "ccl.token.and", "and");
-        ccl_token_or = gw_res_get (info.kernel_res, "ccl.token.or", "or");
-        ccl_token_not = gw_res_get (info.kernel_res, "ccl.token.not", "not");
-        ccl_token_set = gw_res_get (info.kernel_res, "ccl.token.set", "set");
         if (isalpha (line_buf[0]))
             exec_command (line_buf);
-        command_no++;
+        info.command_no++;
     }
-    if (!command_no)
+    return 0;
+}
+
+void urp_end (void)
+{
+    if (!info.command_no)
     {
-        fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res,
-                                               "gw.err.nullbody",
-                                               "No body"));
+        fprintf (reply_fd, "%s\n", 
+                gw_res_get (info.kernel_res, "gw.err.nullbody", "No body"));
         help_general ();
     }
-    if (*from_str)
+    if (*info.from_str)
     {
         const char *mta;
         char cmd[256];
         int mta_code;
 
-        assert (reply_fname);
+        assert (info.reply_fname);
         fclose (reply_fd);
         reply_fd = stdout;
 
         mta = gw_res_get (info.kernel_res, "gw.reply.mta",
-                          "/usr/lib/sendmail");
-        sprintf (cmd, "%s %s < %s", mta, from_str, reply_fname);
+                         "/usr/lib/sendmail");
+        sprintf (cmd, "%s %s < %s", mta, info.from_str, info.reply_fname);
         
         mta_code = system (cmd);
         if (mta_code)
             gw_log (GW_LOG_FATAL, KERNEL_LOG,
                     "Reply '%s' got exit code %d", cmd, mta_code);
-        unlink (reply_fname);        
-        gw_log (GW_LOG_ACCT, KERNEL_LOG, "User end %s", from_str);
+       else
+            unlink (info.reply_fname);        
+        gw_log (GW_LOG_ACCT, KERNEL_LOG, "User end %s", info.from_str);
     }
-    return 0;
 }
+