14 #include "cfg_parser.h"
17 /* main routing list */
18 struct route_elem* rlist=0;
22 void free_re(struct route_elem* r)
26 regfree(&(r->method));
29 if (r->host.h_name) free(r->host.h_name);
30 if (r->host.h_aliases){
31 for (i=0; r->host.h_aliases[i]; i++)
32 free(r->host.h_aliases[i]);
33 free(r->host.h_aliases);
35 if (r->host.h_addr_list){
36 for (i=0; r->host.h_addr_list[i]; i++)
37 free(r->host.h_addr_list[i]);
38 free(r->host.h_addr_list);
46 struct route_elem* init_re()
49 r=(struct route_elem *) malloc(sizeof(struct route_elem));
51 memset((void*)r, 0, sizeof (struct route_elem));
57 void push(struct route_elem* re, struct route_elem** head)
65 for (t=*head; t->next;t=t->next);
71 void clear_rlist(struct route_elem** rl)
73 struct route_elem *t, *u;
77 for (t=*rl; t; u=t, t=t->next){
85 int add_rule(struct cfg_line* cl, struct route_elem** head)
88 struct route_elem* re;
95 if (re==0) return E_OUT_OF_MEM;
97 if (regcomp(&(re->method), cl->method, REG_EXTENDED|REG_NOSUB|REG_ICASE)){
98 DPrint("ERROR: bad re \"%s\"\n", cl->method);
102 if (regcomp(&(re->uri), cl->uri, REG_EXTENDED|REG_NOSUB|REG_ICASE) ){
103 DPrint("ERROR: bad re \"%s\"\n", cl->uri);
109 he=gethostbyname(cl->address);
111 DPrint("ERROR: cannot resolve \"%s\"\n", cl->address);
116 /* start copying the host entry.. */
118 len=strlen(he->h_name)+1;
119 re->host.h_name=(char*)malloc(sizeof(char) * len);
120 if (re->host.h_name) strncpy(re->host.h_name, he->h_name, len);
127 for (len=0;he->h_aliases[len];len++);
128 re->host.h_aliases=(char**)malloc(sizeof(char*)*(len+1));
129 if (re->host.h_aliases==0){
133 memset((void*)re->host.h_aliases, 0, sizeof(char*) * (len+1) );
135 len2=strlen(he->h_aliases[i])+1;
136 re->host.h_aliases[i]=(char*)malloc(sizeof(char)*len2);
137 if (re->host.h_aliases==0){
141 strncpy(re->host.h_aliases[i], he->h_aliases[i], len2);
143 /* copy h_addr_list */
144 for (len=0;he->h_addr_list[len];len++);
145 re->host.h_addr_list=(char**)malloc(sizeof(char*)*(len+1));
146 if (re->host.h_addr_list==0){
150 memset((void*)re->host.h_addr_list, 0, sizeof(char*) * (len+1) );
152 re->host.h_addr_list[i]=(char*)malloc(sizeof(char)*he->h_length);
153 if (re->host.h_addr_list[i]==0){
157 memcpy(re->host.h_addr_list[i], he->h_addr_list[i], he->h_length);
160 /* copy h_addr_type & length */
161 re->host.h_addrtype=he->h_addrtype;
162 re->host.h_length=he->h_length;
163 /*finished hostent copy */
167 re->current_addr_idx=0;
180 struct route_elem* route_match(char* method, char* uri, struct route_elem** rl)
182 struct route_elem* t;
184 DPrint("WARNING: empty routing table\n");
187 for (t=*rl; t; t=t->next){
188 if (regexec(&(t->method), method, 0, 0, 0)==0){
189 /* we have a method mach !!! */
190 if (regexec(&(t->uri), uri, 0, 0, 0)==0){
191 /* we have a full match */
202 /* debug function, prints main routing table */
205 struct route_elem* t;
209 DPrint("the routing table is empty\n");
213 for (t=rlist,i=0; t; i++, t=t->next){
214 DPrint("%2d.to=%s ; route ok=%d\n", i,
215 t->host.h_name, t->ok);
217 for (j=0; t->host.h_addr_list[j]; j++){
218 DPrint("%d.%d.%d.%d ",
219 (unsigned char) t->host.h_addr_list[j][0],
220 (unsigned char) t->host.h_addr_list[j][1],
221 (unsigned char) t->host.h_addr_list[j][2],
222 (unsigned char) t->host.h_addr_list[j][3]
226 DPrint(" port:%d\n", (unsigned short)t->port);
227 DPrint(" Statistics: tx=%d, errors=%d, tx_bytes=%d, idx=%d\n",
228 t->tx, t->errors, t->tx_bytes, t->current_addr_idx);