X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=www%2Fwcgi.c;h=d2b915de31ff9f76e43680451d42134a0c695923;hb=71b5b2cf0d923cf64e9353c9250bd2912e446e0a;hp=60591ffec87439276a4814c8f6c08a695bb451fe;hpb=cbf0ef7549f996f4d96f41c6dafa76dc17dd7782;p=egate.git diff --git a/www/wcgi.c b/www/wcgi.c index 60591ff..d2b915d 100644 --- a/www/wcgi.c +++ b/www/wcgi.c @@ -41,7 +41,14 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wcgi.c,v $ - * Revision 1.3 1995/10/31 16:56:24 adam + * 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. + * + * Revision 1.4 1995/11/02 16:35:37 adam + * Bug fixes and select on FIFOs in wcgi - doesn't really work! + * + * Revision 1.3 1995/10/31 16:56:24 adam * Record presentation. * * Revision 1.2 1995/10/23 16:55:36 adam @@ -66,6 +73,7 @@ #define DEADSTRING "Your database server has terminated. To reactivate \ the server, please reload the server's 'front page'." +#include #include "wproto.h" #define CGIDIR "/usr/local/etc/httpd/cgi-bin" @@ -73,21 +81,27 @@ the server, please reload the server's 'front page'." static char *prog = "cgi"; static char serverp[256] = {'\0'}; +static GW_DB gw_db = NULL; static void fatal(char *p) { printf("Content-type: text/html\n\nServer Failure\n"); printf("%s\n", p); + if (gw_db) + gw_db_close (gw_db); if (*serverp) unlink(serverp); exit(0); } -static int spawn(char *sprog) +static int spawn (char *sprog, int id) { int r; char path[256]; + char envstr[80]; + sprintf (envstr, "GWID=%d", id); + putenv (envstr); sprintf(path, "%s/%s", CGIDIR, sprog); switch(r = fork()) { @@ -106,7 +120,6 @@ static int spawn(char *sprog) } } - /* * NOTE: In the (perhaps odd) terminology used within this software, * the 'server' is the present program, which is executed by the httpd @@ -117,7 +130,7 @@ int main() { char clientp[256], tmp[256], *path_info, *p, *operation, *t; char combuf[COMBUF]; - int linein = -1, lineout, data, childpid; + int linein = -1, lineout, data, gw_id; gw_log_init ("egw"); gw_log_file (GW_LOG_ALL, "/usr/local/etc/httpd/logs/egwcgi_log"); @@ -157,11 +170,29 @@ int main() path_info++; if (*path_info) *(path_info++) = '\0'; - if ((childpid = atoi(operation)) <= 0) + if (!(gw_db = gw_db_open ("user.db", 1))) + { + gw_log (GW_LOG_FATAL, prog, "gw_db_open"); + exit (1); + } + if ((gw_id = atoi(operation)) <= 0) { - childpid = spawn(operation); - /* synchronize with client. */ - gw_log (GW_LOG_DEBUG, prog, "Synchronizing with client."); + int r; + char gw_id_str[16]; + + gw_id = gw_db_seq_no (gw_db); + sprintf (gw_id_str, "%d", gw_id); + + spawn(operation, gw_id); + r = gw_db_insert (gw_db, gw_id_str, strlen(gw_id_str)+1, + operation, strlen(operation)+1); + if (r) + { + gw_log (GW_LOG_FATAL, prog, "gw_db_insert: %d", r); + gw_db_close (gw_db); + exit (1); + } + 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); @@ -174,13 +205,45 @@ int main() } gw_log (GW_LOG_DEBUG, prog, "Synchronized."); } - sprintf(clientp, "%s/clt%d", tmp, childpid); + sprintf(clientp, "%s/clt%d", tmp, gw_id); gw_log (GW_LOG_DEBUG, prog, "Opening %s", clientp); if ((lineout = open(clientp, O_WRONLY)) < 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "%s", clientp); - fatal(DEADSTRING); + char gw_id_str[16]; + void *sprog; + size_t sprog_size; + int r; + + sprintf (gw_id_str, "%d", gw_id); + r = gw_db_lookup (gw_db, gw_id_str, strlen(gw_id_str)+1, + &sprog, &sprog_size); + if (r != 1) + { + gw_log (GW_LOG_FATAL, prog, "gw_db_lookup %s", gw_id_str); + fatal("Internal error in server"); + } + gw_log (GW_LOG_DEBUG|GW_LOG_ERRNO, prog, "open %s restart", clientp); + spawn (sprog, gw_id); + 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); + 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."); + fatal("Internal error in server"); + } + gw_log (GW_LOG_DEBUG, prog, "Synchronized."); + 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); + } } + gw_db_close (gw_db); gw_log (GW_LOG_DEBUG, prog, "Decoding user data."); p = combuf + sizeof(data); strcpy(p, serverp); @@ -213,7 +276,7 @@ int main() } gw_log (GW_LOG_DEBUG, prog, "Reading response."); -#if 1 +#if 0 while ((data = read(linein, combuf, COMBUF)) > 0) { gw_log (GW_LOG_DEBUG, prog, "Got %d bytes", data); @@ -223,54 +286,74 @@ int main() exit (1); } } + if (data < 0) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "read"); + exit (1); + } #else +# if 0 fcntl (linein, F_SETFL, O_NONBLOCK); +# endif while (1) { - fd_set s_input, s_output; - int r; + fd_set s_input; + struct timeval t; + int r, eof_flag = 0; + t.tv_sec = 10; + t.tv_usec = 0; FD_ZERO(&s_input); - FD_ZERO(&s_output); FD_SET(linein, &s_input); -#if 0 - FD_SET(1, &s_output); -#endif - r = select (linein + 1, &s_input, &s_output, NULL, 0); - if (r <= 0) +# if 0 + FD_SET(1, &s_input); +# endif + gw_log (GW_LOG_DEBUG, prog, "select"); + r = select (linein + 1, &s_input, NULL, NULL, &t); + if (r < 0) { gw_log (GW_LOG_ERRNO|GW_LOG_FATAL, prog, "select"); exit(1); } - if (FD_ISSET (linein, &s_input)) + if (r == 0 || FD_ISSET (linein, &s_input)) { - data = read(linein, combuf, COMBUF); - if (data == 0) - break; - else if (data < 0) + if (r == 0) + gw_log (GW_LOG_DEBUG, prog, "poll"); + if ((data = read (linein, combuf, COMBUF)) > 0) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "read"); - exit (1); + if (combuf[data-1] == '\0') + { + --data; + eof_flag = 1; + } + gw_log (GW_LOG_DEBUG, prog, "Got %d bytes", data); + if (data > 0 && write(1, combuf, data) < data) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "write"); + exit (1); + } } - gw_log (GW_LOG_DEBUG, prog, "Got %d bytes", data); - if (write(1, combuf, data) < data) + else if (data == -1) { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "write"); - exit (1); + if (r > 0) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "read"); + exit (1); + } + gw_log (GW_LOG_DEBUG, prog, "poll read"); } + else + break; } - if (FD_ISSET (1, &s_output)) + if (eof_flag) + break; + if (r > 0 && FD_ISSET (1, &s_input)) { gw_log (GW_LOG_DEBUG, prog, "stdout closed"); break; } } #endif - if (data < 0) - { - gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, prog, "read"); - exit (1); - } gw_log (GW_LOG_DEBUG, prog, "Cleaning up."); close(linein); unlink(serverp);