Exemple #1
0
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();
}
Exemple #3
0
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);
}
Exemple #4
0
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;
}