X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fwproto.c;h=eedbe74905f9f09979445d775ed6493e3a067fe3;hb=1140389ab96fc8ca7bc9c8dc642adbcec625f4a6;hp=35479b36235b600c50f59cdaa51bfe2942dc192f;hpb=95847d2bfe19cbe5533cd25df3e6a64f9bd4b062;p=egate.git diff --git a/www/wproto.c b/www/wproto.c index 35479b3..eedbe74 100644 --- a/www/wproto.c +++ b/www/wproto.c @@ -41,7 +41,39 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wproto.c,v $ - * Revision 1.15 1996/01/24 08:25:32 adam + * Revision 1.23 1997/01/27 11:27:14 adam + * Implemented a new command, egw_clear, to clear http output cache. + * Changed prototype for function wo_clear. + * + * Revision 1.22 1997/01/24 13:13:11 adam + * Implemnted egw_source and added a "raw" option to the URL. + * Fixed a bug in the buffering system of wproto; the macro wo_putc could + * override memory if it was the first HTML generating function called. + * + * Revision 1.21 1996/05/23 15:53:11 adam + * Bug fix: egw_enc failed on 8-bit chars. + * New command: egw_parms. + * + * Revision 1.20 1996/05/21 14:53:04 adam + * Tcl command wform extented; options -raw and -exists added. + * + * Revision 1.19 1996/03/14 11:48:39 adam + * New function egw_prog that returns name of shell. + * + * Revision 1.18 1996/02/12 10:09:23 adam + * New parameter to wproto_init: directory root for the FIFOs (instead + * of using preprocessor defines FIFODIR/FIFOROOT). + * + * Revision 1.17 1996/01/26 09:02:22 adam + * Open of client FIFO called with O_NDELAY when reconnecting to shell + * in order to prevent serious lock if previous shell died without + * unlinking client FIFO. + * + * Revision 1.16 1996/01/24 10:13:56 adam + * Bug fix: in function wo_write realloc is used only when memory is already + * allocated with malloc. + * + * Revision 1.15 1996/01/24 08:25:32 adam * Buf fix: Uninitialized outbuffer_offset member. * * Revision 1.14 1996/01/12 13:08:07 adam @@ -114,6 +146,7 @@ #include #include #include +#include #include "wproto.h" @@ -126,8 +159,11 @@ static char *mod = "wproto"; void wo_write (WCLIENT wc, const char *s, size_t len) { if (wc->outbuffer_offset + len >= wc->outbuffer_size) - wc->outbuffer = realloc(wc->outbuffer, wc->outbuffer_size += - ((len >= OUTBUFFER_CHUNK) ? len*2 : OUTBUFFER_CHUNK)); + { + assert (wc->outbuffer); + wc->outbuffer = realloc(wc->outbuffer, wc->outbuffer_size += + ((len >= OUTBUFFER_CHUNK) ? len*2 : OUTBUFFER_CHUNK)); + } memcpy(wc->outbuffer + wc->outbuffer_offset, s, len); wc->outbuffer_offset += len; } @@ -148,34 +184,11 @@ void wo_printf (WCLIENT wc, const char *fmt, ...) va_end(ap); } -void wo_clear (WCLIENT wc, const char *type) +void wo_clear (WCLIENT wc) { + if (!wc->outbuffer) + wc->outbuffer = malloc (wc->outbuffer_size = OUTBUFFER_CHUNK); wc->outbuffer_offset = 0; - if (type) - wo_printf(wc, "Content-type: %s\n\n", type); -} - -int wo_puthtml (WCLIENT wc, char *name) -{ - FILE *f; - char ch; - - wo_clear(wc, "text/html"); - if (!(f = fopen(name, "r"))) - { - wo_printf(wc, "
Failed to open file: %s
", name); - return 0; - } - while (ch = getc(f), !feof(f)) - { - if (wo_putc(wc, ch) < 0) - { - fclose(f); - return -1; - } - } - fclose(f); - return 0; } int wo_flush(WCLIENT wc) @@ -348,12 +361,11 @@ int wproto_process(WCLIENT wc, int timeout) if (rs == 0) { gw_log (GW_LOG_STAT, mod, - "wproto_process returning 0 after %d second timeout.", + "select %d second timeout.", timeout); unlink (wc->wf_serverp); return 0; } - /* determine handle (fifo or user) */ if (read(wc->linein, &toread, sizeof(toread)) < sizeof(toread)) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "wp_proc:len read failed"); @@ -370,9 +382,16 @@ int wproto_process(WCLIENT wc, int timeout) p++; for (t = wc->wf_serverf; (*t = *p); t++, p++); p++; + for (t = wc->wf_script; *p && *p != '/'; t++, p++) + *t = *p; + *t = '\0'; + if (*p) + p++; + decode_form (wc->wf_parms_var, p); for (t = wc->wf_parms; (*t = *p); t++, p++); p++; p++; /* we don't deal with envvars yet */ + wc->raw_data = p; decode_form(wc->wf_data, p); if (wc->lineout < 0) { @@ -400,14 +419,14 @@ int wproto_process(WCLIENT wc, int timeout) } } -WCLIENT wproto_init(void) +WCLIENT wproto_init (const char *fifoDir, const char *prog) { char *val, path2[256]; - wclient_data *new; + wclient_data *newp; gw_log (GW_LOG_DEBUG, mod, "wproto_init"); close(1); /* release us from the wserver */ - if (!(new = malloc(sizeof(*new)))) + if (!(newp = malloc(sizeof(*newp)))) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc"); exit (1); @@ -417,42 +436,49 @@ WCLIENT wproto_init(void) gw_log (GW_LOG_FATAL, mod, "GWID not set"); exit (1); } - 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_WARN|GW_LOG_ERRNO, mod, "mkfifo(%s)", new->path); + if (!(newp->prog = malloc (strlen(prog)+1))) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc"); + exit (1); + } + strcpy (newp->prog, prog); + newp->fifoDir = fifoDir; + newp->id = atoi (val); + sprintf(newp->path, "%s/clt%d", newp->fifoDir, newp->id); + if (mkfifo(newp->path, 0666 | S_IFIFO) < 0) + gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "mkfifo(%s)", newp->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) + sprintf(path2, "%s/srv%d", newp->fifoDir, getppid()); + if ((newp->lineout = open(path2, O_WRONLY)) < 0) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open out %s", path2); exit(1); } - if (write(new->lineout, "OK", 2) < 2) + if (write(newp->lineout, "OK", 2) < 2) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "write"); exit(1); } gw_log (GW_LOG_DEBUG, mod, "Synchronized."); - if ((new->linein = open(new->path, O_RDONLY)) < 0) + if ((newp->linein = open(newp->path, O_RDONLY)) < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open input %s", new->path); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open input %s", newp->path); exit(1); } gw_log (GW_LOG_DEBUG, mod, "init. linein=%d lineout=%d", - new->linein, new->lineout); + newp->linein, newp->lineout); /* we put a handle on this so we get a blocking read when no peer */ - if (open(new->path, O_WRONLY | O_NDELAY) < 0) + if (open(newp->path, O_WRONLY | O_NDELAY) < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open dummy %s", new->path); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open dummy %s", newp->path); exit(1); } - new->outbuffer = 0; - new->outbuffer_size = 0; - new->outbuffer_offset = 0; - new->cache_level = -1; - new->cache_fd = -1; - return new; + newp->outbuffer = 0; + newp->outbuffer_size = 0; + newp->outbuffer_offset = 0; + newp->cache_level = -1; + newp->cache_fd = -1; + return newp; } static void wproto_uncache(WCLIENT wc, int level) @@ -463,6 +489,7 @@ static void wproto_uncache(WCLIENT wc, int level) void wproto_terminate(WCLIENT wc) { + free (wc->prog); close(wc->linein); unlink(wc->path); wproto_uncache(wc, 0); @@ -480,7 +507,7 @@ int wproto_cache(WCLIENT wc, int level) } wproto_uncache(wc, level); p = &wc->cache[++wc->cache_level]; - sprintf(p->path, "%s/%s/csh%d.%d", FIFOROOT, FIFODIR, wc->id, level); + sprintf(p->path, "%s/csh%d.%d", wc->fifoDir, wc->id, level); if ((wc->cache_fd = open(p->path, O_WRONLY|O_CREAT|O_TRUNC, 0600)) < 0) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open %s", p->path);