Allow to limit the number of of client connections.
[privoxy.git] / loaders.c
index 9667c1c..e7dbbe4 100644 (file)
--- a/loaders.c
+++ b/loaders.c
@@ -1,4 +1,4 @@
-const char loaders_rcs[] = "$Id: loaders.c,v 1.65 2007/12/07 18:29:23 fabiankeil Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.71 2009/03/04 18:24:47 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loaders.c,v $
@@ -8,7 +8,7 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.65 2007/12/07 18:29:23 fabiankeil
  *                the list of active loaders, and to automatically
  *                unload files that are no longer in use.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2007 the SourceForge
+ * Copyright   :  Written by and Copyright (C) 2001-2009 the
  *                Privoxy team. http://www.privoxy.org/
  *
  *                Based on the Internet Junkbuster originally written
@@ -35,6 +35,31 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.65 2007/12/07 18:29:23 fabiankeil
  *
  * Revisions   :
  *    $Log: loaders.c,v $
+ *    Revision 1.71  2009/03/04 18:24:47  fabiankeil
+ *    No need to create empty strings manually, strdup("") FTW.
+ *
+ *    Revision 1.70  2009/03/01 18:34:24  fabiankeil
+ *    Help clang understand that we aren't dereferencing
+ *    NULL pointers here.
+ *
+ *    Revision 1.69  2008/09/21 13:36:52  fabiankeil
+ *    If change-x-forwarded-for{add} is used and the client
+ *    sends multiple X-Forwarded-For headers, append the client's
+ *    IP address to each one of them. "Traditionally" we would
+ *    lose all but the last one.
+ *
+ *    Revision 1.68  2008/09/19 15:26:28  fabiankeil
+ *    Add change-x-forwarded-for{} action to block or add
+ *    X-Forwarded-For headers. Mostly based on code removed
+ *    before 3.0.7.
+ *
+ *    Revision 1.67  2008/03/30 14:52:08  fabiankeil
+ *    Rename load_actions_file() and load_re_filterfile()
+ *    as they load multiple files "now".
+ *
+ *    Revision 1.66  2008/03/21 11:16:30  fabiankeil
+ *    Garbage-collect csp->my_ip_addr_str and csp->my_hostname.
+ *
  *    Revision 1.65  2007/12/07 18:29:23  fabiankeil
  *    Remove now-obsolete csp member x_forwarded.
  *
@@ -428,14 +453,15 @@ static struct file_list *current_re_filterfile[MAX_AF_FILES]  = {
  *
  * Parameters  :  None
  *
- * Returns     :  N/A
+ * Returns     :  The number of threads that are still active.
  *
  *********************************************************************/
-void sweep(void)
+unsigned int sweep(void)
 {
    struct file_list *fl, *nfl;
    struct client_state *csp, *last_active;
    int i;
+   unsigned int active_threads = 0;
 
    /* clear all of the file's active flags */
    for ( fl = files->next; NULL != fl; fl = fl->next )
@@ -490,10 +516,11 @@ void sweep(void)
             csp->tlist->active = 1;
          }
 #endif /* def FEATURE_TRUST */
-         
+
+         active_threads++;
+
          last_active = csp;
          csp = csp->next;
-
       }
       else 
       /*
@@ -555,6 +582,8 @@ void sweep(void)
       }
    }
 
+   return active_threads;
+
 }
 
 
@@ -855,30 +884,30 @@ jb_err edit_read_line(FILE *fp,
 
    if (raw_out)
    {
-      if ((raw = malloc(1)) == NULL)
+      raw = strdup("");
+      if (NULL == raw)
       {
          return JB_ERR_MEMORY;
       }
-      *raw = '\0';
    }
    if (prefix_out)
    {
-      if ((prefix = malloc(1)) == NULL)
+      prefix = strdup("");
+      if (NULL == prefix)
       {
          freez(raw);
          return JB_ERR_MEMORY;
       }
-      *prefix = '\0';
    }
    if (data_out)
    {
-      if ((data = malloc(1)) == NULL)
+      data = strdup("");
+      if (NULL == data)
       {
          freez(raw);
          freez(prefix);
          return JB_ERR_MEMORY;
       }
-      *data = '\0';
    }
 
    /* Main loop.  Loop while we need more data & it's not EOF. */
@@ -912,6 +941,7 @@ jb_err edit_read_line(FILE *fp,
 
       /* Trim leading spaces if we're at the start of the line */
       linestart = linebuf;
+      assert(NULL != data);
       if (*data == '\0')
       {
          /* Trim leading spaces */
@@ -1381,9 +1411,9 @@ void unload_current_re_filterfile(void)
 
 /*********************************************************************
  *
- * Function    :  load_re_filterfile
+ * Function    :  load_re_filterfiles
  *
- * Description :  Load the re_filterfile
+ * Description :  Loads all the filterfiles
  *                Generate a chained list of re_filterfile_spec's from
  *                the "FILTER: " blocks, compiling all their substitutions
  *                into chained lists of pcrs_job structs.
@@ -1394,7 +1424,7 @@ void unload_current_re_filterfile(void)
  * Returns     :  0 => Ok, everything else is an error.
  *
  *********************************************************************/
-int load_re_filterfile(struct client_state *csp)
+int load_re_filterfiles(struct client_state *csp)
 {
    int i;
    int result;
@@ -1551,6 +1581,7 @@ int load_one_re_filterfile(struct client_state *csp, int fileid)
          }
          else
          {
+            assert(NULL != bl);
             bl->next = new_bl;
          }
          bl = new_bl;
@@ -1614,7 +1645,7 @@ int load_one_re_filterfile(struct client_state *csp, int fileid)
             {
                bl->joblist = dummy;
             }
-            else
+            else if (NULL != lastjob)
             {
                lastjob->next = dummy;
             }