Deleted config.h and pcrs/chartables.h because they are auto
[privoxy.git] / loaders.c
index 5767ee2..4c21851 100644 (file)
--- a/loaders.c
+++ b/loaders.c
@@ -1,4 +1,4 @@
-const char loaders_rcs[] = "$Id: loaders.c,v 1.2 2001/05/17 23:01:01 oes Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.3 2001/05/20 01:21:20 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loaders.c,v $
@@ -35,6 +35,19 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.2 2001/05/17 23:01:01 oes Exp $";
  *
  * Revisions   :
  *    $Log: loaders.c,v $
+ *    Revision 1.3  2001/05/20 01:21:20  jongfoster
+ *    Version 2.9.4 checkin.
+ *    - Merged popupfile and cookiefile, and added control over PCRS
+ *      filtering, in new "permissionsfile".
+ *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
+ *      file error you now get a message box (in the Win32 GUI) rather
+ *      than the program exiting with no explanation.
+ *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
+ *      skipping.
+ *    - Removed tabs from "config"
+ *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
+ *    - Bumped up version number.
+ *
  *    Revision 1.2  2001/05/17 23:01:01  oes
  *     - Cleaned CRLF's from the sources and related files
  *
@@ -90,8 +103,8 @@ const char loaders_h_rcs[] = LOADERS_H_VERSION;
 
 #define NLOADERS 8
 static int (*loaders[NLOADERS])(struct client_state *);
-\r
-\r
+
+
 /*
  * Currently active files.
  * These are also entered in the main linked list of files.
@@ -115,10 +128,10 @@ static struct file_list *current_trustfile      = NULL;
 #ifdef PCRS
 static struct file_list *current_re_filterfile  = NULL;
 #endif /* def PCRS */
-\r
-\r
-static int create_url_spec(struct url_spec * url, char * buf);\r
-\r
+
+
+static int create_url_spec(struct url_spec * url, char * buf);
+
 
 /*********************************************************************
  *
@@ -254,125 +267,125 @@ void sweep(void)
 }
 
 
-/*********************************************************************\r
- *\r
- * Function    :  create_url_spec\r
- *\r
- * Description :  Creates a "url_spec" structure from a string.\r
- *                When finished, free with unload_url().\r
- *\r
- * Parameters  :\r
- *          1  :  url = Target url_spec to be filled in.  Must be\r
- *                      zeroed out before the call (e.g. using zalloc).\r
- *          2  :  buf = Source pattern, null terminated.  NOTE: The\r
- *                      contents of this buffer are destroyed by this\r
- *                      function.  If this function succeeds, the\r
- *                      buffer is copied to url->spec.  If this\r
- *                      function fails, the contents of the buffer\r
- *                      are lost forever.\r
- *\r
- * Returns     :  0 => Ok, everything else is an error.\r
- *\r
- *********************************************************************/\r
-static int create_url_spec(struct url_spec * url, char * buf)\r
-{\r
-   char *p;\r
-   struct url_spec tmp_url[1];\r
-\r
-   /* paranoia - should never happen. */\r
-   if ((url == NULL) || (buf == NULL))\r
-   {\r
-      return 1;\r
-   }\r
-\r
-   /* save a copy of the orignal specification */\r
-   if ((url->spec = strdup(buf)) == NULL)\r
-   {\r
-      return 1;\r
-   }\r
-\r
-   if ((p = strchr(buf, '/')))\r
-   {\r
-      if (NULL == (url->path = strdup(p)))\r
-      {\r
-         freez(url->spec);\r
-         return 1;\r
-      }\r
-      url->pathlen = strlen(url->path);\r
-      *p = '\0';\r
-   }\r
-   else\r
-   {\r
-      url->path    = NULL;\r
-      url->pathlen = 0;\r
-   }\r
-#ifdef REGEX\r
-   if (url->path)\r
-   {\r
-      int errcode;\r
-      char rebuf[BUFSIZ];\r
-\r
-      if (NULL == (url->preg = zalloc(sizeof(*url->preg))))\r
-      {\r
-         freez(url->spec);\r
-         freez(url->path);\r
-         return 1;\r
-      }\r
-\r
-      sprintf(rebuf, "^(%s)", url->path);\r
-\r
-      errcode = regcomp(url->preg, rebuf,\r
-            (REG_EXTENDED|REG_NOSUB|REG_ICASE));\r
-      if (errcode)\r
-      {\r
-         size_t errlen =\r
-            regerror(errcode,\r
-               url->preg, buf, sizeof(buf));\r
-\r
-         buf[errlen] = '\0';\r
-\r
-         log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",\r
-                 url->spec, buf);\r
-\r
-         freez(url->spec);\r
-         freez(url->path);\r
-         freez(url->preg);\r
-\r
-         return 1;\r
-      }\r
-   }\r
-#endif\r
-   if ((p = strchr(buf, ':')) == NULL)\r
-   {\r
-      url->port = 0;\r
-   }\r
-   else\r
-   {\r
-      *p++ = '\0';\r
-      url->port = atoi(p);\r
-   }\r
-\r
-   if ((url->domain = strdup(buf)) == NULL)\r
-   {\r
-      freez(url->spec);\r
-      freez(url->path);\r
-#ifdef REGEX\r
-      freez(url->preg);\r
-#endif /* def REGEX */\r
-      return 1;\r
-   }\r
-\r
-   /* split domain into components */\r
-\r
-   *tmp_url = dsplit(url->domain);\r
-   url->dbuf = tmp_url->dbuf;\r
-   url->dcnt = tmp_url->dcnt;\r
-   url->dvec = tmp_url->dvec;\r
-\r
-   return 0; /* OK */\r
-}\r
-\r
-\r
+/*********************************************************************
+ *
+ * Function    :  create_url_spec
+ *
+ * Description :  Creates a "url_spec" structure from a string.
+ *                When finished, free with unload_url().
+ *
+ * Parameters  :
+ *          1  :  url = Target url_spec to be filled in.  Must be
+ *                      zeroed out before the call (e.g. using zalloc).
+ *          2  :  buf = Source pattern, null terminated.  NOTE: The
+ *                      contents of this buffer are destroyed by this
+ *                      function.  If this function succeeds, the
+ *                      buffer is copied to url->spec.  If this
+ *                      function fails, the contents of the buffer
+ *                      are lost forever.
+ *
+ * Returns     :  0 => Ok, everything else is an error.
+ *
+ *********************************************************************/
+static int 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;
+   }
+
+   /* save a copy of the orignal specification */
+   if ((url->spec = strdup(buf)) == NULL)
+   {
+      return 1;
+   }
+
+   if ((p = strchr(buf, '/')))
+   {
+      if (NULL == (url->path = strdup(p)))
+      {
+         freez(url->spec);
+         return 1;
+      }
+      url->pathlen = strlen(url->path);
+      *p = '\0';
+   }
+   else
+   {
+      url->path    = NULL;
+      url->pathlen = 0;
+   }
+#ifdef REGEX
+   if (url->path)
+   {
+      int errcode;
+      char rebuf[BUFSIZ];
+
+      if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
+      {
+         freez(url->spec);
+         freez(url->path);
+         return 1;
+      }
+
+      sprintf(rebuf, "^(%s)", url->path);
+
+      errcode = regcomp(url->preg, rebuf,
+            (REG_EXTENDED|REG_NOSUB|REG_ICASE));
+      if (errcode)
+      {
+         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);
+
+         freez(url->spec);
+         freez(url->path);
+         freez(url->preg);
+
+         return 1;
+      }
+   }
+#endif
+   if ((p = strchr(buf, ':')) == NULL)
+   {
+      url->port = 0;
+   }
+   else
+   {
+      *p++ = '\0';
+      url->port = atoi(p);
+   }
+
+   if ((url->domain = strdup(buf)) == NULL)
+   {
+      freez(url->spec);
+      freez(url->path);
+#ifdef REGEX
+      freez(url->preg);
+#endif /* def REGEX */
+      return 1;
+   }
+
+   /* split domain into components */
+
+   *tmp_url = dsplit(url->domain);
+   url->dbuf = tmp_url->dbuf;
+   url->dcnt = tmp_url->dcnt;
+   url->dvec = tmp_url->dvec;
+
+   return 0; /* OK */
+}
+
+
 /*********************************************************************
  *
  * Function    :  unload_url
@@ -492,22 +505,22 @@ static void unload_imagefile(void *f)
  * Description :  Unloads a permissions file.
  *
  * Parameters  :
- *          1  :  file_data = the data structure associated with the\r
+ *          1  :  file_data = the data structure associated with the
  *                            permissions file.
  *
  * Returns     :  N/A
  *
  *********************************************************************/
 static void unload_permissions_file(void *file_data)
-{\r
+{
    struct permissions_spec * next;
    struct permissions_spec * cur = (struct permissions_spec *)file_data;
-   while (cur != NULL)\r
-   {\r
+   while (cur != NULL)
+   {
       next = cur->next;
       unload_url(cur->url);
-      freez(cur);\r
-      cur = next;\r
+      freez(cur);
+      cur = next;
    }
 
 }
@@ -1002,13 +1015,13 @@ int load_blockfile(struct client_state *csp)
       bl->next = b;
 
       b->reject = reject;
-\r
-      /* Save the URL pattern */\r
-      if (create_url_spec(b->url, buf))\r
-      {\r
-         fclose(fp);\r
-         goto load_blockfile_error;\r
-      }\r
+
+      /* Save the URL pattern */
+      if (create_url_spec(b->url, buf))
+      {
+         fclose(fp);
+         goto load_blockfile_error;
+      }
    }
 
    fclose(fp);
@@ -1122,17 +1135,17 @@ int load_imagefile(struct client_state *csp)
       /* add it to the list */
       b->next  = bl->next;
       bl->next = b;
-\r
-      b->reject = reject;\r
 
-      /* Save the URL pattern */\r
-      if (create_url_spec(b->url, buf))\r
+      b->reject = reject;
+
+      /* Save the URL pattern */
+      if (create_url_spec(b->url, buf))
       {
          fclose(fp);
          goto load_imagefile_error;
       }
    }
-\r
+
    fclose(fp);
 
 #ifndef SPLIT_PROXY_ARGS
@@ -1166,12 +1179,12 @@ load_imagefile_error:
 }
 #endif /* def USE_IMAGE_LIST */
 
-\r
+
 /*********************************************************************
  *
  * Function    :  load_permissions_file
  *
- * Description :  Read and parse a permissions file and add to files\r
+ * Description :  Read and parse a permissions file and add to files
  *                list.
  *
  * Parameters  :
@@ -1187,7 +1200,7 @@ int load_permissions_file(struct client_state *csp)
    struct permissions_spec *b, *bl;
    char  buf[BUFSIZ], *p, *q;
    int permissions;
-   struct file_list *fs;\r
+   struct file_list *fs;
    int i;
 
    if (!check_file_changed(current_permissions_file, permissions_file, &fs))
@@ -1213,79 +1226,79 @@ int load_permissions_file(struct client_state *csp)
    if ((fp = fopen(permissions_file, "r")) == NULL)
    {
       goto load_permissions_error;
-   }\r
+   }
+
 
-\r
-   /*\r
-    * default_permissions is set in this file.\r
-    *\r
-    * Reset it to default first.\r
-    */\r
-   default_permissions = PERMIT_RE_FILTER;\r
+   /*
+    * default_permissions is set in this file.
+    *
+    * Reset it to default first.
+    */
+   default_permissions = PERMIT_RE_FILTER;
 
    while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
    {
-      p = buf;\r
-\r
-      permissions = PERMIT_COOKIE_SET | PERMIT_COOKIE_READ | PERMIT_POPUPS;\r
-\r
-      /*\r
-       * FIXME: for() loop is a kludge.  Want to loop around until we\r
-       * find a non-control character.  Assume there will be at most 4\r
-       * characters.\r
-       */\r
-      for (i = 0; i < 4; i++)\r
-      {\r
+      p = buf;
+
+      permissions = PERMIT_COOKIE_SET | PERMIT_COOKIE_READ | PERMIT_POPUPS;
+
+      /*
+       * FIXME: for() loop is a kludge.  Want to loop around until we
+       * find a non-control character.  Assume there will be at most 4
+       * characters.
+       */
+      for (i = 0; i < 4; i++)
+      {
          switch ((int)*p)
          {
-            case '>':\r
-               /*\r
-                * Allow cookies to be read by the server, but do\r
-                * not allow them to be set.\r
-                */\r
+            case '>':
+               /*
+                * Allow cookies to be read by the server, but do
+                * not allow them to be set.
+                */
                permissions = (permissions & ~PERMIT_COOKIE_SET);
                p++;
                break;
 
             case '<':
-               /*\r
-                * Allow server to set cookies but do not let the\r
-                * server read them.\r
-                */\r
-               permissions = (permissions & ~PERMIT_COOKIE_READ);\r
+               /*
+                * Allow server to set cookies but do not let the
+                * server read them.
+                */
+               permissions = (permissions & ~PERMIT_COOKIE_READ);
+               p++;
+               break;
+
+            case '^':
+               /*
+                * Block popups
+                */
+               permissions = (permissions & ~PERMIT_POPUPS);
+               p++;
+               break;
+
+            case '%':
+               /*
+                * Permit filtering using PCRS
+                */
+               permissions = (permissions | PERMIT_RE_FILTER);
                p++;
                break;
 
-            case '^':\r
-               /*\r
-                * Block popups\r
-                */\r
-               permissions = (permissions & ~PERMIT_POPUPS);\r
-               p++;\r
-               break;\r
-\r
-            case '%':\r
-               /*\r
-                * Permit filtering using PCRS\r
-                */\r
-               permissions = (permissions | PERMIT_RE_FILTER);\r
-               p++;\r
-               break;\r
-\r
-            case '~':\r
-               /*\r
-                * All of the above (maximum filtering).\r
+            case '~':
+               /*
+                * All of the above (maximum filtering).
                 */
-               permissions = PERMIT_RE_FILTER;\r
+               permissions = PERMIT_RE_FILTER;
                p++;
                break;
 
-            default:\r
-               /*\r
-                * FIXME: Should break out of the loop here.\r
+            default:
+               /*
+                * FIXME: Should break out of the loop here.
                 */
                break;
-         }\r
+         }
       }
 
       /*
@@ -1293,17 +1306,17 @@ int load_permissions_file(struct client_state *csp)
        * front of the pattern
        */
       q = buf;
-      if (p > q)\r
-      {\r
+      if (p > q)
+      {
          while ((*q++ = *p++) != '\0')
          {
             /* nop */
-         }\r
+         }
       }
 
       /* a lines containing only "special" chars sets default */
       if (*buf == '\0')
-      {\r
+      {
          default_permissions = permissions;
          continue;
       }
@@ -1319,13 +1332,13 @@ int load_permissions_file(struct client_state *csp)
       /* add it to the list */
       b->next  = bl->next;
       bl->next = b;
-\r
+
       /* Save flags */
-      b->permissions = permissions;\r
-\r
-      /* Save the URL pattern */\r
-      if (create_url_spec(b->url, buf))\r
-      {\r
+      b->permissions = permissions;
+
+      /* Save the URL pattern */
+      if (create_url_spec(b->url, buf))
+      {
          fclose(fp);
          goto load_permissions_error;
       }
@@ -1456,8 +1469,8 @@ int load_trustfile(struct client_state *csp)
 
       b->reject = reject;
 
-      /* Save the URL pattern */\r
-      if (create_url_spec(b->url, buf))\r
+      /* Save the URL pattern */
+      if (create_url_spec(b->url, buf))
       {
          fclose(fp);
          goto load_trustfile_error;