X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=loaders.c;h=c0b6a2424a3f8974c05d1d2c3fe79284f6599f4c;hp=4c218510b9ff474b9653a936e8bfa572bd664784;hb=990fa0b0a3c506d266fab5d2016b43bbafaad547;hpb=6d1554928803b8cceb91a8e82de8ae3418c896f4 diff --git a/loaders.c b/loaders.c index 4c218510..c0b6a242 100644 --- a/loaders.c +++ b/loaders.c @@ -1,4 +1,4 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.3 2001/05/20 01:21:20 jongfoster Exp $"; +const char loaders_rcs[] = "$Id: loaders.c,v 1.8 2001/05/26 00:55:20 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loaders.c,v $ @@ -35,6 +35,30 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.3 2001/05/20 01:21:20 jongfoster * * Revisions : * $Log: loaders.c,v $ + * Revision 1.8 2001/05/26 00:55:20 jongfoster + * Removing duplicated code. load_forwardfile() now uses create_url_spec() + * + * Revision 1.7 2001/05/26 00:28:36 jongfoster + * Automatic reloading of config file. + * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). + * Most of the global variables have been moved to a new + * struct configuration_spec, accessed through csp->config->globalname + * Most of the globals remaining are used by the Win32 GUI. + * + * Revision 1.6 2001/05/23 12:27:33 oes + * + * Fixed ugly indentation of my last changes + * + * Revision 1.5 2001/05/23 10:39:05 oes + * - Added support for escaping the comment character + * in config files by a backslash + * - Added support for line continuation in config + * files + * - Fixed a buffer overflow bug with long config lines + * + * Revision 1.4 2001/05/22 18:56:28 oes + * CRLF -> LF + * * Revision 1.3 2001/05/20 01:21:20 jongfoster * Version 2.9.4 checkin. * - Merged popupfile and cookiefile, and added control over PCRS @@ -101,10 +125,6 @@ const char loaders_h_rcs[] = LOADERS_H_VERSION; #define ijb_isspace(__X) isspace((int)(unsigned char)(__X)) -#define NLOADERS 8 -static int (*loaders[NLOADERS])(struct client_state *); - - /* * Currently active files. * These are also entered in the main linked list of files. @@ -174,6 +194,13 @@ void sweep(void) { /* mark this client's files as active */ + /* + * Always have a configuration file. + * (Also note the slightly non-standard extra + * indirection here.) + */ + ncsp->config->config_file_list->active = 1; + if (ncsp->blist) /* block files */ { ncsp->blist->active = 1; @@ -643,9 +670,9 @@ static void unload_re_filterfile(void *f) * On error: 1 and sets newfl == NULL * *********************************************************************/ -static int check_file_changed(const struct file_list * current, - const char * filename, - struct file_list ** newfl) +int check_file_changed(const struct file_list * current, + const char * filename, + struct file_list ** newfl) { struct file_list *fs; struct stat statbuf[1]; @@ -709,8 +736,9 @@ static int check_file_changed(const struct file_list * current, * Function : read_config_line * * Description : Read a single non-empty line from a file and return - * it. Trims comments, leading and trailing whitespace. - * Also wites the file to fs->proxy_args. + * it. Trims comments, leading and trailing whitespace + * and respects escaping of newline and comment char. + * Also writes the file to fs->proxy_args. * * Parameters : * 1 : buf = Buffer to use. @@ -727,6 +755,9 @@ char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs) { char *p, *q; char linebuf[BUFSIZ]; + int contflag = 0; + + *buf = '\0'; while (fgets(linebuf, sizeof(linebuf), fp)) { @@ -743,17 +774,40 @@ char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs) } #endif /* ndef SPLIT_PROXY_ARGS */ - /* Trim off newline and any comment */ - if ((p = strpbrk(linebuf, "\r\n#")) != NULL) + /* Trim off newline */ + if ((p = strpbrk(linebuf, "\r\n")) != NULL) + { + *p = '\0'; + } + + /* Line continuation? Trim escape and set flag. */ + if ((p != linebuf) && (*--p == '\\')) { + contflag = 1; *p = '\0'; } + + /* If there's a comment char.. */ + if ((p = strpbrk(linebuf, "#")) != NULL) + { + /* ..and it's escaped, left-shift the line over the escape. */ + if ((p != linebuf) && (*(p-1) == '\\')) + { + q = p-1; + while ((*q++ = *p++) != '\0') /* nop */; + } + /* Else, chop off the rest of the line */ + else + { + *p = '\0'; + } + } /* Trim leading whitespace */ p = linebuf; while (*p && ijb_isspace(*p)) { - *p++; + p++; } if (*p) @@ -788,8 +842,16 @@ char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs) /* More paranoia. This if statement is always true. */ if (*linebuf) { - strcpy(buf, linebuf); - return buf; + strncat(buf, linebuf, buflen - strlen(buf)); + if (contflag) + { + contflag = 0; + continue; + } + else + { + return buf; + } } } } @@ -820,7 +882,7 @@ int load_aclfile(struct client_state *csp) struct access_control_list *a, *bl; struct file_list *fs; - if (!check_file_changed(current_aclfile, aclfile, &fs)) + if (!check_file_changed(current_aclfile, csp->config->aclfile, &fs)) { /* No need to load */ if (csp) @@ -842,7 +904,7 @@ int load_aclfile(struct client_state *csp) goto load_aclfile_error; } - fp = fopen(aclfile, "r"); + fp = fopen(csp->config->aclfile, "r"); if (fp == NULL) { @@ -929,7 +991,8 @@ int load_aclfile(struct client_state *csp) return(0); load_aclfile_error: - log_error(LOG_LEVEL_ERROR, "can't load access control list %s: %E", aclfile); + log_error(LOG_LEVEL_FATAL, "can't load access control list %s: %E", + csp->config->aclfile); return(-1); } @@ -957,7 +1020,7 @@ int load_blockfile(struct client_state *csp) int reject; struct file_list *fs; - if (!check_file_changed(current_blockfile, blockfile, &fs)) + if (!check_file_changed(current_blockfile, csp->config->blockfile, &fs)) { /* No need to load */ if (csp) @@ -977,7 +1040,7 @@ int load_blockfile(struct client_state *csp) goto load_blockfile_error; } - if ((fp = fopen(blockfile, "r")) == NULL) + if ((fp = fopen(csp->config->blockfile, "r")) == NULL) { goto load_blockfile_error; } @@ -1051,7 +1114,7 @@ int load_blockfile(struct client_state *csp) return(0); load_blockfile_error: - log_error(LOG_LEVEL_ERROR, "can't load blockfile '%s': %E", blockfile); + log_error(LOG_LEVEL_FATAL, "can't load blockfile '%s': %E", csp->config->blockfile); return(-1); } @@ -1079,7 +1142,7 @@ int load_imagefile(struct client_state *csp) int reject; struct file_list *fs; - if (!check_file_changed(current_imagefile, imagefile, &fs)) + if (!check_file_changed(current_imagefile, csp->config->imagefile, &fs)) { /* No need to load */ if (csp) @@ -1099,7 +1162,7 @@ int load_imagefile(struct client_state *csp) goto load_imagefile_error; } - if ((fp = fopen(imagefile, "r")) == NULL) + if ((fp = fopen(csp->config->imagefile, "r")) == NULL) { goto load_imagefile_error; } @@ -1173,7 +1236,7 @@ int load_imagefile(struct client_state *csp) return(0); load_imagefile_error: - log_error(LOG_LEVEL_ERROR, "can't load imagefile '%s': %E", imagefile); + log_error(LOG_LEVEL_FATAL, "can't load imagefile '%s': %E", csp->config->imagefile); return(-1); } @@ -1203,7 +1266,7 @@ int load_permissions_file(struct client_state *csp) struct file_list *fs; int i; - if (!check_file_changed(current_permissions_file, permissions_file, &fs)) + if (!check_file_changed(current_permissions_file, csp->config->permissions_file, &fs)) { /* No need to load */ if (csp) @@ -1223,7 +1286,7 @@ int load_permissions_file(struct client_state *csp) goto load_permissions_error; } - if ((fp = fopen(permissions_file, "r")) == NULL) + if ((fp = fopen(csp->config->permissions_file, "r")) == NULL) { goto load_permissions_error; } @@ -1234,7 +1297,7 @@ int load_permissions_file(struct client_state *csp) * * Reset it to default first. */ - default_permissions = PERMIT_RE_FILTER; + csp->config->default_permissions = PERMIT_RE_FILTER; while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) { @@ -1317,7 +1380,7 @@ int load_permissions_file(struct client_state *csp) /* a lines containing only "special" chars sets default */ if (*buf == '\0') { - default_permissions = permissions; + csp->config->default_permissions = permissions; continue; } @@ -1371,7 +1434,8 @@ int load_permissions_file(struct client_state *csp) return(0); load_permissions_error: - log_error(LOG_LEVEL_ERROR, "can't load permissions file '%s': %E", permissions_file); + log_error(LOG_LEVEL_FATAL, "can't load permissions file '%s': %E", + csp->config->permissions_file); return(-1); } @@ -1401,7 +1465,7 @@ int load_trustfile(struct client_state *csp) int reject, trusted; struct file_list *fs; - if (!check_file_changed(current_trustfile, trustfile, &fs)) + if (!check_file_changed(current_trustfile, csp->config->trustfile, &fs)) { /* No need to load */ if (csp) @@ -1421,12 +1485,12 @@ int load_trustfile(struct client_state *csp) goto load_trustfile_error; } - if ((fp = fopen(trustfile, "r")) == NULL) + if ((fp = fopen(csp->config->trustfile, "r")) == NULL) { goto load_trustfile_error; } - tl = trust_list; + tl = csp->config->trust_list; while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) { @@ -1514,7 +1578,8 @@ int load_trustfile(struct client_state *csp) return(0); load_trustfile_error: - log_error(LOG_LEVEL_ERROR, "can't load trustfile '%s': %E", trustfile); + log_error(LOG_LEVEL_FATAL, "can't load trustfile '%s': %E", + csp->config->trustfile); return(-1); } @@ -1540,12 +1605,11 @@ int load_forwardfile(struct client_state *csp) struct forward_spec *b, *bl; char buf[BUFSIZ], *p, *q, *tmp; char *vec[4]; - int port, n, reject; + int n, reject; struct file_list *fs; const struct gateway *gw; - struct url_spec url[1]; - if (!check_file_changed(current_forwardfile, forwardfile, &fs)) + if (!check_file_changed(current_forwardfile, csp->config->forwardfile, &fs)) { /* No need to load */ if (csp) @@ -1566,7 +1630,7 @@ int load_forwardfile(struct client_state *csp) goto load_forwardfile_error; } - if ((fp = fopen(forwardfile, "r")) == NULL) + if ((fp = fopen(csp->config->forwardfile, "r")) == NULL) { goto load_forwardfile_error; } @@ -1610,9 +1674,6 @@ int load_forwardfile(struct client_state *csp) /* allocate a new node */ if (((b = zalloc(sizeof(*b))) == NULL) -#ifdef REGEX - || ((b->url->preg = zalloc(sizeof(*b->url->preg))) == NULL) -#endif ) { fclose(fp); @@ -1623,77 +1684,14 @@ int load_forwardfile(struct client_state *csp) b->next = bl->next; bl->next = b; - /* save a copy of the orignal specification */ - if ((b->url->spec = strdup(buf)) == NULL) - { - fclose(fp); - goto load_forwardfile_error; - } - - b->reject = reject; - - if ((p = strchr(buf, '/'))) - { - b->url->path = strdup(p); - b->url->pathlen = strlen(b->url->path); - *p = '\0'; - } - else - { - b->url->path = NULL; - b->url->pathlen = 0; - } -#ifdef REGEX - if (b->url->path) - { - int errcode; - char rebuf[BUFSIZ]; - - sprintf(rebuf, "^(%s)", b->url->path); - - errcode = regcomp(b->url->preg, rebuf, - (REG_EXTENDED|REG_NOSUB|REG_ICASE)); - - if (errcode) - { - size_t errlen = regerror(errcode, b->url->preg, buf, sizeof(buf)); - - buf[errlen] = '\0'; - - log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", - b->url->spec, buf); - fclose(fp); - goto load_forwardfile_error; - } - } - else - { - freez(b->url->preg); - } -#endif - if ((p = strchr(buf, ':')) == NULL) - { - port = 0; - } - else - { - *p++ = '\0'; - port = atoi(p); - } - - b->url->port = port; - - if ((b->url->domain = strdup(buf)) == NULL) - { - fclose(fp); - goto load_forwardfile_error; - } - - /* split domain into components */ - *url = dsplit(b->url->domain); - b->url->dbuf = url->dbuf; - b->url->dcnt = url->dcnt; - b->url->dvec = url->dvec; + b->reject = reject; + + /* Save the URL pattern */ + if (create_url_spec(b->url, buf)) + { + fclose(fp); + goto load_forwardfile_error; + } /* now parse the gateway specs */ @@ -1783,7 +1781,8 @@ int load_forwardfile(struct client_state *csp) return(0); load_forwardfile_error: - log_error(LOG_LEVEL_ERROR, "can't load forwardfile '%s': %E", forwardfile); + log_error(LOG_LEVEL_FATAL, "can't load forwardfile '%s': %E", + csp->config->forwardfile); return(-1); } @@ -1815,7 +1814,7 @@ int load_re_filterfile(struct client_state *csp) int error; pcrs_job *dummy; - if (!check_file_changed(current_re_filterfile, re_filterfile, &fs)) + if (!check_file_changed(current_re_filterfile, csp->config->re_filterfile, &fs)) { /* No need to load */ if (csp) @@ -1836,7 +1835,7 @@ int load_re_filterfile(struct client_state *csp) } /* Open the file or fail */ - if ((fp = fopen(re_filterfile, "r")) == NULL) + if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL) { goto load_re_filterfile_error; } @@ -1888,7 +1887,8 @@ int load_re_filterfile(struct client_state *csp) return( 0 ); load_re_filterfile_error: - log_error(LOG_LEVEL_ERROR, "can't load re_filterfile '%s': %E", re_filterfile); + log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", + csp->config->re_filterfile); return(-1); } @@ -1905,19 +1905,21 @@ load_re_filterfile_error: * Parameters : * 1 : loader = pointer to a function that can parse and load * the appropriate config file. + * 2 : config = The configuration_spec to add the loader to. * * Returns : N/A * *********************************************************************/ -void add_loader(int (*loader)(struct client_state *)) +void add_loader(int (*loader)(struct client_state *), + struct configuration_spec * config) { int i; for (i=0; i < NLOADERS; i++) { - if (loaders[i] == NULL) + if (config->loaders[i] == NULL) { - loaders[i] = loader; + config->loaders[i] = loader; break; } } @@ -1936,6 +1938,8 @@ void add_loader(int (*loader)(struct client_state *)) * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) + * Must be non-null. Reads: "csp->config" + * Writes: various data members. * * Returns : 0 => Ok, everything else is an error. * @@ -1947,34 +1951,17 @@ int run_loader(struct client_state *csp) for (i=0; i < NLOADERS; i++) { - if (loaders[i] == NULL) + if (csp->config->loaders[i] == NULL) { break; } - ret |= (loaders[i])(csp); + ret |= (csp->config->loaders[i])(csp); } return(ret); } -/********************************************************************* - * - * Function : remove_all_loaders - * - * Description : Remove all loaders from the list. - * - * Parameters : N/A - * - * Returns : N/A - * - *********************************************************************/ -void remove_all_loaders(void) -{ - memset( loaders, 0, sizeof( loaders ) ); -} - - /* Local Variables: tab-width: 3