X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=www%2Fwproto.c;h=ff283ded13c5c35c55d5fa9cff540b67ccc922e2;hb=6c6f3deb01675917b3c73cca50dd20d738593a47;hp=49b82b733ef8cc6a7d6c86fec122028ffe7409c9;hpb=150d836eb46d0dde8fedeb77fc7fd4ef6eafba4f;p=egate.git diff --git a/www/wproto.c b/www/wproto.c index 49b82b7..ff283de 100644 --- a/www/wproto.c +++ b/www/wproto.c @@ -41,7 +41,21 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wproto.c,v $ - * Revision 1.5 1995/11/02 16:35:37 adam + * 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. + * + * Revision 1.5 1995/11/02 16:35:37 adam * Bug fixes and select on FIFOs in wcgi - doesn't really work! * * Revision 1.4 1995/10/31 16:56:25 adam @@ -79,18 +93,21 @@ static void wproto_uncache(WCLIENT wc, int level); static char *mod = "wproto"; -void wo_puts(WCLIENT wc, char *s) +void wo_write (WCLIENT wc, const char *s, size_t len) { - int len; - - if (wc->outbuffer_offset + (len = strlen(s)) + 1 > wc->outbuffer_size) + if (wc->outbuffer_offset + len >= wc->outbuffer_size) wc->outbuffer = realloc(wc->outbuffer, wc->outbuffer_size += OUTBUFFER_CHUNK); - memcpy(wc->outbuffer + wc->outbuffer_offset, s, len + 1); + memcpy(wc->outbuffer + wc->outbuffer_offset, s, len); wc->outbuffer_offset += len; } -void wo_printf(WCLIENT wc, const char *fmt, ...) +void wo_puts (WCLIENT wc, const char *s) +{ + wo_write (wc, s, strlen(s)); +} + +void wo_printf (WCLIENT wc, const char *fmt, ...) { va_list ap; char tmpbuf[4048]; @@ -101,7 +118,7 @@ void wo_printf(WCLIENT wc, const char *fmt, ...) va_end(ap); } -void wo_clear(WCLIENT wc, char *type) +void wo_clear (WCLIENT wc, char *type) { if (!wc->outbuffer) wc->outbuffer = malloc(wc->outbuffer_size = OUTBUFFER_CHUNK); @@ -109,7 +126,7 @@ void wo_clear(WCLIENT wc, char *type) wo_printf(wc, "Content-type: %s\n\n", type); } -int wo_puthtml(WCLIENT wc, char *name) +int wo_puthtml (WCLIENT wc, char *name) { FILE *f; char ch; @@ -142,8 +159,11 @@ int wo_flush(WCLIENT wc) wc->outbuffer_offset = 0; for (;;) { + int w_chunk; + + w_chunk = towrite; wrote = write(wc->lineout, wc->outbuffer + wc->outbuffer_offset, - towrite); + w_chunk); if (wrote <= 0) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "write response"); @@ -177,6 +197,8 @@ int wo_overflow(WCLIENT wc, char ch) int wo_finish(WCLIENT wc) { gw_log (GW_LOG_DEBUG, mod, "wo_finish"); + + wo_putc (wc, 0); if (wo_flush(wc) < 0) return -1; close(wc->lineout); @@ -199,10 +221,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'; } @@ -312,7 +345,6 @@ int wproto_process(WCLIENT wc, int timeout) } else { - unlink (wc->wf_serverp); return 1; } } @@ -320,19 +352,25 @@ int wproto_process(WCLIENT wc, int timeout) WCLIENT wproto_init(void) { - char path2[256]; + char *val, path2[256]; wclient_data *new; gw_log (GW_LOG_DEBUG, mod, "wproto_init"); close(1); /* release us from the wserver */ - new = malloc(sizeof(*new)); - new->id = getpid(); - sprintf(new->path, "%s/%s/clt%d", FIFOROOT, FIFODIR, new->id); - if (mkfifo(new->path, 0666 | S_IFIFO) < 0) + if (!(new = malloc(sizeof(*new)))) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "mkfifo(%s)", new->path); - exit(1); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc"); + exit (1); } + if (!(val = getenv ("GWID"))) + { + 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); 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)