-const char loaders_rcs[] = "$Id: loaders.c,v 1.14 2001/06/01 03:27:04 oes Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.27 2001/09/22 16:36:59 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/loaders.c,v $
*
* Revisions :
* $Log: loaders.c,v $
+ * Revision 1.27 2001/09/22 16:36:59 jongfoster
+ * Removing unused parameter fs from read_config_line()
+ *
+ * Revision 1.26 2001/09/22 14:05:22 jongfoster
+ * Bugfix: Multiple escaped "#" characters in a configuration
+ * file are now permitted.
+ * Also removing 3 unused headers.
+ *
+ * Revision 1.25 2001/09/13 22:44:03 jongfoster
+ * Adding {} to an if statement
+ *
+ * Revision 1.24 2001/07/30 22:08:36 jongfoster
+ * Tidying up #defines:
+ * - All feature #defines are now of the form FEATURE_xxx
+ * - Permanently turned off WIN_GUI_EDIT
+ * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
+ *
+ * Revision 1.23 2001/07/20 15:51:54 oes
+ * Fixed indentation of prepocessor commands
+ *
+ * Revision 1.22 2001/07/20 15:16:17 haroon
+ * - per Guy's suggestion, added a while loop in sweep() to catch not just
+ * the last inactive CSP but all other consecutive inactive CSPs after that
+ * as well
+ *
+ * Revision 1.21 2001/07/18 17:26:24 oes
+ * Changed to conform to new pcrs interface
+ *
+ * Revision 1.20 2001/07/17 13:07:01 oes
+ * Fixed segv when last line in config files
+ * lacked a terminating (\r)\n
+ *
+ * Revision 1.19 2001/07/13 14:01:54 oes
+ * Removed all #ifdef PCRS
+ *
+ * Revision 1.18 2001/06/29 21:45:41 oes
+ * Indentation, CRLF->LF, Tab-> Space
+ *
+ * Revision 1.17 2001/06/29 13:31:51 oes
+ * Various adaptions
+ *
+ * Revision 1.16 2001/06/09 10:55:28 jongfoster
+ * Changing BUFSIZ ==> BUFFER_SIZE
+ *
+ * Revision 1.15 2001/06/07 23:14:14 jongfoster
+ * Removing ACL and forward file loaders - these
+ * files have been merged into the config file.
+ * Cosmetic: Moving unloader funcs next to their
+ * respective loader funcs
+ *
* Revision 1.14 2001/06/01 03:27:04 oes
* Fixed line continuation problem
*
#include "project.h"
#include "list.h"
#include "loaders.h"
-#include "encode.h"
#include "filters.h"
#include "parsers.h"
#include "jcc.h"
-#include "ssplit.h"
#include "miscutil.h"
#include "errlog.h"
-#include "gateway.h"
#include "actions.h"
-#ifndef SPLIT_PROXY_ARGS
-/* For strsav */
-#include "showargs.h"
-#endif /* ndef SPLIT_PROXY_ARGS */
-
const char loaders_h_rcs[] = LOADERS_H_VERSION;
/* Fix a problem with Solaris. There should be no effect on other
* These are also entered in the main linked list of files.
*/
-#ifdef TRUST_FILES
+#ifdef FEATURE_TRUST
static struct file_list *current_trustfile = NULL;
-#endif /* def TRUST_FILES */
+#endif /* def FEATURE_TRUST */
-#ifdef PCRS
static struct file_list *current_re_filterfile = NULL;
-#endif /* def PCRS */
+
/*********************************************************************
for (csp = clients; csp && (ncsp = csp->next) ; csp = csp->next)
{
- if (ncsp->active)
+ if (ncsp->flags & CSP_FLAG_ACTIVE)
{
/* mark this client's files as active */
ncsp->actions_list->active = 1;
}
-#ifdef PCRS
- if (ncsp->rlist) /* perl re files */
+ if (ncsp->rlist) /* pcrsjob files */
{
ncsp->rlist->active = 1;
}
-#endif /* def PCRS */
-#ifdef TRUST_FILES
+#ifdef FEATURE_TRUST
if (ncsp->tlist) /* trust files */
{
ncsp->tlist->active = 1;
}
-#endif /* def TRUST_FILES */
+#endif /* def FEATURE_TRUST */
}
else
+ /*
+ * this client is not active, release its resources
+ * and the ones of all inactive clients that might
+ * follow it
+ */
{
- /* this client one is not active, release its resources */
- csp->next = ncsp->next;
-
- freez(ncsp->ip_addr_str);
-#ifdef TRUST_FILES
- freez(ncsp->referrer);
-#endif /* def TRUST_FILES */
- freez(ncsp->x_forwarded);
- freez(ncsp->iob->buf);
-
- free_http_request(ncsp->http);
-
- destroy_list(ncsp->headers);
- destroy_list(ncsp->cookie_list);
-
- free_current_action(ncsp->action);
-
-#ifdef STATISTICS
- urls_read++;
- if (ncsp->rejected)
+ while (!(ncsp->flags & CSP_FLAG_ACTIVE))
{
- urls_rejected++;
+ csp->next = ncsp->next;
+
+ freez(ncsp->ip_addr_str);
+ freez(ncsp->my_ip_addr_str);
+ freez(ncsp->my_hostname);
+
+#ifdef FEATURE_TRUST
+ freez(ncsp->referrer);
+#endif /* def FEATURE_TRUST */
+ freez(ncsp->x_forwarded);
+ freez(ncsp->iob->buf);
+
+ free_http_request(ncsp->http);
+
+ destroy_list(ncsp->headers);
+ destroy_list(ncsp->cookie_list);
+
+ free_current_action(ncsp->action);
+
+#ifdef FEATURE_STATISTICS
+ urls_read++;
+ if (ncsp->flags & CSP_FLAG_REJECTED)
+ {
+ urls_rejected++;
+ }
+#endif /* def FEATURE_STATISTICS */
+
+ freez(ncsp);
+
+ /* are there any more in sequence after it? */
+ if( !(ncsp = csp->next) )
+ break;
}
-#endif /* def STATISTICS */
-
- freez(ncsp);
}
}
(nfl->unloader)(nfl->f);
-#ifndef SPLIT_PROXY_ARGS
- freez(nfl->proxy_args);
-#endif /* ndef SPLIT_PROXY_ARGS */
-
freez(nfl->filename);
freez(nfl);
if (url->path)
{
int errcode;
- char rebuf[BUFSIZ];
+ char rebuf[BUFFER_SIZE];
if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
{
(REG_EXTENDED|REG_NOSUB|REG_ICASE));
if (errcode)
{
- size_t errlen =
- regerror(errcode,
- url->preg, buf, sizeof(buf));
+ size_t errlen = regerror(errcode,
+ url->preg, buf, sizeof(buf));
buf[errlen] = '\0';
log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
- url->spec, buf);
+ url->spec, buf);
freez(url->spec);
freez(url->path);
url->unanchored = tmp_url->unanchored;
return 0; /* OK */
+
}
* This will be set to NULL, OR a struct
* file_list newly allocated on the
* heap, with the filename and lastmodified
- * fields filled, standard header giving file
- * name in proxy_args, and all others zeroed.
- * (proxy_args is only filled in if !defined
- * SPLIT_PROXY_ARGS and !suppress_blocklists).
+ * fields filled, and all others zeroed.
*
* Returns : If file unchanged: 0 (and sets newfl == NULL)
* If file changed: 1 and sets newfl != NULL
return 1;
}
-#ifndef SPLIT_PROXY_ARGS
- if (!suppress_blocklists)
- {
- char * p = html_encode(filename);
- if (p)
- {
- fs->proxy_args = strsav(fs->proxy_args, "<h2>The file `");
- fs->proxy_args = strsav(fs->proxy_args, p);
- fs->proxy_args = strsav(fs->proxy_args,
- "' contains the following patterns</h2>\n");
- freez(p);
- }
- fs->proxy_args = strsav(fs->proxy_args, "<pre>");
- }
-#endif /* ndef SPLIT_PROXY_ARGS */
*newfl = fs;
return 1;
+
}
* Description : Read a single non-empty line from a file and return
* 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.
* 2 : buflen = Size of buffer in bytes.
* 3 : fp = File to read from
- * 4 : fs = File will be written to fs->proxy_args. May
- * be NULL to disable this feature.
*
* Returns : NULL on EOF or error
* Otherwise, returns buf.
*
*********************************************************************/
-char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs)
+char *read_config_line(char *buf, int buflen, FILE *fp)
{
- char *p, *q;
- char linebuf[BUFSIZ];
+ char *p;
+ char *src;
+ char *dest;
+ char linebuf[BUFFER_SIZE];
int contflag = 0;
*buf = '\0';
while (fgets(linebuf, sizeof(linebuf), fp))
{
-#ifndef SPLIT_PROXY_ARGS
- if (fs && !suppress_blocklists)
- {
- char *html_line = html_encode(linebuf);
- if (html_line != NULL)
- {
- fs->proxy_args = strsav(fs->proxy_args, html_line);
- freez(html_line);
- }
- fs->proxy_args = strsav(fs->proxy_args, "<br>");
- }
-#endif /* ndef SPLIT_PROXY_ARGS */
-
/* Trim off newline */
if ((p = strpbrk(linebuf, "\r\n")) != NULL)
{
*p = '\0';
}
+ else
+ {
+ p = linebuf + strlen(linebuf);
+ }
/* Line continuation? Trim escape and set flag. */
if ((p != linebuf) && (*--p == '\\'))
}
/* If there's a comment char.. */
- if ((p = strpbrk(linebuf, "#")) != NULL)
+ p = linebuf;
+ while ((p = strchr(p, '#')) != 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 */;
+ src = p;
+ dest = p - 1;
+ while ((*dest++ = *src++) != '\0')
+ {
+ /* nop */
+ }
+ /* Now scan from just after the "#". */
}
/* Else, chop off the rest of the line */
else
if (contflag)
{
contflag = 0;
- continue;
+ continue;
}
/* Remove leading and trailing whitespace */
}
-#ifdef TRUST_FILES
+#ifdef FEATURE_TRUST
/*********************************************************************
*
* Function : unload_trustfile
struct block_spec *b = (struct block_spec *)f;
if (b == NULL) return;
- unload_trustfile(b->next);
+ unload_trustfile(b->next); /* Stack is cheap, isn't it? */
free_url(b->url);
struct block_spec *b, *bl;
struct url_spec **tl;
- char buf[BUFSIZ], *p, *q;
+ char buf[BUFFER_SIZE], *p, *q;
int reject, trusted;
struct file_list *fs;
tl = csp->config->trust_list;
- while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
+ while (read_config_line(buf, sizeof(buf), fp) != NULL)
{
trusted = 0;
reject = 1;
fclose(fp);
-#ifndef SPLIT_PROXY_ARGS
- if (!suppress_blocklists)
- {
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- }
-#endif /* ndef SPLIT_PROXY_ARGS */
-
/* the old one is now obsolete */
if (current_trustfile)
{
return(-1);
}
-#endif /* def TRUST_FILES */
+#endif /* def FEATURE_TRUST */
-#ifdef PCRS
/*********************************************************************
*
* Function : unload_re_filterfile
*********************************************************************/
static void unload_re_filterfile(void *f)
{
- pcrs_job *joblist;
struct re_filterfile_spec *b = (struct re_filterfile_spec *)f;
- if (b == NULL) return;
+ if (b == NULL)
+ {
+ return;
+ }
destroy_list(b->patterns);
-
- joblist = b->joblist;
- while ( NULL != (joblist = pcrs_free_job(joblist)) ) {}
-
+ pcrs_free_joblist(b->joblist);
freez(b);
+ return;
}
/*********************************************************************
struct re_filterfile_spec *bl;
struct file_list *fs;
- char buf[BUFSIZ];
+ char buf[BUFFER_SIZE];
int error;
pcrs_job *dummy;
}
/* Read line by line */
- while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
+ while (read_config_line(buf, sizeof(buf), fp) != NULL)
{
enlist( bl->patterns, buf );
/* We have a meaningful line -> make it a job */
- if ((dummy = pcrs_make_job(buf, &error)) == NULL)
+ if ((dummy = pcrs_compile_command(buf, &error)) == NULL)
{
log_error(LOG_LEVEL_RE_FILTER,
"Adding re_filter job %s failed with error %d.", buf, error);
fclose(fp);
-#ifndef SPLIT_PROXY_ARGS
- if (!suppress_blocklists)
- {
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- }
-#endif /* ndef SPLIT_PROXY_ARGS */
-
/* the old one is now obsolete */
if ( NULL != current_re_filterfile )
{
return(-1);
}
-#endif /* def PCRS */
/*********************************************************************