1 #include <stdio.h>
2 #include <pcre.h>
3 
4 #define VERSION "3.2.12"
5 #define DEFAULT_CONFIG "/usr/local/rejik3/redirector.conf"
6 
7 /*** Print debug info for develop ***/
8 //#define DEBUG_ERR_MES
9 //#define DEBUG_CFG
10 //#define DEBUG_CYCLE
11 //#define DEBUG_MAKE_CACHE
12 //#define DEBUG_URLS_LOAD
13 //#define DEBUG_PCRE
14 //#define DEBUG_PARSE_URL
15 //#define DEBUG_PRUNE_URLS
16 //#define DEBUG_CACHE2URL
17 //#define DEBUG_WRITE_CACHE
18 //#define DEBUG_LOAD_CACHE
19 //#define DEBUG_PARSE_UNPUT
20 //#define DEBUG_CHECK_URLS
21 //#define DEBUG_URLS_CMP
22 //#define DEBUG_RUN_MAKE_CACHE
23 //#define DEBUG_IP
24 //#define DEBUG_ID
25 //#define DEBUG_NEW_URL
26 //#define DEBUG_RAW_CHANGE
27 //#define DEBUG_PASS
28 
29 
30 // Uncoment next line for case independent
31 //#define CASE_INDEPENDENT
32 
33 // MAX LENS OF SOME VARS
34 #define ML_CFG 200
35 #define ML_FILE_NAME 200
36 #define ML_ETMP 7168
37 #define ML_PCRE_VARS 512
38 
39 #define ML_URL 6144
40 #define ML_HOST 100
41 #define ML_IDENT 100
42 #define ML_METHOD 10
43 
44 
45 #define ML_PROTOKOL 20
46 #define ML_DIRS 4096
47 #define ML_PORT 10
48 #define ML_2LD 200
49 #define ML_SUBDOMEN 512
50 
51 extern FILE *change_log;
52 
53 extern char *input_ident;
54 extern char *input_ident_un;
55 extern char *input_ip;
56 extern char *input_url;
57 extern char *input_url_un;
58 
59 #ifdef CASE_INDEPENDENT
60 char *input_url_uc;
61 #endif
62 
63 extern char *input_method;
64 extern char *input_host;
65 extern struct p_url  *i_url;
66 
67 extern char *change_reason;
68 
69 
70  /*****************************************************************
71   *    http://sub.sub.sub.domen2levelname.ru:45433/dir/dir/file   *
72   *    |     |           |                  |    |            |   *
73   * protocol | subdomen  |   twoleveldomen  |port|    dirs        *
74   *****************************************************************/
75 struct p_url
76     {
77      char protocol[ML_PROTOKOL];
78      char twoleveldomen[ML_2LD];
79      char port[ML_PORT];
80      char subdomen[ML_SUBDOMEN];
81      char dirs[ML_DIRS];
82     };
83 
84 //GLOBAL OPTIONS
85 extern char *err_log;   // Error log path
86 extern char *chg_log;   // Change log path
87 extern char *makecache; // make-cache program
88 
89 extern char *work_ip; 	       //Work ip
90 extern int  work_ip_count;    //Work ip count
91 extern int  work_ip_flag;     //Work ip flag
92 
93 extern char *allow_ip; 	//Allow ip
94 extern int  allow_ip_count;  	//Allow ip count
95 
96 extern char **work_id;	//Work id
97 extern int  work_id_count;	//Work id count
98 extern int  work_id_flag;	//Work id flag
99 
100 extern char **allow_id;	//Allow id
101 extern int  allow_id_count;	//Allow id count
102 
103 extern char *allow_urls_file;  //Allow urls file name
104 extern char **allow_urls;	//Allow urls
105 extern int allow_urls_count;	//Allow urls count
106 
107 extern char **change_from;      //
108 extern char **change_to;        // Change data
109 extern int change_count;        //
110 extern int raw_change_log_flag; //
111 
112 extern int write_hostname_to_log; // Write hostname to log flag
113 
114 //SECTIONS OPTIONS
115 extern int sections_count;    //Count of sections in config
116 extern struct section
117      {
118 	char *name;	        //Header name
119 	char *ban_dir;		//Ban lists dir
120 	char *url;		//Url to change
121 	char revers;		// revers flag
122 
123 	char **new_url;		// Block of urls
124 	char *new_url_inset;    // to change with
125 	int new_url_count;      // change #*# elements
126 
127 	char log_flag;		//Write to log or not
128 
129 	char *work_ip; 	        //Work ip
130 	int  work_ip_count;  	//Work ip count
131         int  work_ip_flag;      //Work ip flag
132 
133 	char *allow_ip; 	//Allow ip
134 	int  allow_ip_count;  	//Allow ip count
135 
136 	char **work_id;	        //Work id
137 	int  work_id_count;	//Work id count
138 	int  work_id_flag;      //Work id flag
139 
140 	char **allow_id;	//Allow id
141 	int  allow_id_count;	//Allow id count
142 
143 	pcre **ban_pcre;	    	//Ban PCRE patterns
144 	pcre_extra **ban_pcre_s; 	//Ban PCRE optimization
145 	int ban_pcre_count;     //Ban PCRE patterns count
146 
147 	char **ban_urls;	//Ban urls lists area
148 	int ban_urls_count;	//Counter urls elements
149 
150 	char action;		// Action for section:
151 	                        // 0 - redirect
152 	                        // 1 - pass
153 
154      } **redir;
155 
156 char *now (void);
157 void err_mes(char*);
158 void get_opt(char*);
159 
160 int load_urls(int,char *);
161 int parse_urls(struct p_url *,char *);
162 int prune_urls(int);
163 int cmp_urls(const void *, const void *);
164 int cache2url(struct p_url *,char *);
165 int need_cache_update(char*,char*);
166 int write_cache(int,char*,char*);
167 int load_cache(char ***,int*,char *);
168 int load_pcre_file(int);
169 int check_pcre(int);
170 int parse_input(char *);
171 void init_vars(void);
172 int check_url(char**,int count);
173 int cmp_urls_bs(const void *, const void *);
174 int cmp_urls_sub(const void *, const void *);
175 int cmp_urls_dirs(const void *, const void *);
176 int cmp_urls_port(const void *, const void *);
177 int run_make_cache(char*);
178 int add_ip(char *,char **,int* );
179 int check_ip(char *,int );
180 int add_id(char *,char ***,int* );
181 int sort_id(char ***,int* );
182 int check_id(char **,int);
183 int prepare_new_url(int);
184 int add_new_url (int, char *, int);
185 int redirect(int);
186 int raw_change(void);
187 int pass(void);
188