From f96d9ce1f8c00b469ce235791055124b51db2592 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Mon, 15 Dec 1997 15:05:02 +0000 Subject: [PATCH] Enhanced the code that deals with FORM variables. --- www/wproto.c | 75 ++++++++++++++++++++++++++++++++++++++++------------------ www/wproto.h | 14 +++++++---- www/wtcl.c | 28 ++++++++++++---------- 3 files changed, 76 insertions(+), 41 deletions(-) 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"); diff --git a/www/wproto.h b/www/wproto.h index 6beb5ed..d79f072 100644 --- a/www/wproto.h +++ b/www/wproto.h @@ -41,6 +41,9 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wproto.h,v $ + * Revision 1.16 1997/12/15 15:05:03 adam + * Enhanced the code that deals with FORM variables. + * * Revision 1.15 1997/02/10 10:15:40 adam * Bug fix: egw_source didn't work properly. * @@ -112,8 +115,9 @@ typedef struct wform_data { - char name[64]; - char value[512]; + char *name; + char *value; + struct wform_data *next; } wform_data; typedef struct cache_data @@ -136,9 +140,9 @@ typedef struct wclient_data int id; char *prog; char *raw_data; - wform_data wf_data[50]; - wform_data wf_parms_var[50]; - char wf_parms[1024]; + wform_data *wf_data; + wform_data *wf_parms_var; + char *wf_parms; char wf_serverp[1024]; char wf_serverf[1024]; char wf_script[1024]; diff --git a/www/wtcl.c b/www/wtcl.c index 69d0ab4..ea5b2ce 100644 --- a/www/wtcl.c +++ b/www/wtcl.c @@ -41,6 +41,9 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wtcl.c,v $ + * Revision 1.22 1997/12/15 15:05:03 adam + * Enhanced the code that deals with FORM variables. + * * Revision 1.21 1997/02/10 10:15:40 adam * Bug fix: egw_source didn't work properly. * @@ -206,7 +209,6 @@ static int proc_form_invoke (struct tcl_info *p, wform_data *wfdata, { const char *arg = NULL; int failFlag = 0; - int i; if (argc == 3) { @@ -231,27 +233,27 @@ static int proc_form_invoke (struct tcl_info *p, wform_data *wfdata, arg = argv[1]; if (arg) { - for (i = 0; *wfdata[i].name; i++) - if (!strcmp (arg, wfdata[i].name)) + for (; wfdata; wfdata = wfdata->next) + if (!strcmp (arg, wfdata->name)) { failFlag = 0; - if (*wfdata[i].value) - Tcl_AppendElement (p->interp, wfdata[i].value); + if (wfdata->value) + Tcl_AppendElement (p->interp, wfdata->value); } if (failFlag) { Tcl_AppendResult (p->interp, arg, " doesn't exist", NULL); return TCL_ERROR; } - return TCL_OK; } - for (i = 0; *wfdata[i].name; i++) - { - Tcl_AppendResult (p->interp, "{ ", NULL); - Tcl_AppendElement (p->interp, wfdata[i].name); - Tcl_AppendElement (p->interp, wfdata[i].value); - Tcl_AppendResult (p->interp, " }\n", NULL); - } + else + for ( ; wfdata; wfdata = wfdata->next) + { + Tcl_AppendResult (p->interp, "{ ", NULL); + Tcl_AppendElement (p->interp, wfdata->name); + Tcl_AppendElement (p->interp, wfdata->value ? wfdata->value : ""); + Tcl_AppendResult (p->interp, " }\n", NULL); + } return TCL_OK; } -- 1.7.10.4