A lot of changes - really.
[egate.git] / www / wsh.c
index 4bd4257..990d141 100644 (file)
--- a/www/wsh.c
+++ b/www/wsh.c
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wsh.c,v $
- * Revision 1.2  1995/10/20 14:02:42  adam
+ * Revision 1.3  1995/10/23 16:55:41  adam
+ * A lot of changes - really.
+ *
+ * Revision 1.2  1995/10/20  14:02:42  adam
  * First version of WWW gateway with embedded Tcl.
  *
  * Revision 1.1  1995/10/20  11:49:28  adam
@@ -67,35 +70,70 @@ static char *mod = "wsh";
 
 int main (int argc, char **argv)
 {
-    char *script, *p, parms[512];
+    char *script, *parms, parms_buf[512];
     int timeout = TIMEOUT_SHORT;
-    W_Interp tcl_interp, html_interp;
+    W_Interp w_interp;
 
     chdir("/usr/local/etc/httpd/cgi-bin");
-    gw_log_init ("egw");
+    gw_log_init (*argv);
     gw_log_file (GW_LOG_ALL, "/usr/local/etc/httpd/logs/egwsh_log");
     gw_log_level (GW_LOG_ALL);
-    gw_log (GW_LOG_STAT, mod, "Europagate www shell");
-
+    gw_log (GW_LOG_STAT, mod, "Europagate www shell: %s", *argv);
+    
     if (!(wcl = wproto_init()))
     {
        gw_log (GW_LOG_FATAL, mod, "init");
        exit(1);
     }
-    tcl_interp = w_interp_create (w_interp_tcl, NULL);
-    html_interp = w_interp_create (w_interp_html, NULL);
+    gw_log_session (wcl->id);
+    if (!strcmp (*argv, "egwtcl"))
+        w_interp = w_interp_create (w_interp_tcl, wcl, NULL);
+    else if (!strcmp (*argv, "egwhtml"))
+        w_interp = w_interp_create (w_interp_html, wcl, NULL);
+    else
+    {
+        gw_log (GW_LOG_FATAL, mod, "Cannot determine shell type. prog=%s",
+               *argv);
+        exit (1);
+    }
     while (wproto_process(wcl, timeout) > 0)
     {
-       wo_clear(wcl, "text/html");
-       strcpy(parms, wcl->wf_parms);
-       script = p = parms;
-       while (*p && *p != '/')
-           p++;
-       if (*p == '/')
-           *(p++) = '\0';
+       wo_clear (wcl, "text/html");
+       strcpy (parms_buf, wcl->wf_parms);
+       script = parms = parms_buf;
+       while (*parms && *parms != '/')
+           parms++;
+       if (*parms == '/')
+           *parms++ = '\0';
+        if (*script)
+        {
+            char *p = script + strlen(script) - 1;
+            while (*p && p != script)
+                switch (*p)
+                {
+                case '+':
+                    wproto_cache (wcl, wcl->cache_level+1);
+                    *p = '\0';
+                    break;
+                case '-':
+                    if (p[1])
+                        wproto_cache (wcl, wcl->cache_level-atoi(p+1));
+                    else
+                        wproto_cache (wcl, wcl->cache_level-1);
+                    *p = '\0';
+                    break;
+                case '=':
+                    if (isdigit(p[1]))
+                        wproto_cache (wcl, atoi(p+1));
+                    *p = '\0';
+                    break;
+                default:
+                    --p;
+                }
+        }
        gw_log (GW_LOG_DEBUG, mod, "script: %s", script);
-       gw_log (GW_LOG_DEBUG, mod, "parms: %s", p);
-        if (w_interp_exec (tcl_interp, wcl, script, p))
+       gw_log (GW_LOG_DEBUG, mod, "parms: %s", parms);
+        if (w_interp_exec (w_interp, script, parms))
         {
             wo_printf (wcl, "<html><head><title>wsh error</title></head>\n");
             wo_printf (wcl, "<body>Couldn't execute script %s</body></html>",