25 if ((factory->
filters + fc)->value) {
40 char *pos = NULL, *last_pos = raw_filter, *splitter = NULL;
41 unsigned char filters_count = 0;
44 if(raw_filter == NULL || strlen(raw_filter) < 1) {
46 printf(
"No filters applied.\n");
52 while(*last_pos ==
',' || *last_pos ==
'=') {
56 while(*(last_pos + strlen(last_pos) - 1) ==
',' || *(last_pos + strlen(last_pos) - 1) ==
'=') {
57 memcpy((last_pos + strlen(last_pos) - 1),
"\0", 1);
61 filters_count =
strcount(last_pos,
",") + 1;
67 ff = *filters_factory;
76 for(fc = 0; fc < filters_count; fc++) {
80 memset((ff->
filters[fc]).header,
'\0',
sizeof(
char) * 64);
83 ff->
filters[fc].
value = (
char *)malloc(
sizeof(
char) * 2048);
84 memset(ff->
filters[fc].
value,
'\0',
sizeof(
char) * 2048);
87 pos = strstr(last_pos,
",");
89 pos = last_pos + strlen(last_pos);
93 splitter = strstr(last_pos,
"=");
95 strncpy(ff->
filters[fc].
header, last_pos, splitter - last_pos);
97 strncpy(ff->
filters[fc].
value, splitter, pos - splitter);
107 printf(
"\nFilters applied:\n");
109 for(c = 0; c < filters_count; c++) {
117 PRINT_DEBUG(
"traversing filters");
123 char *filter_value = filters_factory->
filters[fc].
value;
127 if(strcmp(filter_header,
"ip") == 0) {
129 if(strstr(ssdp_message->
ip, filter_value) == NULL) {
130 PRINT_DEBUG(
"IP filter mismatch, dropping message");
137 if(strcmp(filter_header,
"mac") == 0) {
139 if(strstr(ssdp_message->
mac, filter_value) == NULL) {
140 PRINT_DEBUG(
"MAC filter mismatch, dropping message");
147 if(strcmp(filter_header,
"protocol") == 0) {
149 if(strstr(ssdp_message->
protocol, filter_value) == NULL) {
150 PRINT_DEBUG(
"Protocol filter mismatch, dropping message");
157 if(strcmp(filter_header,
"request") == 0) {
159 if(strstr(ssdp_message->
request, filter_value) == NULL) {
160 PRINT_DEBUG(
"Request filter mismatch, dropping message");
170 while(ssdp_headers) {
175 if(strcmp(ssdp_header_string, filter_header) == 0) {
179 if(strstr(ssdp_headers->
contents, filter_value) == NULL) {
180 PRINT_DEBUG(
"Header (%s) filter mismatch, marked for dropping", filter_header);
185 ssdp_headers = ssdp_headers->
next;
190 PRINT_DEBUG(
"Filter type not found, marked for dropping");
const char * get_header_string(const unsigned int header_type, const ssdp_header_s *header)
void parse_filters(char *raw_filter, filters_factory_s **filters_factory, BOOL print_filters)
struct ssdp_header_struct * headers
unsigned char filters_count
BOOL filter(ssdp_message_s *ssdp_message, filters_factory_s *filters_factory)
unsigned char strcount(const char *haystack, const char *needle)
void free_ssdp_filters_factory(filters_factory_s *factory)