X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fwproto.c;fp=www%2Fwproto.c;h=b1e0d1f6e952697bc5a46465315196c625858b18;hb=f96d9ce1f8c00b469ce235791055124b51db2592;hp=704275512d83d1ce5b5dd752500bdb95a8c6e742;hpb=930f1b9b6effd9f1944a74487e835c721550be2f;p=egate.git diff --git a/www/wproto.c b/www/wproto.c index 7042755..b1e0d1f 100644 --- a/www/wproto.c +++ b/www/wproto.c @@ -41,6 +41,9 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wproto.c,v $ + * Revision 1.26 1997/12/15 15:05:02 adam + * Enhanced the code that deals with FORM variables. + * * Revision 1.25 1997/02/10 10:15:38 adam * Bug fix: egw_source didn't work properly. * @@ -248,6 +251,20 @@ int wo_overflow(WCLIENT wc, char ch) return wo_putc(wc, ch); } +void destroy_form (wform_data *p) +{ + while (p) + { + wform_data *p_next = p->next; + + free (p->name); + free (p->value); + free (p); + + p = p_next; + } +} + int wo_finish(WCLIENT wc) { int fd; @@ -255,8 +272,7 @@ int wo_finish(WCLIENT wc) wo_putc (wc, 0); if (wo_flush(wc) < 0) - return -1; - + gw_log (GW_LOG_WARN, mod, "wo_flush failed in wo_finish"); fd = open (wc->wf_serverf, O_RDONLY); if (fd != -1) { @@ -275,6 +291,9 @@ int wo_finish(WCLIENT wc) close(wc->cache_fd); wc->cache_fd = -1; } + free (wc->wf_parms); + destroy_form (wc->wf_data); + destroy_form (wc->wf_parms_var); return 0; } @@ -307,37 +326,45 @@ static void descramble(char *t, const char *o) *t = '\0'; } -static void decode_form(wform_data *form, char *buf) +wform_data *decode_form(char *buf) { - int i = 0; - char *p; - char tmp[512]; + wform_data *p, **pp = &p; + char tmp[4096]; while (*buf) { - for (p = form[i].name; *buf && *buf != '='; buf++) - *(p++) = *buf; - *p = '\0'; + int l; + + *pp = malloc (sizeof(**pp)); + for (l = 0; *buf && *buf != '='; buf++) + if (l < (sizeof(tmp)-1)) + tmp[l++] = *buf; + tmp[l] = '\0'; + (*pp)->name = malloc (strlen(tmp)+1); + strcpy ((*pp)->name, tmp); if (*buf) buf++; - for (p = tmp; *buf && *buf != '&'; buf++) - *(p++) = *buf; - *p = '\0'; - descramble(form[i].value, tmp); + for (l = 0; *buf && *buf != '&'; buf++) + if (l < (sizeof(tmp)-1)) + tmp[l++] = *buf; + tmp[l] = '\0'; + (*pp)->value = malloc (strlen(tmp)+1); + descramble((*pp)->value, tmp); if (*buf) buf++; - i++; + pp = &(*pp)->next; } - *form[i].name = '\0'; + *pp = NULL; + return p; } char *wgetval(WCLIENT wc, char *name) { - int i; + wform_data *p; - for (i = 0; *wc->wf_data[i].name; i++) - if (!strcmp(name, wc->wf_data[i].name)) - return wc->wf_data[i].value; + for (p = wc->wf_data; p; p = p->next) + if (!strcmp(name, p->name)) + return p->value; return 0; } @@ -399,12 +426,14 @@ int wproto_process(WCLIENT wc, int timeout) *t = '\0'; if (*p) p++; - decode_form (wc->wf_parms_var, p); - for (t = wc->wf_parms; (*t = *p); t++, p++); + wc->wf_parms_var = decode_form (p); + wc->wf_parms = malloc (strlen(p)+1); + 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); + wc->wf_data = decode_form (p); if (wc->lineout < 0) { gw_log (GW_LOG_DEBUG, mod, "open %s", wc->wf_serverp); @@ -416,7 +445,7 @@ int wproto_process(WCLIENT wc, int timeout) } } /* look in cache only if request carries no forms data. */ - if (!*wc->wf_data[0].name && (level = wproto_findcache(wc, + if (!wc->wf_data && (level = wproto_findcache(wc, wc->wf_parms)) >= 0) { gw_log (GW_LOG_DEBUG, mod, "wproto_dumpcache");