/* Dispatch UPnP incoming messages. */ int upnp_dispatch(UPNP_CONTEXT *context) { UPNP_INTERFACE *ifp; struct timeval tv = {1, 0}; /* timed out every second */ int n; fd_set fds; FD_ZERO(&fds); /* Set select sockets */ FD_SET(context->ssdp_sock, &fds); for (ifp = context->iflist; ifp; ifp = ifp->next) { FD_SET(ifp->http_sock, &fds); FD_SET(ifp->req_sock, &fds); } /* select sockets */ n = select(FD_SETSIZE, &fds, (fd_set *)NULL, (fd_set *)NULL, &tv); if (n > 0) { /* process ssdp multicast packet */ if (FD_ISSET(context->ssdp_sock, &fds)) { ssdp_process(context, context->ssdp_sock); } /* process upnp_http */ for (ifp = context->iflist; ifp; ifp = ifp->next) { context->focus_ifp = ifp; /* process http */ if (FD_ISSET(ifp->http_sock, &fds)) { upnp_http_accept(context); } /* process message */ if (FD_ISSET(ifp->req_sock, &fds)) { upnp_request_handler(context); } } } upnp_timeout(context); return 0; }
/* Dispatch UPnP incoming messages. */ void upnp_dispatch(UPNP_CONTEXT *context, fd_set *fds) { UPNP_INTERFACE *ifp; /* process ssdp multicast packet */ if (context->ssdp_sock != -1 && FD_ISSET(context->ssdp_sock, fds)) { ssdp_process(context); } /* process upnp_http */ for (ifp = context->iflist; ifp; ifp = ifp->next) { context->focus_ifp = ifp; /* process http */ if (FD_ISSET(ifp->http_sock, fds)) { upnp_http_process(context); } } return; }