diff options
Diffstat (limited to '')
-rw-r--r-- | src/anonymous.c | 89 |
1 files changed, 64 insertions, 25 deletions
diff --git a/src/anonymous.c b/src/anonymous.c index 42f1e6e..0f687f3 100644 --- a/src/anonymous.c +++ b/src/anonymous.c @@ -1,9 +1,8 @@ -/* $Id: anonymous.c,v 1.9 2001-11-22 00:31:10 rjkaes Exp $ +/* $Id: anonymous.c,v 1.10 2001-12-15 20:02:59 rjkaes Exp $ * * Handles insertion and searches for headers which should be let through when - * the anonymous feature is turned on. The headers are stored in a Ternary - * Search Tree. The initial code came from Dr. Dobb's Journal, April 1998 - * "Ternary Search Trees", Jon Bentley and Bob Sedgewick, pg 20-25. + * the anonymous feature is turned on. The headers are stored in a linked + * list. * * Copyright (C) 2000 Robert James Kaes (rjkaes@flarenet.com) * @@ -22,50 +21,90 @@ #include "anonymous.h" #include "log.h" -#include "ternary.h" -#include "tinyproxy.h" +#include "utils.h" -static TERNARY anonymous_tree = 0; /* - * Keep track of whether the Anonymous filtering is enabled. Off by - * default. + * Structure holding the various anonymous headers. */ -static short int anonymous_is_enabled = 0; +struct anonymous_header_s { + char *header; + struct anonymous_header_s *next; +}; +struct anonymous_header_s *anonymous_root = NULL; inline short int is_anonymous_enabled(void) { - return anonymous_is_enabled; + return (anonymous_root) ? 1 : 0; } +/* + * Search through the linked list for the header. If it's found return 0 + * else return -1. + */ int anonymous_search(char *s) { + struct anonymous_header_s *ptr = anonymous_root; + assert(s != NULL); - assert(anonymous_is_enabled == 1); - assert(anonymous_tree > 0); + assert(anonymous_root != NULL); - return ternary_search(anonymous_tree, s, NULL); + while (ptr) { + if (ptr->header) { + if (strcasecmp(ptr->header, s) == 0) + return 0; + } else + return -1; + + ptr = ptr->next; + } + + return -1; } +/* + * Insert a new header into the linked list. + * + * Return -1 if there is an error, 0 if the string already exists, and 1 if + * it's been inserted. + */ int anonymous_insert(char *s) { + struct anonymous_header_s *ptr; + struct anonymous_header_s **prev_ptr; + assert(s != NULL); - /* - * If this is the first time we're inserting a word, create the - * search tree. - */ - if (!anonymous_is_enabled) { - anonymous_tree = ternary_new(); - if (anonymous_tree < 0) + if (!anonymous_root) { + anonymous_root = safemalloc(sizeof(struct anonymous_header_s)); + if (!anonymous_root) return -1; - anonymous_is_enabled = 1; + anonymous_root->header = strdup(s); + anonymous_root->next = NULL; + } else { + ptr = anonymous_root; - DEBUG1("Starting the Anonymous header subsytem."); - } + while (ptr) { + if (ptr->header) { + if (strcasecmp(ptr->header, s) == 0) + return 0; + } - return ternary_insert(anonymous_tree, s, NULL); + prev_ptr = &ptr; + ptr = ptr->next; + } + + ptr = (*prev_ptr)->next + = safemalloc(sizeof(struct anonymous_header_s)); + if (!ptr) + return -1; + + ptr->header = strdup(s); + ptr->next = NULL; + } + + return 1; } |