* USE OR PERFORMANCE OF THIS SOFTWARE.
*
* $Log: wproto.c,v $
- * Revision 1.5 1995/11/02 16:35:37 adam
+ * 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
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];
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);
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;
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");
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);
}
else
{
- unlink (wc->wf_serverp);
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));
- new->id = getpid();
+ if (!(new = malloc(sizeof(*new))))
+ {
+ 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)
{