More verbose.
[egate.git] / www / wproto.c
index bc46653..4cba04c 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wproto.c,v $
- * Revision 1.6  1995/11/06 10:51:17  adam
+ * Revision 1.12  1996/01/05 16:35:02  adam
+ * Minor changes.
+ *
+ * Revision 1.11  1996/01/05  16:21:21  adam
+ * Bug fix: shell (wproto) sometimes closed server FIFO before cgi
+ * program opened it - solution: cgi sends OK when response has been read.
+ *
+ * Revision 1.10  1995/12/22  14:21:16  adam
+ * More work on scan. The search.egw script takes care of cached
+ * query page (doesn't always increment nextSetNo). To make new search set
+ * either 'New query' must be selected or the query page must be reloaded.
+ * The msearch script doesn't do this yet, however.
+ *
+ * Revision 1.9  1995/11/14  16:31:36  adam
+ * Temporary remove of ccl entry.
+ *
+ * Revision 1.8  1995/11/13  15:41:45  adam
+ * Arrow gifs.
+ * Gateway uses record element set names B(rief) and F(ull).
+ * Bug fix. Didn't save idAuthentication correctly.
+ *
+ * Revision 1.7  1995/11/10  14:47:32  adam
+ * Plus (+) characters automatically converted to space in forms.
+ * Work on search in multiple targets. Doesn't work well - yet.
+ * Presentation formats enhanced.
+ *
+ * Revision 1.6  1995/11/06  10:51:17  adam
  * End of response marker in response from wsh/wproto to wcgi.
  * Shells are respawned when necessary.
  *
@@ -65,6 +91,7 @@
  */
 
 #include <stdio.h>
+#include <string.h>
 #include <stdlib.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -113,7 +140,11 @@ void wo_clear (WCLIENT wc, char *type)
     if (!wc->outbuffer)
        wc->outbuffer = malloc(wc->outbuffer_size = OUTBUFFER_CHUNK);
     wc->outbuffer_offset = 0;
+#if 0
+    wo_printf(wc, "Expires: 0\nContent-type: %s\n\n", type);
+#else
     wo_printf(wc, "Content-type: %s\n\n", type);
+#endif
 }
 
 int wo_puthtml (WCLIENT wc, char *name)
@@ -186,11 +217,19 @@ int wo_overflow(WCLIENT wc, char ch)
 
 int wo_finish(WCLIENT wc)
 {
+    char buf[4];
     gw_log (GW_LOG_DEBUG, mod, "wo_finish");
-  
+
     wo_putc (wc, 0);
     if (wo_flush(wc) < 0)
        return -1;
+#if 1
+    gw_log (GW_LOG_DEBUG, mod, "reading ack");
+    if (read(wc->linein, buf, 2) != 2)
+    {
+        gw_log (GW_LOG_DEBUG, mod, "read ack");
+    }
+#endif
     close(wc->lineout);
     wc->lineout = -1;
     if (wc->cache_fd >= 0)
@@ -211,10 +250,21 @@ static void descramble(char *t, const char *o)
        {
            sscanf(o + 1, "%2x", &v);
            o += 3;
-           *(t++) = (char) v;
+            if (v == '+')
+                *t = ' ';
+            else
+                *t = (char) v;
+            t++;
        }
        else
-           *(t++) = *(o++);
+        {
+            if (*o == '+')
+                *t = ' ';
+            else
+                *t = *o;
+            t++;
+            o++;
+        }
     }
     *t = '\0';
 }
@@ -309,18 +359,24 @@ int wproto_process(WCLIENT wc, int timeout)
        p++;
        p++;         /* we don't deal with envvars yet */
        decode_form(wc->wf_data, p);
-       if (wc->lineout < 0 && (wc->lineout = open(wc->wf_serverp, O_WRONLY))
-           < 0)
-       {
-           gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open %s", wc->wf_serverp);
-           exit(1);
-       }
+       if (wc->lineout < 0)
+        {
+            gw_log (GW_LOG_DEBUG, mod, "open %s", wc->wf_serverp);
+            if ((wc->lineout = open(wc->wf_serverp, O_WRONLY)) < 0)
+           {
+               gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open %s", 
+                        wc->wf_serverp);
+               exit(1);
+           }
+        }
        /* look in cache only if request carries no forms data. */
        if (!*wc->wf_data[0].name && (level = wproto_findcache(wc,
            wc->wf_parms)) >= 0)
        {
+           gw_log (GW_LOG_DEBUG, mod, "wproto_dumpcache");
            wproto_dumpcache(wc, level);
            wo_finish(wc);
+            
        }
        else
         {
@@ -349,10 +405,7 @@ WCLIENT wproto_init(void)
     new->id = atoi (val);
     sprintf(new->path, "%s/%s/clt%d", FIFOROOT, FIFODIR, new->id);
     if (mkfifo(new->path, 0666 | S_IFIFO) < 0)
-    {
-       gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "mkfifo(%s)", new->path);
-       exit(1);
-    }
+       gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "mkfifo(%s)", new->path);
     gw_log (GW_LOG_DEBUG, mod, "Synchronizing with server.");
     sprintf(path2, "%s/%s/srv%d", FIFOROOT, FIFODIR, getppid());
     if ((new->lineout = open(path2, O_WRONLY)) < 0)