static void received_announcement (GSSDPResourceBrowser *resource_browser, SoupMessageHeaders *headers) { const char *header; header = soup_message_headers_get_one (headers, "NT"); if (!header) return; /* No target specified */ if (!check_target_compat (resource_browser, header)) return; /* Target doesn't match */ header = soup_message_headers_get_one (headers, "NTS"); if (!header) return; /* No announcement type specified */ /* Check announcement type */ if (strncmp (header, SSDP_ALIVE_NTS, strlen (SSDP_ALIVE_NTS)) == 0) resource_available (resource_browser, headers); else if (strncmp (header, SSDP_BYEBYE_NTS, strlen (SSDP_BYEBYE_NTS)) == 0) resource_unavailable (resource_browser, headers); else if (strncmp (header, SSDP_UPDATE_NTS, strlen (SSDP_UPDATE_NTS)) == 0) resource_update (resource_browser, headers); }
static void dispatcher_loop() { int numfds; fd_set fdset; int count; struct timeval timeout; timeout.tv_usec = 0; while(1) { if(sighup) { resource_update(config_dir); sighup = False; } if(trace_level > 1) { trace_sessions(); } numfds = 0; FD_ZERO(&fdset); numfds = MAX(clients_sd, agents_sd); numfds = MAX(numfds,trap_sd); numfds++; FD_SET(clients_sd, &fdset); FD_SET(agents_sd, &fdset); FD_SET(trap_sd, &fdset); timeout.tv_sec = relay_agent_poll_interval; /* we compute the timeout according to the */ /* timeout of the pending requests */ session_select_info(&timeout); count = select(numfds, &fdset, 0, 0, &timeout); if(count > 0) { if(FD_ISSET(agents_sd, &fdset)) { /* we read the responses of the agents */ session_read(); continue; } if(FD_ISSET(trap_sd, &fdset)) { /* working on the trap */ trap_processing(); continue; } if(FD_ISSET(clients_sd, &fdset)) { /* we dispatch the requests of the application */ session_dispatch(); session_timeout(); continue; } } else { switch(count) { case 0: /* we check if some requests have timeout */ session_timeout(); watch_dog_in_action(); break; case -1: if(errno == EINTR) { break; } else { error_exit(ERR_MSG_SELECT, errno_string()); } } } } }