gint timeout_callback(gpointer data) { struct message msg; extern gint my_address; msg.type = MSG_DUMMY; msg.sender = my_address; msg.u.dummy.application_type = application_type(); send_packet(&msg); return TRUE; }
void LauncherApplication::updateBamfApplicationDependentProperties() { activeChanged(active()); runningChanged(running()); urgentChanged(urgent()); nameChanged(name()); iconChanged(icon()); applicationTypeChanged(application_type()); desktopFileChanged(desktop_file()); m_launching_timer.stop(); launchingChanged(launching()); updateHasVisibleWindow(); updateWindowCount(); fetchIndicatorMenus(); }
void send_stats(FILE *client, char *uri) { send_status(client, 200); fprintf(client, "Content-Type: %s\n\n", application_type(uri)); replace_variable(client, uri); }
gpointer proxy_ssdp_thread(gpointer args) { gint ret; struct sockaddr_in name_out, name_in; struct sockaddr_in clientsock; static gchar inbuf[1024]; fd_set read_fd, fds; guint socklen; struct ip_mreq mreq; gint i; #ifdef WIN32 const gchar *os = "Windows"; #else const gchar *os = "Linux"; #endif ssdp_req_data = g_strdup_printf("M-SEARCH * HTTP/1.1\r\n" "HOST: 239.255.255.250:1900\r\n" "MAN: \"ssdp:discover\"\r\n" ST "\r\n" "MX:3\r\n" "\r\n"); ssdp_req_data_len = strlen(ssdp_req_data); FD_ZERO(&fds); // receiving socket for (i = 0; i < addrcnt; i++) { g_print("Initialize %x\n", iface[i].addr); if ((iface[i].fdin = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { perror("SSDP socket"); continue; } FD_SET(iface[i].fdin , &fds); gint reuse = 1; if (setsockopt(iface[i].fdin, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(reuse)) < 0) { perror("setsockopt (SO_REUSEADDR)"); } #if 1 // SO_BINDTODEVICE requires root privileges struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", iface[i].name); if (setsockopt(iface[i].fdin, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) { perror("bindtodevice in"); } #endif memset((gchar *)&name_in, 0, sizeof(name_in)); name_in.sin_family = AF_INET; name_in.sin_port = htons(SSDP_PORT); name_in.sin_addr.s_addr = 0;//htonl(iface[i].addr); if (bind(iface[i].fdin, (struct sockaddr *)&name_in, sizeof(name_in)) == -1) { perror("SSDP bind"); } memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr.s_addr = inet_addr(SSDP_MULTICAST); mreq.imr_interface.s_addr = iface[i].addr; if (setsockopt(iface[i].fdin, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { perror("SSDP setsockopt"); } // transmitting socket if ((iface[i].fdout = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { perror("SSDP socket"); continue; } #if 1 // SO_BINDTODEVICE requires root privileges memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", iface[i].name); if (setsockopt(iface[i].fdout, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) { perror("bindtodevice out"); } #endif FD_SET(iface[i].fdout , &fds); gint ttl = 3; setsockopt(iface[i].fdout, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&ttl, sizeof(ttl)); } // for memset((gchar*)&name_out, 0, sizeof(name_out)); name_out.sin_family = AF_INET; name_out.sin_port = htons(SSDP_PORT); name_out.sin_addr.s_addr = inet_addr(SSDP_MULTICAST); for ( ; *((gboolean *)args) ; ) /* exit loop when flag is cleared */ { struct application *appl; struct timeval timeout; gint len; timeout.tv_sec=1; timeout.tv_usec=0; read_fd = fds; if (select(32, &read_fd, NULL, NULL, &timeout) < 0) { perror("SSDP select"); continue; } #ifdef WEBKIT update_progress(); #endif for (i = 0; i < addrcnt; i++) { if (iface[i].fdin > 0 && FD_ISSET(iface[i].fdin, &read_fd)) { socklen = sizeof(clientsock); if ((len = recvfrom(iface[i].fdin, inbuf, sizeof(inbuf)-1, 0, (struct sockaddr *)&clientsock, &socklen)) < 0) { perror("SSDP recvfrom"); continue; } inbuf[len] = 0; //g_print("RXin[%d]: '%s'\n", i, inbuf); if (strncmp(inbuf, "NOTIFY", 6) == 0) { appl = report_to_proxy(inbuf, &clientsock, i); appl = appl; // make compiler happy } } if (iface[i].fdout > 0 && FD_ISSET(iface[i].fdout, &read_fd)) { socklen = sizeof(clientsock); if ((len = recvfrom(iface[i].fdout, inbuf, sizeof(inbuf)-1, 0, (struct sockaddr *)&clientsock, &socklen)) < 0) { perror("SSDP recvfrom"); continue; } inbuf[len] = 0; //g_print("RXout[%d]: '%s'\n", i, inbuf); if (strncmp(inbuf, "HTTP/1.1 200 OK", 12) == 0) { appl = report_to_proxy(inbuf, &clientsock, i); #if 0 if (0 && appl && appl->apptype.type == APPLICATION_TYPE_TIMER && appl->apptype.mode == APP_MODE_MASTER) { gint j; for (j = 0; j < addrcnt; j++) { if (i == j || iface[j].fdout <= 0) continue; ret = sendto(iface[j].fdout, inbuf, len, 0, (struct sockaddr*) &name_out, sizeof(struct sockaddr_in)); g_print("SSDP message forwarded to port %d\n", j); } // for } // if #endif } // if (strncmp(inbuf, "HTTP/1.1 200 OK", 12) == 0) } } static time_t last_time = 0; time_t now = time(NULL); if (now > last_time + 5) { last_time = now; for (i = 0; i < addrcnt; i++) { if (iface[i].fdout <= 0) continue; if (iface[i].ssdp_msg == NULL) { #define URN ":urn:judoshiai:service:all:" SHIAI_VERSION #define ST "ST" URN #define NT "NT" URN struct sockaddr_in a; a.sin_addr.s_addr = iface[i].addr; iface[i].ssdp_msg = g_strdup_printf("NOTIFY * HTTP/1.1\r\n" "HOST: 239.255.255.250:1900\r\n" "CACHE-CONTROL: max-age=1800\r\n" "LOCATION: http://%s/UPnP/desc.xml\r\n" NT "\r\n" "NTS: ssdp-alive\r\n" "SERVER:%s/1 UPnP/1.0 %s/%s\r\n" "USN: uuid:%08x-cafe-babe-737%d-%012x\r\n" "\r\n", inet_ntoa(a.sin_addr), os, ssdp_id, SHIAI_VERSION, my_address, application_type(), iface[i].addr); iface[i].ssdp_msg_len = strlen(iface[i].ssdp_msg); } if (advertise_addr) { ret = sendto(iface[i].fdout, iface[i].ssdp_msg, iface[i].ssdp_msg_len, 0, (struct sockaddr*) &name_out, sizeof(struct sockaddr_in)); //g_print("SSDP %s REQ SEND by timeout\n\n", APPLICATION); if (ret != iface[i].ssdp_msg_len) { perror("SSDP send req"); } } } // for } } // eternal for g_print("SSDP OUT!\n"); g_thread_exit(NULL); /* not required just good pratice */ return NULL; }