Exemplo n.º 1
0
Arquivo: vnc.c Projeto: fdgonthier/kas
/* This function starts the proxy process and connects to it. */
static int kcd_vnc_start_proxy(struct kcd_vnc_mode_state *vms) {
    int error = 0;
    int sock_pair[2] = { -1, -1 };
    int listen_sock = -1;
    int local_addr_len;
    struct sockaddr_in local_addr;
    char k_opt[100];
    char *argv[] = { "/usr/bin/vncreflector", "-k", k_opt, "-f", "3", "unused", NULL };
    
    do {
	/* Listen to 127.0.0.1 on the first free port. */
	memset(&local_addr, 0, sizeof(local_addr));
	local_addr.sin_family = AF_INET;
	local_addr.sin_addr.s_addr = INADDR_ANY;
	local_addr.sin_port = 0;				
		
	error = ksock_create(&listen_sock);
	if (error) break;
	
	if (bind(listen_sock, (struct sockaddr *) &local_addr, sizeof(local_addr)) < 0) {
	    kmod_set_error("cannot bind socket: %s", strerror(errno));
	    error = -1;
	    break;
	}
	
	error = ksock_listen(listen_sock);
	if (error) break;
	
	error = ksock_set_unblocking(listen_sock);
	if (error) break;
	
	local_addr_len = sizeof(local_addr);
	if (getsockname(listen_sock, (struct sockaddr *) &local_addr, &local_addr_len) < 0) {
	    kmod_set_error("getsockname failed: %s", strerror(errno));
	    error = -1;
	    break;
	}
	
	vms->proxy_port = htons(local_addr.sin_port);
	
	/* Create the proxy host socket. */
        kdaemon_open_socket_pair(sock_pair);
	vms->proxy_sock = sock_pair[0];
	sock_pair[0] = -1;
	    
        /* Format the '-k' option. */
        sprintf(k_opt, "%d:%d", sock_pair[1], listen_sock);
	
	/* Start the proxy process. */
        vms->process.log_level = KCD_LOG_VNC;
        error = kcd_process_start(&vms->process, argv, kcd_vnc_proxy_process_gc, vms);
        if (error) break;
    
    } while (0);
    
    kdaemon_close_socket_pair(sock_pair);
    ksock_close(&listen_sock);
    
    return error;
}
Exemplo n.º 2
0
/* Loop accepting connections. */
int kcd_frontend_listener_loop() {
    int error = 0;
    int nb_child = 0;
    int listen_sock = -1;
    
    kdaemon_set_task("Listener");
    kmod_log_msg(KCD_LOG_BRIEF, "kcd_frontend_listener_loop() called.\n");
    
    do {
	/* Begin listening for connections. */
	error = ksock_create(&listen_sock);
	if (error) break;
	
	error = ksock_bind(listen_sock, global_opts.listen_addr.data, global_opts.listen_port);
	if (error) break;
	
	error = ksock_listen(listen_sock);
	if (error) break;
	
	error = ksock_set_unblocking(listen_sock);
	if (error) break;
	
	/* Loop accepting connections. */
	while (1) {
	    struct kselect sel;
	    
	    /* Wait for a connection. */
	    kdaemon_prepare_select(&sel);
	    kselect_add_read(&sel, listen_sock);
	    error = kdaemon_do_select(&sel);
	    if (error) break;
            
            /* We've been signaled. */
            if (global_opts.sigusr1_count || global_opts.sigchld_count) {
                error = kcd_frontend_loop_handle_signal(&nb_child);
                if (error) break;
            }
	    
	    /* Try to accept a connection. */
	    if (kselect_in_read(&sel, listen_sock)) {
		kcd_frontend_loop_accept_conn(&nb_child, listen_sock);
	    }
	}
	
	if (error) break;
	
    } while (0);
    
    ksock_close(&listen_sock);
    
    /* Collect all children. */
    kcd_frontend_loop_collect_zombie(&nb_child, 1);
    
    return error;
}
Exemplo n.º 3
0
Arquivo: cd_srv.c Projeto: GoodOkk/tfs
static int csrv_thread_routine(void *data)
{
	struct socket *lsock = NULL;
	struct socket *con_sock = NULL;
	struct csrv_con *con = NULL;
	int error = 0;

	while (!kthread_should_stop()) {
		if (!csrv_sock) {
			error = ksock_listen(&lsock, INADDR_ANY, 9111, 5);
			if (error) {
				klog(KL_ERR, "csock_listen err=%d", error);
				msleep_interruptible(LISTEN_RESTART_TIMEOUT_MS);
				continue;
			} else {
				mutex_lock(&csrv_lock);
				csrv_sock = lsock;
				mutex_unlock(&csrv_lock);
			}
		}

		if (csrv_sock && !csrv_stopping) {
			klog(KL_DEBUG, "accepting");
			error = ksock_accept(&con_sock, csrv_sock);
			if (error) {
				if (error == -EAGAIN)
					klog(KL_WARN, "csock_accept err=%d", error);
				else
					klog(KL_ERR, "csock_accept err=%d", error);
				continue;
			}
			klog(KL_DEBUG, "accepted con_sock=%p", con_sock);

			if (!csrv_con_start(con_sock)) {
				klog(KL_ERR, "csrv_con_start failed");
				ksock_release(con_sock);
				continue;
			}
		}
	}

	error = 0;
	klog(KL_INFO, "releasing listen socket");
	
	mutex_lock(&csrv_lock);
	lsock = csrv_sock;
	csrv_sock = NULL;
	mutex_unlock(&csrv_lock);

	if (lsock)
		ksock_release(lsock);
	
	klog(KL_INFO, "releasing cons");

	for (;;) {
		con = NULL;
		mutex_lock(&con_list_lock);
		if (!list_empty(&con_list)) {
			con = list_first_entry(&con_list, struct csrv_con, con_list);
			list_del_init(&con->con_list);		
		}
		mutex_unlock(&con_list_lock);
		if (!con)
			break;

		csrv_con_wait(con);
		csrv_con_free(con);
	}