X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=www%2Fwcgi.c;h=722d109df62796134436434077190908dd19b348;hb=71ad5b6272d0bc6320bea6c1ec10f5e10bbfe8ef;hp=d2b915de31ff9f76e43680451d42134a0c695923;hpb=71b5b2cf0d923cf64e9353c9250bd2912e446e0a;p=egate.git diff --git a/www/wcgi.c b/www/wcgi.c index d2b915d..722d109 100644 --- a/www/wcgi.c +++ b/www/wcgi.c @@ -41,7 +41,31 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wcgi.c,v $ - * Revision 1.5 1995/11/06 10:51:15 adam + * Revision 1.11 1996/01/08 08:42:19 adam + * Handles method GET. + * + * Revision 1.10 1996/01/05 16:21:20 adam + * Bug fix: shell (wproto) sometimes closed server FIFO before cgi + * program opened it - solution: cgi sends OK when response has been read. + * + * Revision 1.9 1995/12/20 16:31:33 adam + * Bug fix: shell might terminate even though new request was initiated + * by the cgi interface program. + * Work on more simple user interface and Europagate buttons. + * + * Revision 1.8 1995/11/08 16:14:35 adam + * Many improvements and bug fixes. + * First version that ran on dtbsun. + * + * Revision 1.7 1995/11/08 12:42:18 adam + * Added descriptive text field in target info. + * Added authentication field in target info. + * + * Revision 1.6 1995/11/06 17:44:22 adam + * State reestablised when shell restarts. History of previous + * result sets. + * + * Revision 1.5 1995/11/06 10:51:15 adam * End of response marker in response from wsh/wproto to wcgi. * Shells are respawned when necessary. * @@ -111,6 +135,7 @@ static int spawn (char *sprog, int id) case 0: close (0); close (1); + close (2); gw_log (GW_LOG_DEBUG, prog, "execl %s", path); execl (path, sprog, 0); gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "execl %s", path); @@ -120,6 +145,17 @@ static int spawn (char *sprog, int id) } } +#if 0 +static void print_environ (void) +{ + extern char **environ; + int i; + + for (i = 0; environ[i]; i++) + gw_log (GW_LOG_DEBUG, prog, "e: %s", environ[i]); +} +#endif + /* * NOTE: In the (perhaps odd) terminology used within this software, * the 'server' is the present program, which is executed by the httpd @@ -132,6 +168,7 @@ int main() char combuf[COMBUF]; int linein = -1, lineout, data, gw_id; + chdir ("/usr/local/etc/httpd/cgi-bin"); gw_log_init ("egw"); gw_log_file (GW_LOG_ALL, "/usr/local/etc/httpd/logs/egwcgi_log"); gw_log_level (GW_LOG_ALL); @@ -170,7 +207,7 @@ int main() path_info++; if (*path_info) *(path_info++) = '\0'; - if (!(gw_db = gw_db_open ("user.db", 1))) + if (!(gw_db = gw_db_open ("www.db", 1, 1))) { gw_log (GW_LOG_FATAL, prog, "gw_db_open"); exit (1); @@ -195,15 +232,15 @@ int main() gw_log (GW_LOG_DEBUG, prog, "Synchronizing with client"); if ((linein = open(serverp, O_RDONLY)) < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "open server %s", serverp); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "open %s", serverp); fatal("Internal error in server."); } if (read(linein, combuf, 2) < 2 || strcmp(combuf, "OK")) { - gw_log (GW_LOG_FATAL, prog, "Failed to synchronize with client."); + gw_log (GW_LOG_FATAL, prog, "Failed to synchronize with client"); fatal("Internal error in server"); } - gw_log (GW_LOG_DEBUG, prog, "Synchronized."); + gw_log (GW_LOG_DEBUG, prog, "Synchronized"); } sprintf(clientp, "%s/clt%d", tmp, gw_id); gw_log (GW_LOG_DEBUG, prog, "Opening %s", clientp); @@ -227,7 +264,7 @@ int main() gw_log (GW_LOG_DEBUG, prog, "Synchronizing with client"); if ((linein = open(serverp, O_RDONLY)) < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "open server %s", serverp); + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "open %s", serverp); fatal("Internal error in server"); } if (read(linein, combuf, 2) < 2 || strcmp(combuf, "OK")) @@ -239,47 +276,71 @@ int main() if ((lineout = open(clientp, O_WRONLY)) < 0) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "%s", clientp); - gw_db_close (gw_db); - exit (1); + fatal("Internal error in server"); } } gw_db_close (gw_db); - gw_log (GW_LOG_DEBUG, prog, "Decoding user data."); + gw_log (GW_LOG_DEBUG, prog, "Decoding user data"); p = combuf + sizeof(data); strcpy(p, serverp); p += strlen(p) + 1; strcpy(p, path_info); + gw_log (GW_LOG_DEBUG, prog, "P:%s", p); p += strlen(p) + 1; *(p++) = '\0'; /* no envvars tranferred at present */ if ((t = getenv("CONTENT_LENGTH")) && (data = atoi(t)) > 0) { - if (read(0, p, data) < data) - { - gw_log (GW_LOG_FATAL, prog, "Failed to read input."); - fatal("Internal error in server."); + int j, i = 0; + while (i < data) + { + j = read(0, p + i, data - i); + if (j == -1) + { + gw_log (GW_LOG_ERRNO|GW_LOG_FATAL, prog, + "Failed to read input"); + fatal("Internal error in server"); + } + else if (j == 0) + { + gw_log (GW_LOG_ERRNO, prog, "Failed to read input"); + fatal("Internal error in server"); + } + i += j; } } - p += data; - *(p++) = '\0'; + else if ((t = getenv("QUERY_STRING"))) + { + strcpy (p, t); + data = strlen(p); + } + p[data] = '\0'; + gw_log (GW_LOG_DEBUG, prog, "C:%s", p); + p += data+1; data = (p - combuf); memcpy(combuf, &data, sizeof(data)); - gw_log (GW_LOG_DEBUG, prog, "Writing data."); + gw_log (GW_LOG_DEBUG, prog, "Writing data"); if (write(lineout, combuf, data) < data) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "write"); - fatal("Internal server error."); + fatal("Internal server error"); } - if (linein < 0 && (linein = open(serverp, O_RDONLY)) < 0) + if (linein < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "open server %s", serverp); - fatal("Internal error in server."); + gw_log (GW_LOG_DEBUG, prog, "open %s", serverp); + if ((linein = open(serverp, O_RDONLY)) < 0) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "open %s", serverp); + fatal("Internal error in server"); + } } - gw_log (GW_LOG_DEBUG, prog, "Reading response."); + gw_log (GW_LOG_DEBUG, prog, "Reading response"); -#if 0 +#if 1 while ((data = read(linein, combuf, COMBUF)) > 0) { gw_log (GW_LOG_DEBUG, prog, "Got %d bytes", data); + if (combuf[data-1] == '\0') + break; if (write(1, combuf, data) < data) { gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "write"); @@ -291,8 +352,17 @@ int main() gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "read"); exit (1); } + if (data > 0) + { + --data; + if (write(1, combuf, data) < data) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "write"); + exit (1); + } + } #else -# if 0 +# if 1 fcntl (linein, F_SETFL, O_NONBLOCK); # endif while (1) @@ -349,11 +419,27 @@ int main() break; if (r > 0 && FD_ISSET (1, &s_input)) { - gw_log (GW_LOG_DEBUG, prog, "stdout closed"); - break; + data = read (1, combuf, COMBUF); + if (data == -1) + { + gw_log (GW_LOG_DEBUG|GW_LOG_ERRNO, prog, "stdout closed"); + break; + } + if (data == 0) + { + gw_log (GW_LOG_DEBUG, prog, "stdout closed"); + break; + } + gw_log (GW_LOG_DEBUG, prog, "stdout got %d bytes", data); } } #endif + +#if 1 + gw_log (GW_LOG_DEBUG, prog, "writing ack"); + if (write(lineout, "OK", 2) < 2) + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "write"); +#endif gw_log (GW_LOG_DEBUG, prog, "Cleaning up."); close(linein); unlink(serverp);