X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=loaders.c;h=f63b9168a9cb7ca04e89eeabc9e27ab957fb2337;hp=70361585d6f6efdc50c096de820d8f919ffa8561;hb=60b20d7161793595eeba33187d8d0221d0faf147;hpb=52bd067225c1e12ecf7156e5707161ed7df8e8c4 diff --git a/loaders.c b/loaders.c index 70361585..f63b9168 100644 --- a/loaders.c +++ b/loaders.c @@ -1,4 +1,4 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.40 2002/03/08 17:46:04 jongfoster Exp $"; +const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loaders.c,v $ @@ -9,7 +9,7 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.40 2002/03/08 17:46:04 jongfoster * unload files that are no longer in use. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * IJBSWA team. http://ijbswa.sourceforge.net + * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,6 +35,28 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.40 2002/03/08 17:46:04 jongfoster * * Revisions : * $Log: loaders.c,v $ + * Revision 1.46 2002/03/24 13:25:43 swa + * name change related issues + * + * Revision 1.45 2002/03/16 23:54:06 jongfoster + * Adding graceful termination feature, to help look for memory leaks. + * If you enable this (which, by design, has to be done by hand + * editing config.h) and then go to http://i.j.b/die, then the program + * will exit cleanly after the *next* request. It should free all the + * memory that was used. + * + * Revision 1.44 2002/03/16 21:51:00 jongfoster + * Fixing free(NULL). + * + * Revision 1.43 2002/03/16 20:28:34 oes + * Added descriptions to the filters so users will know what they select in the cgi editor + * + * Revision 1.42 2002/03/13 00:27:05 jongfoster + * Killing warnings + * + * Revision 1.41 2002/03/12 01:42:50 oes + * Introduced modular filters + * * Revision 1.40 2002/03/08 17:46:04 jongfoster * Fixing int/size_t warnings * @@ -310,7 +332,7 @@ void sweep(void) fl->active = 0; } - for (csp = clients; csp && (ncsp = csp->next) ; csp = csp->next) + for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next) { if (ncsp->flags & CSP_FLAG_ACTIVE) { @@ -376,13 +398,13 @@ void sweep(void) freez(ncsp); /* are there any more in sequence after it? */ - if( !(ncsp = csp->next) ) + if( (ncsp = csp->next) == NULL) break; } } } - for (fl = files; fl && (nfl = fl->next) ; fl = fl->next) + for (fl = files; fl && ((nfl = fl->next) != NULL) ; fl = fl->next) { if ( ( 0 == nfl->active ) && ( NULL != nfl->unloader ) ) { @@ -519,7 +541,7 @@ jb_err simple_read_line(FILE *fp, char **dest, int *newline) #define CHAR_CR '\r' /* ASCII 13 */ #define CHAR_LF '\n' /* ASCII 10 */ - while (FOREVER) + for (;;) { ch = fgetc(fp); if (ch == EOF) @@ -839,9 +861,9 @@ jb_err edit_read_line(FILE *fp, * the caller cares about "raw" or just "data"). */ - free(raw); - free(prefix); - free(data); + freez(raw); + freez(prefix); + freez(data); return JB_ERR_FILE; } @@ -858,7 +880,7 @@ jb_err edit_read_line(FILE *fp, } else { - free(raw); + freez(raw); } if (prefix_out) { @@ -866,7 +888,7 @@ jb_err edit_read_line(FILE *fp, } else { - free(prefix); + freez(prefix); } if (data_out) { @@ -874,7 +896,7 @@ jb_err edit_read_line(FILE *fp, } else { - free(data); + freez(data); } return JB_ERR_OK; } @@ -939,16 +961,44 @@ char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenu *********************************************************************/ static void unload_trustfile(void *f) { - struct block_spec *b = (struct block_spec *)f; - if (b == NULL) return; + struct block_spec *cur = (struct block_spec *)f; + struct block_spec *next; + + while (cur != NULL) + { + next = cur->next; - unload_trustfile(b->next); /* Stack is cheap, isn't it? */ + free_url_spec(cur->url); + free(cur); + + cur = next; + } - free_url_spec(b->url); +} - freez(b); +#ifdef FEATURE_GRACEFUL_TERMINATION +/********************************************************************* + * + * Function : unload_current_trust_file + * + * Description : Unloads current trust file - reset to state at + * beginning of program. + * + * Parameters : None + * + * Returns : N/A + * + *********************************************************************/ +void unload_current_trust_file(void) +{ + if (current_trustfile) + { + current_trustfile->unloader = unload_trustfile; + current_trustfile = NULL; + } } +#endif /* FEATURE_GRACEFUL_TERMINATION */ /********************************************************************* @@ -1018,7 +1068,7 @@ int load_trustfile(struct client_state *csp) reject = 0; p = buf; q = p+1; - while ((*p++ = *q++)) + while ((*p++ = *q++) != '\0') { /* nop */ } @@ -1113,6 +1163,8 @@ static void unload_re_filterfile(void *f) destroy_list(b->patterns); pcrs_free_joblist(b->joblist); + freez(b->name); + freez(b->description); freez(b); b = a; @@ -1122,6 +1174,30 @@ static void unload_re_filterfile(void *f) } +#ifdef FEATURE_GRACEFUL_TERMINATION +/********************************************************************* + * + * Function : unload_current_re_filterfile + * + * Description : Unloads current re_filter file - reset to state at + * beginning of program. + * + * Parameters : None + * + * Returns : N/A + * + *********************************************************************/ +void unload_current_re_filterfile(void) +{ + if (current_re_filterfile) + { + current_re_filterfile->unloader = unload_re_filterfile; + current_re_filterfile = NULL; + } +} +#endif + + /********************************************************************* * * Function : load_re_filterfile @@ -1141,7 +1217,7 @@ int load_re_filterfile(struct client_state *csp) { FILE *fp; - struct re_filterfile_spec *bl, *new_bl; + struct re_filterfile_spec *new_bl, *bl = NULL; struct file_list *fs; char buf[BUFFER_SIZE]; @@ -1165,21 +1241,6 @@ int load_re_filterfile(struct client_state *csp) goto load_re_filterfile_error; } - /* - * Allocate the first re_filterfile_spec struct - */ - fs->f = bl = (struct re_filterfile_spec *)zalloc(sizeof(*bl)); - if (bl == NULL) - { - goto load_re_filterfile_error; - } - - /* - * Initialize the name in case there are - * expressions before the first block header - */ - bl->filtername = "default"; - /* * Open the file or fail */ @@ -1204,12 +1265,38 @@ int load_re_filterfile(struct client_state *csp) { goto load_re_filterfile_error; } + + new_bl->name = chomp(buf + 7); + + if (NULL != (new_bl->description = strchr(new_bl->name, ' '))) + { + *new_bl->description++ = '\0'; + new_bl->description = strdup(chomp(new_bl->description)); + } + else + { + new_bl->description = strdup("No description available for this filter"); + } + + new_bl->name = strdup(chomp(new_bl->name)); + + /* + * If this is the first filter block, chain it + * to the file_list rather than its (nonexistant) + * predecessor + */ + if (fs->f == NULL) + { + fs->f = new_bl; + } else { - new_bl->filtername = strdup(chomp(buf + 7)); bl->next = new_bl; - bl = new_bl; } + bl = new_bl; + + log_error(LOG_LEVEL_RE_FILTER, "Reading in filter \"%s\" (\"%s\")", bl->name, bl->description); + continue; } @@ -1217,19 +1304,26 @@ int load_re_filterfile(struct client_state *csp) * Else, save the expression, make it a pcrs_job * and chain it into the current filter's joblist */ - enlist(bl->patterns, buf); - - if ((dummy = pcrs_compile_command(buf, &error)) == NULL) + if (bl != NULL) { - log_error(LOG_LEVEL_RE_FILTER, - "Adding re_filter job %s to filter %s failed with error %d.", buf, bl->filtername, error); - continue; + enlist(bl->patterns, buf); + + if ((dummy = pcrs_compile_command(buf, &error)) == NULL) + { + log_error(LOG_LEVEL_RE_FILTER, + "Adding re_filter job %s to filter %s failed with error %d.", buf, bl->name, error); + continue; + } + else + { + dummy->next = bl->joblist; + bl->joblist = dummy; + log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s to filter %s succeeded.", buf, bl->name); + } } else { - dummy->next = bl->joblist; - bl->joblist = dummy; - log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s to filter %s succeeded.", buf, bl->filtername); + log_error(LOG_LEVEL_ERROR, "Ignoring job %s outside filter block in %s, line %d", buf, csp->config->re_filterfile, linenum); } }