X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=jcc.c;h=46c6db43ce6dd64ff797ac4f5d68b4050f7f38d0;hp=0d52ac628e0c319c32e29f4f49cc5c60b3345d6e;hb=d7b73a30a319e3e67ec17f4d7920f4d45d4a3497;hpb=3d97de9b8598a051b93beafd8f0adb5235023b3b diff --git a/jcc.c b/jcc.c index 0d52ac62..46c6db43 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.57 2001/11/16 00:47:43 jongfoster Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.62 2002/02/20 23:17:23 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -33,6 +33,27 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.57 2001/11/16 00:47:43 jongfoster Exp $"; * * Revisions : * $Log: jcc.c,v $ + * Revision 1.62 2002/02/20 23:17:23 jongfoster + * Detecting some out-of memory conditions and exiting with a log message. + * + * Revision 1.61 2002/01/17 21:01:52 jongfoster + * Moving all our URL and URL pattern parsing code to urlmatch.c. + * + * Revision 1.60 2001/12/30 14:07:32 steudten + * - Add signal handling (unix) + * - Add SIGHUP handler (unix) + * - Add creation of pidfile (unix) + * - Add action 'top' in rc file (RH) + * - Add entry 'SIGNALS' to manpage + * - Add exit message to logfile (unix) + * + * Revision 1.59 2001/12/13 14:07:18 oes + * Fixed Bug: 503 error page now sent OK + * + * Revision 1.58 2001/11/30 23:37:24 jongfoster + * Renaming the Win32 config file to config.txt - this is almost the + * same as the corresponding UNIX name "config" + * * Revision 1.57 2001/11/16 00:47:43 jongfoster * Changing the tty-disconnection code to use setsid(). * @@ -450,6 +471,7 @@ int ldebug = 0; #include "actions.h" #include "cgi.h" #include "loadcfg.h" +#include "urlmatch.h" const char jcc_h_rcs[] = JCC_H_VERSION; const char project_h_rcs[] = PROJECT_H_VERSION; @@ -457,6 +479,8 @@ const char project_h_rcs[] = PROJECT_H_VERSION; struct client_state clients[1]; struct file_list files[1]; +short int MustReload = 0; + #ifdef FEATURE_STATISTICS int urls_read = 0; /* total nr of urls read inc rejected */ int urls_rejected = 0; /* total nr of urls rejected */ @@ -498,6 +522,44 @@ static const char VANILLA_WAFER[] = "(copyright_or_otherwise)_applying_to_any_cookie._"; +#if !defined(_WIN32) && !defined(__OS2__) +/********************************************************************* + * + * Function : SIG_handler + * + * Description : Signal handler for different signals. + * see man kill, signal .. + * + * Parameters : + * 1 : signal - the signal cause this function to call + * + * Returns : - + * + *********************************************************************/ +static void SIG_handler( int signal ) +{ + switch( signal ) + { + case SIGHUP: + MustReload = 1; + break; + case SIGTERM: + log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", signal); + +#if defined(unix) + deletePidFile(); +#endif /* unix */ + + exit( signal ); + break; + + default: + /* want to exit jb so use FATAL */ + log_error(LOG_LEVEL_FATAL, "SIG_handler: receive signal %d without handler.", signal); + } + return; +} +#endif /********************************************************************* * * Function : chat @@ -704,10 +766,17 @@ static void chat(struct client_state *csp) * Downgrade http version from 1.1 to 1.0 if +downgrade * action applies */ - if (!strcmpic(http->ver, "HTTP/1.1") && csp->action->flags & ACTION_DOWNGRADE) + if ( (http->ssl == 0) + && (!strcmpic(http->ver, "HTTP/1.1")) + && (csp->action->flags & ACTION_DOWNGRADE)) { freez(http->ver); http->ver = strdup("HTTP/1.0"); + + if (http->ver == NULL) + { + log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version"); + } } /* @@ -718,21 +787,25 @@ static void chat(struct client_state *csp) { freez(http->cmd); - http->cmd = strsav(http->cmd, http->gpc); - http->cmd = strsav(http->cmd, " "); + http->cmd = strdup(http->gpc); + string_append(&http->cmd, " "); if (fwd->forward_host) { - http->cmd = strsav(http->cmd, http->url); + string_append(&http->cmd, http->url); } else { - http->cmd = strsav(http->cmd, http->path); + string_append(&http->cmd, http->path); } - http->cmd = strsav(http->cmd, " "); - http->cmd = strsav(http->cmd, http->ver); + string_append(&http->cmd, " "); + string_append(&http->cmd, http->ver); + if (http->cmd == NULL) + { + log_error(LOG_LEVEL_FATAL, "Out of memory rewiting SSL command"); + } } enlist(csp->headers, http->cmd); @@ -867,6 +940,7 @@ static void chat(struct client_state *csp) csp->ip_addr_str, http->cmd); } + /* Write the answer to the client */ if(rsp) { @@ -884,6 +958,12 @@ static void chat(struct client_state *csp) log_error(LOG_LEVEL_CONNECT, "OK"); hdr = sed(client_patterns, add_client_headers, csp); + if (hdr == NULL) + { + /* FIXME Should handle error properly */ + log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header"); + } + list_remove_all(csp->headers); if (fwd->forward_host || (http->ssl == 0)) @@ -907,7 +987,7 @@ static void chat(struct client_state *csp) if(rsp) { - if ((write_socket(csp->cfd, rsp->head, n) != n) + if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length) || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); @@ -1072,6 +1152,12 @@ static void chat(struct client_state *csp) } hdr = sed(server_patterns, add_server_headers, csp); + if (hdr == NULL) + { + /* FIXME Should handle error properly */ + log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); + } + n = strlen(hdr); if ((write_socket(csp->cfd, hdr, n) != n) @@ -1126,6 +1212,12 @@ static void chat(struct client_state *csp) log_error(LOG_LEVEL_ERROR, "Buffer size limit reached! Flushing and stepping back."); hdr = sed(server_patterns, add_server_headers, csp); + if (hdr == NULL) + { + /* FIXME Should handle error properly */ + log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); + } + n = strlen(hdr); byte_count += n; @@ -1214,6 +1306,12 @@ static void chat(struct client_state *csp) */ hdr = sed(server_patterns, add_server_headers, csp); + if (hdr == NULL) + { + /* FIXME Should handle error properly */ + log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); + } + n = strlen(hdr); /* write the server's (modified) header to @@ -1467,8 +1565,44 @@ int main(int argc, const char *argv[]) #if !defined(_WIN32) && !defined(__OS2__) - signal(SIGPIPE, SIG_IGN); - signal(SIGCHLD, SIG_IGN); +{ + int sig; + struct sigaction action; + + for ( sig = 1; sig < 16; sig++ ) + { + switch( sig ) + { + case 9: + case SIGPIPE: + case SIGCHLD: + case SIGHUP: + continue; + } + if ( signal(sig, SIG_handler) == SIG_ERR ) + log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", sig); + } + /* SIG_IGN */ + if ( signal(SIGPIPE, SIG_IGN) == SIG_ERR ) + log_error(LOG_LEVEL_FATAL, "Can't set SIG_IGN to SIGPIPE: %E"); + if ( signal(SIGCHLD, SIG_IGN) == SIG_ERR ) + log_error(LOG_LEVEL_FATAL, "Can't set SIG_IGN to SIGCHLD: %E"); + /* log file reload */ + if (!sigaction(SIGHUP,NULL,&action)) + { + action.sa_handler = &SIG_handler; + action.sa_flags = SA_RESTART; + + if ( sigaction(SIGHUP,&action,NULL)) + log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal SIGHUP: %E"); + } + else + { + perror("sigaction"); + log_error(LOG_LEVEL_FATAL, "Can't get sigaction data for signal SIGHUP"); + } + +} #else /* ifdef _WIN32 */ # ifdef _WIN_CONSOLE @@ -1553,6 +1687,7 @@ int main(int argc, const char *argv[]) #endif /* _DEBUG */ chdir("/"); + writePidFile(); } #endif /* defined unix */