-const char loaders_rcs[] = "$Id: loaders.c,v 1.21 2001/07/18 17:26:24 oes Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.28 2001/10/07 15:40:39 oes Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/loaders.c,v $
*
* Revisions :
* $Log: loaders.c,v $
+ * Revision 1.28 2001/10/07 15:40:39 oes
+ * Replaced 6 boolean members of csp with one bitmap (csp->flags)
+ *
+ * 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
*
#include <errno.h>
#include <sys/stat.h>
#include <ctype.h>
+#include <assert.h>
#ifndef _WIN32
#include <unistd.h>
#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"
const char loaders_h_rcs[] = LOADERS_H_VERSION;
* 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 */
static struct file_list *current_re_filterfile = NULL;
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->rlist->active = 1;
}
-#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 */
+ /*
+ * this client is not active, release its resources
+ * and the ones of all inactive clients that might
+ * follow it
+ */
{
- while( !ncsp->active )
+ while (!(ncsp->flags & CSP_FLAG_ACTIVE))
{
csp->next = ncsp->next;
freez(ncsp->my_ip_addr_str);
freez(ncsp->my_hostname);
- #ifdef TRUST_FILES
+#ifdef FEATURE_TRUST
freez(ncsp->referrer);
- #endif /* def TRUST_FILES */
+#endif /* def FEATURE_TRUST */
freez(ncsp->x_forwarded);
freez(ncsp->iob->buf);
destroy_list(ncsp->cookie_list);
free_current_action(ncsp->action);
-
- #ifdef STATISTICS
+
+#ifdef FEATURE_STATISTICS
urls_read++;
- if (ncsp->rejected)
+ if (ncsp->flags & CSP_FLAG_REJECTED)
{
urls_rejected++;
}
- #endif /* def STATISTICS */
+#endif /* def FEATURE_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);
* function fails, the contents of the buffer
* are lost forever.
*
- * Returns : 0 => Ok, everything else is an error.
+ * Returns : JB_ERR_OK - Success
+ * JB_ERR_MEMORY - Out of memory
+ * JB_ERR_PARSE - Cannot parse regex (Detailed message
+ * written to system log)
*
*********************************************************************/
-int create_url_spec(struct url_spec * url, char * buf)
+jb_err create_url_spec(struct url_spec * url, char * buf)
{
char *p;
struct url_spec tmp_url[1];
- /* paranoia - should never happen. */
- if ((url == NULL) || (buf == NULL))
- {
- return 1;
- }
+ assert(url);
+ assert(buf);
/* save a copy of the orignal specification */
if ((url->spec = strdup(buf)) == NULL)
{
- return 1;
+ return JB_ERR_MEMORY;
}
if ((p = strchr(buf, '/')))
if (NULL == (url->path = strdup(p)))
{
freez(url->spec);
- return 1;
+ return JB_ERR_MEMORY;
}
url->pathlen = strlen(url->path);
*p = '\0';
{
freez(url->spec);
freez(url->path);
- return 1;
+ return JB_ERR_MEMORY;
}
sprintf(rebuf, "^(%s)", url->path);
if (errcode)
{
size_t errlen = regerror(errcode,
- url->preg, buf, sizeof(buf));
+ url->preg, rebuf, sizeof(rebuf));
- buf[errlen] = '\0';
+ if (errlen > (sizeof(rebuf) - (size_t)1))
+ {
+ errlen = sizeof(rebuf) - (size_t)1;
+ }
+ rebuf[errlen] = '\0';
log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
- url->spec, buf);
+ url->spec, rebuf);
freez(url->spec);
freez(url->path);
freez(url->preg);
- return 1;
+ return JB_ERR_PARSE;
}
}
#endif
#ifdef REGEX
freez(url->preg);
#endif /* def REGEX */
- return 1;
+ return JB_ERR_MEMORY;
}
/* split domain into components */
*tmp_url = dsplit(url->domain);
+ if (tmp_url->dbuf == NULL)
+ {
+ freez(url->spec);
+ freez(url->path);
+ freez(url->domain);
+#ifdef REGEX
+ freez(url->preg);
+#endif /* def REGEX */
+ return JB_ERR_MEMORY;
+ }
+
url->dbuf = tmp_url->dbuf;
url->dcnt = tmp_url->dcnt;
url->dvec = tmp_url->dvec;
url->unanchored = tmp_url->unanchored;
- return 0; /* OK */
+ return JB_ERR_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 *p;
+ char *src;
+ char *dest;
char linebuf[BUFFER_SIZE];
int contflag = 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)
{
}
/* 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
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 */
/*********************************************************************
{
struct re_filterfile_spec *b = (struct re_filterfile_spec *)f;
- if (b == NULL) return;
+ if (b == NULL)
+ {
+ return;
+ }
destroy_list(b->patterns);
pcrs_free_joblist(b->joblist);
}
/* 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 );
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 )
{