volta.h
changeset 14 51eb85ae4de4
parent 13 23a242d7b7fa
child 15 2706fc514dea
--- a/volta.h	Mon Oct 31 17:17:07 2011 -0700
+++ b/volta.h	Fri Nov 04 20:34:28 2011 -0700
@@ -41,15 +41,23 @@
 #include <stdarg.h>
 #include <errno.h>
 #include <string.h>
+#include <strings.h>
 #include <unistd.h>
+#include <ctype.h>
 #include <time.h>
 #include <sys/stat.h>
 #include <signal.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <regex.h>
 
-#include <sys/types.h>
+/*
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+*/
+
+#include <cdb.h>
 
 #ifdef DEBUG
 #include <google/profiler.h>
@@ -57,17 +65,19 @@
 
 /* Default line size we accept from squid, longer lines (huge URLs?) malloc. */
 #define LINE_BUFSIZE 2048
-/* Ceiling for how many bytes can be allocated at one for a single line. */
+/* Ceiling for how many bytes can be allocated at once for a single line. */
 #define LINE_MAX 256000 /* 250k */
+/* Maximum DB results for a single query */
+#define DB_RESULTS_MAX 1000
 
-/* Redirect types */
-#define REDIR_TEMPORARY   0
-#define REDIR_PERMANENT   1
-#define REDIR_TRANSPARENT 2
+/* Parsed line types */
+#define REQUEST 1
+#define RULE 2
 
 /* Aid debugging */
 #define LOC __FILE__, __LINE__
 
+
 /*
  * a global struct for easy access to common vars 
  *
@@ -75,62 +85,70 @@
 struct v_globals {
 	unsigned short int debugmode; /* debug level */
 	char dbname[128];             /* path to database file */
-	struct sqlite3 *db;           /* database handle */
-
-	/* prepared statements */
-	struct {
-		struct sqlite3_stmt *match_request;
-		struct sqlite3_stmt *get_rewrite_rule;
-	} db_stmt;
+	short int db_fd;              /* opened db file descriptor */
 
 	struct {
-		time_t start;            /* start time */
-		unsigned long int lines; /* line count for determining speed */
+		time_t start;             /* start time */
+		unsigned long int lines;  /* line count for determining speed */
+		time_t db_lastcheck;      /* reopen db time */
 	} timer;
 };
 extern struct v_globals v;        /* defined in main.c */
 
+
 /*
- * The parsed attributes from the request line, as given to us by squid.
+ * A line of parsed ascii DB input, for conversion into cdb.
  *
  */
-typedef struct request {
+struct db_input {
+	unsigned int klen;
+	unsigned int vlen;
+	char *key;
+	char *val;
+	char *kstart;
+	char *vstart;
+};
+
+
+/*
+ * The parsed attributes from the request line as given to us by squid,
+ * or from the rule string found in the database.  Unparsed
+ * members are just left NULL.
+ *
+ */
+typedef struct parsed {
+	unsigned short int type;
+	char   *path_re;
+	char   *redir;
 	char   *scheme;
 	char   *host;
 	char   *tld;
 	char   *path;
-	unsigned short int port;
-	struct in_addr *client_ip;
+	char   *port;
+	/* struct in_addr *client_ip; */
+	char   *client_ip;
 	char   *user;
 	char   *method;
 
 	struct {
+		char *path_re_start;
+		char *redir_start;
 		char *scheme_start;
 		char *host_start;
 		char *port_start;
 		char *path_start;
 		char *meth_start;
 		char *c_ip_start;
+		unsigned short int path_re_length;
+		unsigned short int redir_length;
 		unsigned short int scheme_length;
 		unsigned short int host_length;
 		unsigned short int port_length;
-		unsigned short int path_length;
+		unsigned int       path_length;
 		unsigned short int meth_length;
 		unsigned short int c_ip_length;
 	} tokens;
-} request;
-
-/*
- * The URL elements to rewrite a user's request into.
- *
- */
-typedef struct rewrite {
-	char *scheme;
-	char *host;
-	char *path;
-	unsigned short int port;
-	unsigned short int redir;
-} rewrite;
+} parsed;
 
 
 /*
@@ -138,28 +156,32 @@
  * Function prototypes
  *
  */
-int getopt( int, char * const [], const char *);
+int  getopt( int, char * const [], const char *);
+void shutdown_handler( int );
+void shutdown_actions( void );
 
 void usage( char * );
 void debug( int, char *, int, const char *, ... );
 void out( const char * );
 void reverse_str( char * );
+void lowercase_str( char *, unsigned short int );
 void report_speed( void );
 char *slurp_file( char * );
 char *extend_line( char *, const char * );
 char *copy_string_token( char *, unsigned short int );
-struct in_addr *copy_ipv4_token( char *, unsigned short int );
+/* struct in_addr *copy_ipv4_token( char *, unsigned short int ); */
 
-void shutdown_handler( int );
-void shutdown_actions( void );
-int accept_loop( void );
+int  accept_loop( void );
 void process( char * );
-request *parse( char * );
-request *init_request( void );
-void populate_request( request * );
-void parse_tld( request * );
-void parse_port( request * );
-void finish_request( request * );
+parsed *init_parsed( void );
+parsed *parse_request( char * );
+parsed *parse_rule( char * );
+void populate_parsed( parsed * );
+void parse_tld( parsed * );
+void finish_parsed( parsed * );
+void reset_results( parsed **, unsigned int );
+parsed *find_matching_rule( parsed **, unsigned int, parsed * );
+void rewrite( parsed *, parsed * );
 
 #endif