First use of string-queue utility.
[egate.git] / kernel / urp.c
index 6816906..1197a6c 100644 (file)
@@ -2,7 +2,23 @@
  * Europagate, 1995
  *
  * $Log: urp.c,v $
- * Revision 1.19  1995/03/02 09:32:11  adam
+ * 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
+ * New log level in use: GW_LOG_ERRNO.
+ *
+ * Revision 1.21  1995/03/27  08:24:04  adam
+ * First use of gip interface and gw-db.
+ * First work on eti program.
+ *
+ * Revision 1.20  1995/03/03  17:19:17  adam
+ * Smarter presentation. Bug fix in email header interpretation.
+ *
+ * Revision 1.19  1995/03/02  09:32:11  adam
  * New presentation formats. f0=full, f1=brief, f2=mid
  *
  * Revision 1.18  1995/03/01  14:32:26  adam
 #include <unistd.h>
 #include <fcntl.h>
 
+#include <strqueue.h>
 #include "kernel.h"
 
-#define LINE_MAX 256
+#define LINE_MAX 1024
+static char line_buf[LINE_MAX+1];
 
 static void put_esc_str (const char *s)
 {
-    int escape_flag = 0;
     while (*s)
+        tty_emit (*s++);
+}
+
+int lgets (char *buf, int max, int fd)
+{
+    int r, no = 0;
+
+    --max;
+    while (no <= max)
     {
-        if (*s == '\\' && s[1])
-        {
-            switch (*++s)
-            {
-            case 'n':
-                fputc ('\n', reply_fd);
-                break;
-            case 't':
-                fputc ('\t', reply_fd);
-                break;
-            default:
-                fputc (*s, reply_fd);
-                break;
-            }
-            escape_flag = 1;
-        }
-        else
-        {
-            if (*s != ' ' || !escape_flag)
-                fputc (*s, reply_fd);
-            escape_flag = 0;
-        }
-        s++;
+        if ((r=read (fd, buf+no, 1)) != 1)
+       {
+           if (r == -1)
+               gw_log (GW_LOG_WARN|GW_LOG_ERRNO, KERNEL_LOG, "read fail");
+           buf[no] = '\0';
+           return 0;
+       }
+       if (buf[no] == 1)
+            return 0;    
+       if (buf[no++] == '\n')
+           break;
     }
+    buf[no] = '\0';    
+    return 1;
 }
 
 static int reopen_target (void)
@@ -147,7 +163,6 @@ static int reopen_target (void)
     return 0;
 }
 
-static char line_buf[LINE_MAX+1];
 
 static struct command_word {
     char *default_value;
@@ -163,6 +178,7 @@ static struct command_word {
 {   "status", "status" },
 {   "cancel", "cancel" },
 {   "target", "target" },
+{   "stop",   "stop" },
 {   NULL, NULL }
 };
 
@@ -237,17 +253,18 @@ static char *error_no_search (struct error_no_struct *tab, int no)
     return NULL;
 }
 
-static int email_header (FILE *inf, 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 (fgets (line_buf, LINE_MAX, inf))
+    *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);
     }
@@ -262,23 +279,26 @@ static void help_general (void)
 
 static int exec_help (struct ccl_token *list)
 {
+    static char *sep = "-------------------------------\\n";
     help_general ();
 
-#if 0
+#if 1
+    put_esc_str (sep);
     put_esc_str (gw_res_get (info.kernel_res, "gw.help.target",
                              "target <name> - selects a given target\n"));
 
+    put_esc_str (sep);
     put_esc_str (gw_res_get (info.kernel_res, "gw.help.base",
                              "base <base>..  - selects databases\n"));
 
+    put_esc_str (sep);
     put_esc_str (gw_res_get (info.kernel_res, "gw.help.find",
                              "find <query>   - performs a search request\n"));
 
+    put_esc_str (sep);
     put_esc_str (gw_res_get (info.kernel_res, "gw.help.show",
                              "show <spec>    - retrieves and displays "
                              "records\n"));
-    put_esc_str (gw_res_get (info.kernel_res, "gw.help.help",
-                             "help           - displays help\n"));
 #endif
     return 0;
 }
@@ -437,7 +457,7 @@ static void present (const char *set, int offset, int number,
                      record_log_name );
             record_log_fd = open (path, O_WRONLY|O_CREAT|O_APPEND, 0666);
             if (record_log_fd == -1)
-                gw_log (GW_LOG_WARN, "Cannot open %s", path);
+                gw_log (GW_LOG_WARN|GW_LOG_ERRNO, "Cannot open %s", path);
         }
         fprintf (reply_fd, gw_res_get (info.kernel_res,
                                        "gw.msg.records",
@@ -714,18 +734,20 @@ static int exec_command (const char *str)
     return 0;
 }
 
-int urp (FILE *inf)
+int urp (struct str_queue *queue)
 {
     char from_str[128];
     char subject_str[128];
     int command_no = 0;
     char *reply_fname = NULL;
+    char *cp;
 
-    if (email_header (inf, from_str, subject_str))
+    if (email_header (queue, from_str, subject_str))
     {
         gw_log (GW_LOG_WARN, KERNEL_LOG, "No message body");
         return -1;
     }
+    tty_init (stdout, 40, 70);
     if (*from_str)
     {
         reply_fname = tempnam (gw_res_get (info.kernel_res,
@@ -736,10 +758,11 @@ int urp (FILE *inf)
         reply_fd = fopen (reply_fname, "w");
         if (!reply_fd)
         {
-            gw_log (GW_LOG_FATAL, KERNEL_LOG, "Cannot create %s",
+            gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, KERNEL_LOG, "Cannot create %s",
                     reply_fname);
             return -1;
         }
+        tty_init (reply_fd, 0, 0);
         fprintf (reply_fd, "From: %s\n",
                  gw_res_get (info.kernel_res, "gw.msg.from","Email-gateway"));
         fprintf (reply_fd, "Subject: ");
@@ -756,12 +779,17 @@ int urp (FILE *inf)
         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 (fgets (line_buf, LINE_MAX, inf))
+    while (str_queue_deq (queue, line_buf, LINE_MAX))
     {
-        char *cp;
-
         if (line_buf[0] == '\n')
-            break;
+            if (command_no)
+           {
+               while (str_queue_deq (queue, 0, 0))
+                   ;
+                break;
+           }
+            else 
+                continue;
         if ((cp = strchr (line_buf, '\n')))
             *cp = '\0';
         gw_log (GW_LOG_ACCT, KERNEL_LOG, "cmd: %s", line_buf);
@@ -796,8 +824,8 @@ int urp (FILE *inf)
         
         mta_code = system (cmd);
         if (mta_code)
-            gw_log (GW_LOG_FATAL, KERNEL_LOG, "Reply '%s' got exit code %d",
-                    cmd, 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);
     }