10 #include <sys/socket.h>
29 #define LISTEN_QUEUE_LENGTH 5
34 #define SSDP_PASSIVE_LISTENER_TIMEOUT 10
39 #define SSDP_ACTIVE_LISTENER_TIMEOUT 2
56 PRINT_DEBUG(
"ssdp_listener_init()");
60 PRINT_ERROR(
"No listener specified");
64 memset(listener, 0,
sizeof *listener);
69 PRINT_WARN(
"Errnoeous forward address");
94 PRINT_DEBUG(
"[%d] %s", errno, strerror(errno));
98 listener->
sock = sock;
99 PRINT_DEBUG(
"ssdp_listener has been initialized");
106 PRINT_DEBUG(
"ssdp_passive_listener_init()");
113 PRINT_DEBUG(
"ssdp_active_listener_init()");
123 if (listener->
sock > 0)
124 close(listener->
sock);
129 PRINT_DEBUG(
"ssdp_listener_read()");
130 struct sockaddr_storage recv_addr;
131 size_t addr_size =
sizeof recv_addr;
135 (socklen_t *)&addr_size);
145 PRINT_DEBUG(
"ssdp_listener_start()");
151 PRINT_DEBUG(
"parse_filters()");
155 PRINT_DEBUG(
"Strating infinite loop");
162 while (!listener->
stop) {
164 drop_message =
FALSE;
167 PRINT_DEBUG(
"loop: ready to receive");
172 PRINT_DEBUG(
"**** RECEIVED %d bytes ****\n%s", recv_node.
recv_bytes,
174 PRINT_DEBUG(
"************************");
182 PRINT_DEBUG(
"Timed-out waiting for a SSDP message");
184 PRINT_DEBUG(
"No messages in the SSDP cache, continuing to listen");
190 PRINT_DEBUG(
"Forwarding cached SSDP messages");
193 PRINT_DEBUG(
"Failed flushing SSDP cache");
199 PRINT_DEBUG(
"Displaying cached SSDP messages");
210 PRINT_ERROR(
"Failed to initialize the SSDP message buffer");
217 PRINT_ERROR(
"Failed to build the SSDP message");
227 "M-SEARCH") != NULL)) {
228 PRINT_DEBUG(
"Message contains a M-SEARCH request, dropping "
235 if (filters_factory != NULL) {
236 drop_message =
filter(ssdp_message, filters_factory);
240 if (filters_factory == NULL || !drop_message) {
245 PRINT_ERROR(
"Failed adding SSDP message to SSDP cache, skipping");
251 PRINT_DEBUG(
"Could not fetch custom fields");
260 PRINT_DEBUG(
"Cache max size reached, sending and emptying");
263 PRINT_DEBUG(
"Failed flushing SSDP cache");
268 PRINT_DEBUG(
"Cache max size not reached, not sending yet");
273 PRINT_DEBUG(
"Displaying cached SSDP messages");
279 PRINT_DEBUG(
"scan loop: done");
SOCKET setup_socket(socket_conf_s *conf)
char ip[IPv6_STR_MAX_SIZE]
BOOL filter(ssdp_message_s *ssdp_message, filters_factory_s *filters_factory)
int parse_address(const char *raw_address, struct sockaddr_storage *address)
char interface[IPv6_STR_MAX_SIZE]
int flush_ssdp_cache(configuration_s *conf, ssdp_cache_s **ssdp_cache_pointer, const char *url, struct sockaddr_storage *sockaddr_recipient, int port, int timeout)
void display_ssdp_cache(ssdp_cache_s *ssdp_cache, BOOL draw_asci)
char * get_mac_address_from_socket(const SOCKET sock, const struct sockaddr_storage *sa_ip, const char *ip, char *mac_buffer)
void free_ssdp_message(ssdp_message_s **message_pointer)
int fetch_custom_fields(configuration_s *conf, ssdp_message_s *ssdp_message)
void ssdp_listener_close(ssdp_listener_s *listener)
BOOL build_ssdp_message(ssdp_message_s *message, char *ip, char *mac, int message_length, const char *raw_message)
int ssdp_listener_start(ssdp_listener_s *listener, configuration_s *conf)
void ssdp_listener_stop(ssdp_listener_s *listener)
char from_ip[IPv6_STR_MAX_SIZE]
#define SSDP_ACTIVE_LISTENER_TIMEOUT
#define SSDP_PASSIVE_LISTENER_TIMEOUT
struct sockaddr_storage forwarder
char from_mac[MAC_STR_MAX_SIZE]
void ssdp_listener_read(ssdp_listener_s *listener, ssdp_recv_node_s *recv_node)
BOOL init_ssdp_message(ssdp_message_s **message_pointer)
char recv_data[SSDP_RECV_DATA_LEN]
BOOL add_ssdp_message_to_cache(ssdp_cache_s **ssdp_cache_pointer, ssdp_message_s **ssdp_message_pointer)
static int ssdp_listener_init(ssdp_listener_s *listener, configuration_s *conf, BOOL is_active, int port, int recv_timeout)
void free_ssdp_filters_factory(filters_factory_s *factory)
#define LISTEN_QUEUE_LENGTH
static configuration_s conf
#define SSDP_RECV_DATA_LEN
int ssdp_active_listener_init(ssdp_listener_s *listener, configuration_s *conf, int port)
unsigned int * ssdp_messages_count
char * get_ip_from_sock_address(const struct sockaddr_storage *saddr, char *ip_buffer)
int ssdp_passive_listener_init(ssdp_listener_s *listener, configuration_s *conf)
void parse_filters(char *raw_filter, filters_factory_s **filters_factory, BOOL print_filters)