- Add favicon links.
[privoxy.git] / actions.c
index 4b31f7f..5f1ab9b 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.31 2002/05/06 07:56:50 oes Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.35 2006/07/18 14:48:45 david__schmidt Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -33,6 +33,37 @@ const char actions_rcs[] = "$Id: actions.c,v 1.31 2002/05/06 07:56:50 oes Exp $"
  *
  * Revisions   :
  *    $Log: actions.c,v $
+ *    Revision 1.35  2006/07/18 14:48:45  david__schmidt
+ *    Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
+ *    with what was really the latest development (the v_3_0_branch branch)
+ *
+ *    Revision 1.32.2.6  2006/01/29 23:10:56  david__schmidt
+ *    Multiple filter file support
+ *
+ *    Revision 1.32.2.5  2005/06/09 01:18:41  david__schmidt
+ *    Tweaks to conditionally include pthread.h if FEATURE_PTHREAD is enabled -
+ *    this becomes important when jcc.h gets included later down the line.
+ *
+ *    Revision 1.32.2.4  2003/12/03 10:33:11  oes
+ *    - Implemented Privoxy version requirement through
+ *      for-privoxy-version= statement in {{settings}}
+ *      block
+ *    - Fix for unchecked out-of-memory condition
+ *
+ *    Revision 1.32.2.3  2003/02/28 12:52:10  oes
+ *    Fixed memory leak reported by Dan Price in Bug #694713
+ *
+ *    Revision 1.32.2.2  2002/11/20 14:36:55  oes
+ *    Extended unload_current_actions_file() to multiple AFs.
+ *    Thanks to Oliver Stoeneberg for the hint.
+ *
+ *    Revision 1.32.2.1  2002/05/26 12:13:16  roro
+ *    Change unsigned to unsigned long in actions_name struct.  This closes
+ *    SourceForge Bug #539284.
+ *
+ *    Revision 1.32  2002/05/12 21:36:29  jongfoster
+ *    Correcting function comments
+ *
  *    Revision 1.31  2002/05/06 07:56:50  oes
  *    Made actions_to_html independent of FEATURE_CGI_EDIT_ACTIONS
  *
@@ -181,6 +212,10 @@ const char actions_rcs[] = "$Id: actions.c,v 1.31 2002/05/06 07:56:50 oes Exp $"
 #include <assert.h>
 #include <stdlib.h>
 
+#ifdef FEATURE_PTHREAD
+#include <pthread.h>
+#endif
+
 #include "project.h"
 #include "jcc.h"
 #include "list.h"
@@ -191,6 +226,7 @@ const char actions_rcs[] = "$Id: actions.c,v 1.31 2002/05/06 07:56:50 oes Exp $"
 #include "encode.h"
 #include "urlmatch.h"
 #include "cgi.h"
+#include "ssplit.h"
 
 const char actions_h_rcs[] = ACTIONS_H_VERSION;
 
@@ -218,10 +254,10 @@ const char actions_h_rcs[] = ACTIONS_H_VERSION;
 struct action_name
 {
    const char * name;
-   unsigned mask;   /* a bit set to "0" = remove action */
-   unsigned add;    /* a bit set to "1" = add action */
-   int takes_value; /* an AV_... constant */
-   int index;       /* index into strings[] or multi[] */
+   unsigned long mask;   /* a bit set to "0" = remove action */
+   unsigned long add;    /* a bit set to "1" = add action */
+   int takes_value;      /* an AV_... constant */
+   int index;            /* index into strings[] or multi[] */
 };
 
 /*
@@ -850,7 +886,7 @@ void free_current_action (struct current_action_spec *src)
 }
 
 
-static struct file_list *current_actions_file[MAX_ACTION_FILES]  = {
+static struct file_list *current_actions_file[MAX_AF_FILES]  = {
    NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL
 };
@@ -871,10 +907,15 @@ static struct file_list *current_actions_file[MAX_ACTION_FILES]  = {
  *********************************************************************/
 void unload_current_actions_file(void)
 {
-   if (current_actions_file)
+   int i;
+
+   for (i = 0; i < MAX_AF_FILES; i++)
    {
-      current_actions_file->unloader = unload_actions_file;
-      current_actions_file = NULL;
+      if (current_actions_file[i])
+      {
+         current_actions_file[i]->unloader = unload_actions_file;
+         current_actions_file[i] = NULL;
+      }
    }
 }
 #endif /* FEATURE_GRACEFUL_TERMINATION */
@@ -953,7 +994,7 @@ int load_actions_file(struct client_state *csp)
    int i;
    int result;
 
-   for (i = 0; i < MAX_ACTION_FILES; i++)
+   for (i = 0; i < MAX_AF_FILES; i++)
    {
       if (csp->config->actions_file[i])
       {
@@ -1049,7 +1090,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
          if (buf[1] == '{')
          {
             /* It's {{settings}} or {{alias}} */
-            int len = strlen(buf);
+            size_t len = strlen(buf);
             char * start = buf + 2;
             char * end = buf + len - 1;
             if ((len < 5) || (*end-- != '}') || (*end-- != '}'))
@@ -1220,9 +1261,44 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
       {
          /*
           * Part of the {{settings}} block.
-          * Ignore for now, but we may want to read & check permissions
-          * when we go multi-user.
+          * For now only serves to check if the file's minimum Privoxy
+          * version requirement is met, but we may want to read & check
+          * permissions when we go multi-user.
           */
+         if (!strncmp(buf, "for-privoxy-version=", 20))
+         {
+            char *version_string, *fields[3];
+            int num_fields;
+
+            if ((version_string = strdup(buf + 20)) == NULL)
+            {
+               fclose(fp);
+               log_error(LOG_LEVEL_FATAL,
+                         "can't load actions file '%s': out of memory!",
+                         csp->config->actions_file[fileid]);
+               return 1; /* never get here */
+            }
+            
+            num_fields = ssplit(version_string, ".", fields, 3, TRUE, FALSE);
+
+            if (num_fields < 1 || atoi(fields[0]) == 0)
+            {
+               log_error(LOG_LEVEL_ERROR,
+                 "While loading actions file '%s': invalid line (%lu): %s",
+                  csp->config->actions_file[fileid], linenum, buf);
+            }
+            else if (                      atoi(fields[0]) > VERSION_MAJOR
+                     || (num_fields > 1 && atoi(fields[1]) > VERSION_MINOR)
+                     || (num_fields > 2 && atoi(fields[2]) > VERSION_POINT))
+            {
+               fclose(fp);
+               log_error(LOG_LEVEL_FATAL,
+                         "Actions file '%s', line %lu requires newer Privoxy version: %s",
+                         csp->config->actions_file[fileid], linenum, buf );
+               return 1; /* never get here */
+            }
+            free(version_string);
+         }
       }
       else if (mode == MODE_DESCRIPTION)
       {
@@ -1285,7 +1361,14 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             return 1; /* never get here */
          }
 
-         new_alias->name = strdup(buf);
+         if ((new_alias->name = strdup(buf)) == NULL)
+         {
+            fclose(fp);
+            log_error(LOG_LEVEL_FATAL,
+               "can't load actions file '%s': out of memory!",
+               csp->config->actions_file[fileid]);
+            return 1; /* never get here */
+         }
 
          strcpy(actions_buf, start);
 
@@ -1357,6 +1440,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
    fclose(fp);
 
    free_action(cur_action);
+   freez(cur_action);
 
    free_alias_list(alias_list);