| 914 | |
| 915 | |
| 916 | void copyfilter (struct filter *filter, struct srvparam *srv){ |
| 917 | int nfilters = 0; |
| 918 | |
| 919 | if(!filter) return; |
| 920 | for(srv->filter = filter; srv->filter; srv->filter = srv->filter->next) nfilters++; |
| 921 | srv->filter = myalloc(sizeof(struct filter) * nfilters); |
| 922 | if(!srv->filter) return; |
| 923 | |
| 924 | for(; filter; filter = filter->next){ |
| 925 | void *data = NULL; |
| 926 | |
| 927 | if(!filter->filter_open || !(data = (*filter->filter_open)(filter->data, srv))) continue; |
| 928 | |
| 929 | srv->filter[srv->nfilters] = *filter; |
| 930 | srv->filter[srv->nfilters].data = data; |
| 931 | if(srv->nfilters>0)srv->filter[srv->nfilters - 1].next = srv->filter + srv->nfilters; |
| 932 | srv->nfilters++; |
| 933 | if(filter->filter_request)srv->nreqfilters++; |
| 934 | if(filter->filter_header_srv)srv->nhdrfilterssrv++; |
| 935 | if(filter->filter_header_cli)srv->nhdrfilterscli++; |
| 936 | if(filter->filter_predata)srv->npredatfilters++; |
| 937 | if(filter->filter_data_srv)srv->ndatfilterssrv++; |
| 938 | if(filter->filter_data_cli)srv->ndatfilterscli++; |
| 939 | } |
| 940 | } |
| 941 | |
| 942 | FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param){ |
| 943 | FILTER_ACTION res=PASS; |