Esempio n. 1
0
int main(int argc, char **argv)
{
    int door_sock = -1;
    int uevent_sock = -1;
    struct sockaddr_nl nladdr;
    int uevent_sz = 64 * 1024;

    LOGI("Android Display Daemon version %d.%d", ver_major, ver_minor);

    /*
     * Create all the various sockets we'll need
     */

    // Socket to listen on for incomming framework connections
    if ((door_sock = android_get_control_socket(DISPD_SOCKET)) < 0) {
        LOGE("Obtaining file descriptor socket '%s' failed: %s",
             DISPD_SOCKET, strerror(errno));
        exit(1);
    }

    if (listen(door_sock, 4) < 0) {
        LOGE("Unable to listen on fd '%d' for socket '%s': %s", 
             door_sock, DISPD_SOCKET, strerror(errno));
        exit(1);
    }

    mkdir("/dev/block/dispd", 0755);

    // Socket to listen on for uevent changes
    memset(&nladdr, 0, sizeof(nladdr));
    nladdr.nl_family = AF_NETLINK;
    nladdr.nl_pid = getpid();
    nladdr.nl_groups = 0xffffffff;

    if ((uevent_sock = socket(PF_NETLINK,
                             SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {
        LOGE("Unable to create uevent socket: %s", strerror(errno));
        exit(1);
    }

    if (setsockopt(uevent_sock, SOL_SOCKET, SO_RCVBUFFORCE, &uevent_sz,
                   sizeof(uevent_sz)) < 0) {
        LOGE("Unable to set uevent socket options: %s", strerror(errno));
        exit(1);
    }

    if (bind(uevent_sock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
        LOGE("Unable to bind uevent socket: %s", strerror(errno));
        exit(1);
    }

    /*
     * Bootstrap 
     */

    bootstrap = 1;

    // Switch
    switch_bootstrap();
    dvi_detection_bootstrap();
    hdmi_detection_bootstrap();

    bootstrap = 0;
    /*
     * Main loop
     */
    LOG_DISP("Bootstrapping complete");
    while(1) {
        fd_set read_fds;
        struct timeval to;
        int max = 0;
        int rc = 0;

        to.tv_sec = (60 * 60);
        to.tv_usec = 0;

        FD_ZERO(&read_fds);
        FD_SET(door_sock, &read_fds);
        if (door_sock > max)
            max = door_sock;
        FD_SET(uevent_sock, &read_fds);
        if (uevent_sock > max)
            max = uevent_sock;

        if (fw_sock != -1) {
            FD_SET(fw_sock, &read_fds);
            if (fw_sock > max)
                max = fw_sock;
        }

        if ((rc = select(max + 1, &read_fds, NULL, NULL, &to)) < 0) {
            LOGE("select() failed (%s)", strerror(errno));
            sleep(1);
            continue;
        }

        if (!rc) {
            continue;
        }

        if (FD_ISSET(door_sock, &read_fds)) {
            struct sockaddr addr;
            socklen_t alen;

            alen = sizeof(addr);

            if (fw_sock != -1) {
                LOGE("Dropping duplicate framework connection");
                int tmp = accept(door_sock, &addr, &alen);
                close(tmp);
                continue;
            }

            if ((fw_sock = accept(door_sock, &addr, &alen)) < 0) {
                LOGE("Unable to accept framework connection (%s)",
                     strerror(errno));
            }
            LOG_DISP("Accepted connection from framework");
            //Send the states whether the disp already been connected through fw_sock
            if ((rc = dispmgr_send_status()) < 0) {
                LOGE("Unable to send dispmgr status to framework (%d)", rc);
            }
        }

        if (FD_ISSET(fw_sock, &read_fds)) {
            LOG_DISP("process cmd from framework");
            if ((rc = process_framework_command(fw_sock)) < 0) {
                if (rc == -ECONNRESET) {
                    LOGE("Framework disconnected");
                    close(fw_sock);
                    fw_sock = -1;
                } else {
                    LOGE("Error processing framework command (%s)",
                         strerror(errno));
                }
            }
        }

        if (FD_ISSET(uevent_sock, &read_fds)) {
            //LOG_DISP("process uevent from kernel");
            if ((rc = process_uevent_message(uevent_sock)) < 0) {
                LOGE("Error processing uevent msg (%s)", strerror(errno));
            }
        }
    } // while

}
Esempio n. 2
0
int main(int argc,char* args[]){

	//TODO read device name from args

	char **tgmArgv;
	void *dlHandle;

	const TGM_RadioFunctions *(*tgmInit)(const struct TGM_Env *, int, char **); //define a varible that hold a pointer to init function
	const TGM_RadioFunctions *funcs; // define a varbile that hold a pointer to TGM_RadioFunctions structure

	char libPath[PROPERTY_VALUE_MAX];

	unsigned char hasLibArgs = 0;

	//Should we read something here?
	const char * tgmLibPath = "/system/lib/libhuawei-tgm.so";

	int uevent_sock = -1;
    	struct sockaddr_nl nladdr;
    	int uevent_sz = 64 * 1024;

	LOGI("TGM Daemon version %d.%d", ver_major, ver_minor);
    
    system("mount -o rw -t usbfs none /proc/bus/usb"); 

	// Socket to listen on for uevent changes
    	memset(&nladdr, 0, sizeof(nladdr));
    	nladdr.nl_family = AF_NETLINK;
    	nladdr.nl_pid = getpid();
    	nladdr.nl_groups = 0xffffffff;

    	if ((uevent_sock = socket(PF_NETLINK,
                             SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {
        	LOGE("Unable to create uevent socket: %s", strerror(errno));
        	exit(1);
    	}

    	if (setsockopt(uevent_sock, SOL_SOCKET, SO_RCVBUFFORCE, &uevent_sz,
                   	sizeof(uevent_sz)) < 0) {
       		LOGE("Unable to set uevent socket options: %s", strerror(errno));
        	exit(1);
    	}

	if (setsockopt(uevent_sock, SOL_SOCKET, SO_REUSEADDR, &uevent_sz,
                   	sizeof(uevent_sz)) < 0) {
       		LOGE("Unable to set uevent socket options: %s", strerror(errno));
        	exit(1);
    	}

    	if (bind(uevent_sock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
        	LOGE("Unable to bind uevent socket: %s", strerror(errno));
        	exit(1);
    	}


	 //OPEN LIBRARY
	 dlHandle = dlopen(tgmLibPath, RTLD_NOW);

	 if (dlHandle == NULL) {
		 fprintf(stderr, "dlopen failed: %s\n", dlerror());
		 exit(-1);
	 }

	TGM_startEventLoop();

	tgmInit = (const TGM_RadioFunctions *(*)(const struct TGM_Env *, int, char **))dlsym(dlHandle, "TGM_Init");



	if (tgmInit == NULL) {
		fprintf(stderr, "RIL_Init not defined or exported in %s\n", tgmLibPath);
		exit(-1);
	}

	funcs = tgmInit(&s_tgmEnv, argc, tgmArgv);

	TGM_register(funcs);

	 while(1) {
		// sleep(UINT32_MAX) seems to return immediately on bionic
		//sleep(0x00ffffff);
		fd_set read_fds;
        	struct timeval to;
        	int max = 0;
        	int rc = 0;

        	to.tv_sec = (60 * 60);
        	to.tv_usec = 0;

		FD_ZERO(&read_fds);

		FD_SET(uevent_sock, &read_fds);
        	if (uevent_sock > max)
            		max = uevent_sock;

		if ((rc = select(max + 1, &read_fds, NULL, NULL, &to)) < 0) {
            		LOGE("select() failed (%s)", strerror(errno));
            		sleep(1);
            		continue;
        	}

        	if (!rc) {
            		continue;
        	}

		if (FD_ISSET(uevent_sock, &read_fds)) {
            		if ((rc = process_uevent_message(uevent_sock)) < 0) {
                		LOGE("Error processing uevent msg (%s)", strerror(errno));
            		}
       	 	}
	}

	return 0;

}
Esempio n. 3
0
void *usb_tty_monitor_thread(void *arg)
{
	struct sockaddr_nl nladdr;
	struct pollfd pollfds[2];
	int uevent_sock;
	int ret, max = 0;
	int uevent_sz = 64 * 1024;
	int timeout = -1;
	struct sigaction timeoutsigact;

	LOGE("3G modem monitor thread is start");

	timeoutsigact.sa_handler = restart_rild;
	sigemptyset(&timeoutsigact.sa_mask);
	sigaddset(&timeoutsigact.sa_mask, SIGALRM);
	sigaction(SIGALRM, &timeoutsigact, 0);

	memset(&nladdr, 0, sizeof(nladdr));
	nladdr.nl_family = AF_NETLINK;
	nladdr.nl_pid = getpid();
	nladdr.nl_groups = 0xffffffff;

	uevent_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
	if (uevent_sock < 0) {
		LOGE(" Netlink socket faild, usb monitor exiting...");
		return NULL;
	}

	if (setsockopt(uevent_sock, SOL_SOCKET, SO_RCVBUFFORCE, &uevent_sz,
		       sizeof(uevent_sz)) < 0) {
		LOGE("Unable to set uevent socket options: %s", strerror(errno));
		return NULL;
	}

	if (bind(uevent_sock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
		   LOGE("Unable to bind uevent socket: %s", strerror(errno));
		   return NULL;
	}
	pollfds[0].fd = uevent_sock;
	pollfds[0].events = POLLIN;

	ret = fcntl(uevent_sock,F_SETFL, O_NONBLOCK);
	if (ret < 0)
		LOGE("Error on fcntl:%s", strerror(errno));

	while (1) {
		ret = poll(pollfds, 1, timeout);

		switch (ret) {
		case 0:
			LOGD("poll timeout");
			continue;
		case -1:
			LOGD("poll error:%s", strerror(errno));
			break;

		default:
			if (pollfds[0].revents & POLLIN)
				process_uevent_message(uevent_sock);
		}
	}

	close(uevent_sock);
}