10 #include <netinet/in.h>
13 #include <sys/socket.h>
32 "M-SEARCH * HTTP/1.1\r\n" \
33 "Host:239.255.255.250:1900\r\n" \
34 "ST:urn:axis-com:service:BasicService:1\r\n" \
35 "Man:\"ssdp:discover\"\r\n" \
43 PRINT_DEBUG(
"ssdp_prober_init()");
45 PRINT_ERROR(
"Prober is empty");
48 memset(prober, 0,
sizeof *prober);
52 PRINT_WARN(
"Errnoeous forward address");
77 PRINT_DEBUG(
"Could not create socket");
80 PRINT_DEBUG(
"ssdp_prober has been initialized");
86 PRINT_DEBUG(
"ssdp_prober_close()");
95 PRINT_DEBUG(
"ssdp_prober_start()");
101 PRINT_DEBUG(
"parse_filters()");
110 PRINT_DEBUG(
"creating multicast address");
137 struct sockaddr_in sa;
138 sa.sin_family = AF_INET;
140 inet_pton(AF_INET,
SSDP_ADDR, &sa.sin_addr);
144 PRINT_DEBUG(
"sending request");
148 sent_bytes = sendto(prober->sock, request, strlen(request), 0,
149 (
struct sockaddr *)&sa,
sizeof(sa));
151 if (sent_bytes < 0) {
152 PRINT_DEBUG(
"sendto(): Failed sending any data");
157 size_t sento_addr_len =
sizeof(
struct sockaddr_storage);
158 struct sockaddr_storage *sendto_addr = malloc(sento_addr_len);
159 memset(sendto_addr, 0, sento_addr_len);
160 int response_port = 0;
162 if (getsockname(prober->sock, (
struct sockaddr *)sendto_addr,
163 (socklen_t *)&sento_addr_len) < 0) {
164 PRINT_ERROR(
"Could not get sendto() port, going to miss the replies");
168 PRINT_DEBUG(
"sendto() port is %d", response_port);
172 PRINT_DEBUG(
"sent %d bytes", sent_bytes);
174 drop_message =
FALSE;
177 PRINT_DEBUG(
"setup_socket() listening");
187 memset(&recv_node, 0,
sizeof recv_node);
190 PRINT_DEBUG(
"Waiting for a response");
192 PRINT_DEBUG(
"Recived %d bytes%s",
194 (recv_node.
recv_bytes < 0 ?
" (wait time limit reached)" :
""));
204 PRINT_ERROR(
"Failed to initialize SSDP message holder structure");
217 if (filters_factory != NULL) {
220 if ((strcmp(filters_factory->
filters[fc].
header,
"ip") == 0) &&
221 strstr(ssdp_message->
ip,
227 while (ssdp_headers) {
235 ssdp_headers = ssdp_headers->
next;
237 ssdp_headers = ssdp_message->
headers;
245 if (filters_factory == NULL || !drop_message) {
249 PRINT_DEBUG(
"Could not fetch custom fields");
255 to_xml(ssdp_message,
TRUE, xml_string, XML_BUFFER_SIZE);
256 printf(
"%s\n", xml_string);
260 if (oneline_string) {
261 printf(
"%s\n", oneline_string);
262 free(oneline_string);
265 printf(
"\n\n\n----------BEGIN NOTIFICATION------------\n");
266 printf(
"Time received: %s\n", ssdp_message->
datetime);
267 printf(
"Origin-MAC: %s\n", (ssdp_message->
mac != NULL ?
268 ssdp_message->
mac :
"(Could not be determined)"));
269 printf(
"Origin-IP: %s\nMessage length: %d Bytes\n", ssdp_message->
ip,
271 printf(
"Request: %s\nProtocol: %s\n", ssdp_message->
request,
275 while (ssdp_headers) {
276 printf(
"Header[%d][type:%d;%s]: %s\n", hc, ssdp_headers->
type,
279 ssdp_headers = ssdp_headers->
next;
283 printf(
"-----------END NOTIFICATION-------------\n");
296 PRINT_DEBUG(
"scan_for_upnp_devices end");
SOCKET setup_socket(socket_conf_s *conf)
const char * get_header_string(const unsigned int header_type, const ssdp_header_s *header)
char ip[IPv6_STR_MAX_SIZE]
int parse_address(const char *raw_address, struct sockaddr_storage *address)
char interface[IPv6_STR_MAX_SIZE]
struct ssdp_header_struct * headers
void free_ssdp_message(ssdp_message_s **message_pointer)
int fetch_custom_fields(configuration_s *conf, ssdp_message_s *ssdp_message)
unsigned char filters_count
BOOL build_ssdp_message(ssdp_message_s *message, char *ip, char *mac, int message_length, const char *raw_message)
int ssdp_active_listener_init(ssdp_listener_s *listener, configuration_s *conf, int port)
char from_ip[IPv6_STR_MAX_SIZE]
const char * ssdp_probe_message_create(void)
char from_mac[MAC_STR_MAX_SIZE]
BOOL init_ssdp_message(ssdp_message_s **message_pointer)
char recv_data[SSDP_RECV_DATA_LEN]
void ssdp_prober_close(ssdp_prober_s *prober)
void free_ssdp_filters_factory(filters_factory_s *factory)
static configuration_s conf
int ssdp_prober_start(ssdp_prober_s *prober, configuration_s *conf)
int ssdp_prober_init(ssdp_prober_s *prober, configuration_s *conf)
int get_port_from_sock_address(const struct sockaddr_storage *saddr)
void ssdp_listener_read(ssdp_listener_s *listener, ssdp_recv_node_s *recv_node)
void parse_filters(char *raw_filter, filters_factory_s **filters_factory, BOOL print_filters)