X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fwproto.c;h=ff283ded13c5c35c55d5fa9cff540b67ccc922e2;hb=b52740e82ab92e99a6982bf5c99a30ac404bd557;hp=6bc7cb0f64aaeaef3d146df2693f4fe177092875;hpb=1938b1fd36e774fa9b6d11a4eb5edfcdaee0267b;p=egate.git diff --git a/www/wproto.c b/www/wproto.c index 6bc7cb0..ff283de 100644 --- a/www/wproto.c +++ b/www/wproto.c @@ -41,7 +41,35 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wproto.c,v $ - * Revision 1.1 1995/10/20 11:49:26 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 + * Record presentation. + * + * Revision 1.3 1995/10/27 15:12:10 adam + * IrTcl incorporated in the gateway. + * Better separation of script types. + * Z39.50 gateway scripts entered. + * + * Revision 1.2 1995/10/23 16:55:39 adam + * A lot of changes - really. + * + * Revision 1.1 1995/10/20 11:49:26 adam * First version of www gateway. * */ @@ -65,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]; @@ -87,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); @@ -95,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; @@ -128,13 +159,17 @@ 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"); return -1; } + gw_log (GW_LOG_DEBUG, mod, "wrote %d bytes", wrote); if (wc->cache_fd >= 0) if (write(wc->cache_fd, wc->outbuffer + wc->outbuffer_offset, towrite) < 0) @@ -162,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); @@ -184,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'; } @@ -246,6 +294,7 @@ int wproto_process(WCLIENT wc, int timeout) top = 0; FD_ZERO(&input); FD_SET(wc->linein, &input); + /* go through select handle list */ while ((rs = select(wc->linein + 1, &input, 0, 0, top)) < 0 && errno == EINTR) ; @@ -259,8 +308,10 @@ int wproto_process(WCLIENT wc, int timeout) gw_log (GW_LOG_STAT, mod, "wproto_process returning 0 after %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"); @@ -293,29 +344,38 @@ int wproto_process(WCLIENT wc, int timeout) wo_finish(wc); } else + { return 1; + } } } 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)); - sprintf(new->path, "%s/%s/clt%d", FIFOROOT, FIFODIR, getpid()); - 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) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open %s", path2); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open out %s", path2); exit(1); } if (write(new->lineout, "OK", 2) < 2) @@ -326,9 +386,11 @@ WCLIENT wproto_init(void) gw_log (GW_LOG_DEBUG, mod, "Synchronized."); if ((new->linein = open(new->path, O_RDONLY)) < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open input handle %s", new->path); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open input %s", new->path); exit(1); } + gw_log (GW_LOG_DEBUG, mod, "init. linein=%d lineout=%d", + new->linein, new->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) { @@ -366,7 +428,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, getpid(), level); + sprintf(p->path, "%s/%s/csh%d.%d", FIFOROOT, 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);