X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=jcc.c;h=28ee02b42763a8656d17f7bef63126de1abc8801;hp=4a8c0e3b5aca8ba03f25a6e0043c31b006789548;hb=426f0650549b9cb1f4275d72efb4ae3ac1acce8e;hpb=3b4c42fc99e2521e23f452a3cde320fa93f9f8cb diff --git a/jcc.c b/jcc.c index 4a8c0e3b..28ee02b4 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.58 2001/11/30 23:37:24 jongfoster Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.65 2002/03/03 14:49:11 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -33,6 +33,32 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.58 2001/11/30 23:37:24 jongfoster Exp $"; * * Revisions : * $Log: jcc.c,v $ + * Revision 1.65 2002/03/03 14:49:11 oes + * Fixed CLF logging: Now uses client's original HTTP request + * + * Revision 1.64 2002/03/03 09:18:03 joergs + * Made jumbjuster work on AmigaOS again. + * + * Revision 1.63 2002/03/02 04:14:50 david__schmidt + * Clean up a little CRLF unpleasantness that suddenly appeared + * + * 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" @@ -454,6 +480,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; @@ -502,6 +529,44 @@ static const char VANILLA_WAFER[] = "(copyright_or_otherwise)_applying_to_any_cookie._"; +#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) +/********************************************************************* + * + * 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: + log_error(LOG_LEVEL_INFO, "ignoring HUP signal (%d)", signal); + 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 @@ -708,10 +773,27 @@ 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"); + } + } + + /* + * Save a copy of the original request for logging + */ + http->ocmd = strdup(http->cmd); + + if (http->ocmd == NULL) + { + log_error(LOG_LEVEL_FATAL, "Out of memory copying HTTP request line"); } /* @@ -722,21 +804,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); @@ -828,7 +914,7 @@ static void chat(struct client_state *csp) /* Log (FIXME: All intercept reasons apprear as "crunch" with Status 200) */ log_error(LOG_LEVEL_GPC, "%s%s crunch!", http->hostport, http->path); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->cmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->ocmd); /* Clean up and return */ free_http_response(rsp); @@ -861,14 +947,14 @@ static void chat(struct client_state *csp) rsp = error_response(csp, "no-such-domain", errno); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", - csp->ip_addr_str, http->cmd); + csp->ip_addr_str, http->ocmd); } else { rsp = error_response(csp, "connect-failed", errno); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->cmd); + csp->ip_addr_str, http->ocmd); } @@ -889,6 +975,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)) @@ -906,7 +998,7 @@ static void chat(struct client_state *csp) http->hostport); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->cmd); + csp->ip_addr_str, http->ocmd); rsp = error_response(csp, "connect-failed", errno); @@ -932,7 +1024,7 @@ static void chat(struct client_state *csp) * client, flush the rest, and get out of the way. */ log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", - csp->ip_addr_str, http->cmd); + csp->ip_addr_str, http->ocmd); if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1) < 0) { @@ -1006,7 +1098,7 @@ static void chat(struct client_state *csp) log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host); log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->cmd); + csp->ip_addr_str, http->ocmd); rsp = error_response(csp, "connect-failed", errno); @@ -1077,6 +1169,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) @@ -1131,6 +1229,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; @@ -1219,6 +1323,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 @@ -1302,7 +1412,7 @@ static void chat(struct client_state *csp) } log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", - csp->ip_addr_str, http->cmd, byte_count); + csp->ip_addr_str, http->ocmd, byte_count); } @@ -1392,9 +1502,7 @@ int main(int argc, const char *argv[]) int argc_pos = 1; configfile = -#ifdef AMIGA - "AmiTCP:db/junkbuster/config" -#elif !defined(_WIN32) +#if !defined(_WIN32) "config" #else "config.txt" @@ -1471,9 +1579,45 @@ int main(int argc, const char *argv[]) #endif -#if !defined(_WIN32) && !defined(__OS2__) - signal(SIGPIPE, SIG_IGN); - signal(SIGCHLD, SIG_IGN); +#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) +{ + 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 @@ -1558,6 +1702,7 @@ int main(int argc, const char *argv[]) #endif /* _DEBUG */ chdir("/"); + writePidFile(); } #endif /* defined unix */