Correcting misleading comments
[privoxy.git] / loaders.c
index a485d93..c0b6a24 100644 (file)
--- a/loaders.c
+++ b/loaders.c
@@ -1,4 +1,4 @@
-const char loaders_rcs[] = "$Id: loaders.c,v 1.4 2001/05/22 18:56:28 oes 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,27 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.4 2001/05/22 18:56:28 oes Exp $";
  *
  * 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
  *
@@ -104,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.
@@ -177,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;
@@ -646,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];
@@ -733,7 +757,7 @@ char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs)
    char linebuf[BUFSIZ];
    int contflag = 0;
 
-       *buf = '\0';
+   *buf = '\0';
 
    while (fgets(linebuf, sizeof(linebuf), fp))
    {
@@ -757,27 +781,27 @@ char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs)
       }
 
       /* Line continuation? Trim escape and set flag. */
-               if ((p != linebuf) && (*--p == '\\'))
-                 {
-                        contflag = 1;
-                        *p = '\0';
-                 }
+      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';
-                        }
-               }
+         /* ..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;
@@ -818,16 +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)
          {
-                         strncat(buf, linebuf, buflen - strlen(buf));
-                         if (contflag)
-                                {
-                                       contflag = 0;
-                                       continue;
-                                }
-                         else
-                                {
-                                       return buf;
-                                }
+            strncat(buf, linebuf, buflen - strlen(buf));
+            if (contflag)
+            {
+               contflag = 0;
+               continue;
+            }
+            else
+            {
+               return buf;
+            }
          }
       }
    }
@@ -858,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)
@@ -880,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)
    {
@@ -967,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);
 
 }
@@ -995,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)
@@ -1015,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;
    }
@@ -1089,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);
 
 }
@@ -1117,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)
@@ -1137,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;
    }
@@ -1211,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);
 
 }
@@ -1241,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)
@@ -1261,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;
    }
@@ -1272,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)
    {
@@ -1355,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;
       }
 
@@ -1409,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);
 
 }
@@ -1439,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)
@@ -1459,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)
    {
@@ -1552,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);
 
 }
@@ -1578,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)
@@ -1604,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;
    }
@@ -1648,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);
@@ -1661,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;\r
+\r
+      /* Save the URL pattern */\r
+      if (create_url_spec(b->url, buf))\r
+      {\r
+         fclose(fp);\r
+         goto load_forwardfile_error;\r
+      }\r
 
       /* now parse the gateway specs */
 
@@ -1821,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);
 
 }
@@ -1853,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)
@@ -1874,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;
    }
@@ -1926,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);
 
 }
@@ -1943,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;
       }
    }
@@ -1974,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.
  *
@@ -1985,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