X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=www%2Fwsh.c;h=c6093f40ba58fd370f0e75415b23feb859d3b7a7;hb=94e0e8ff10cdb5142f983cd76156310461f9eb89;hp=4bd4257eba9c4ca58eb27964b49824b66f5a7670;hpb=f37ddd57014f51c88ef36050ed08b4c6e226e094;p=egate.git diff --git a/www/wsh.c b/www/wsh.c index 4bd4257..c6093f4 100644 --- a/www/wsh.c +++ b/www/wsh.c @@ -41,7 +41,26 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wsh.c,v $ - * Revision 1.2 1995/10/20 14:02:42 adam + * Revision 1.7 1995/11/06 17:44:23 adam + * State reestablised when shell restarts. History of previous + * result sets. + * + * Revision 1.6 1995/11/06 10:51:19 adam + * End of response marker in response from wsh/wproto to wcgi. + * Shells are respawned when necessary. + * + * Revision 1.5 1995/11/01 16:15:48 adam + * Better presentation of records. Query/set number persistent. + * + * Revision 1.4 1995/10/27 15:12:12 adam + * IrTcl incorporated in the gateway. + * Better separation of script types. + * Z39.50 gateway scripts entered. + * + * 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 @@ -56,7 +75,9 @@ #include #include -#include "winterp.h" +#include "whtml.h" +#include "wtcl.h" +#include "wirtcl.h" #define TIMEOUT_SHORT 60 #define TIMEOUT_MEDIUM 1800 @@ -67,35 +88,78 @@ 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, "egwirtcl")) + w_interp = w_interp_create (w_interp_irtcl, 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); + } + w_interp_load_state (w_interp, NULL); 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'; + char *p; + + 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) + { + 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; + } + } + for (p = parms; *p; p++) + if (*p == '+') + *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, "wsh error\n"); wo_printf (wcl, "Couldn't execute script %s", @@ -103,6 +167,7 @@ int main (int argc, char **argv) } wo_finish(wcl); } + w_interp_save_state (w_interp, NULL); wproto_terminate(wcl); return 0; }