Exemplo n.º 1
0
void begin_session(session_t *sess)
{
    /*开启接收带外数据*/
    activate_oobinline(sess->ctrl_fd);

    /*
    	int sockfds[2];
    	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds) < 0)
    	{
    		ERR_EXIT("socketpair");
    	}
    */
    /*初始化内部进程间通讯通道*/
    priv_sock_init(sess);

    pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        ERR_EXIT("fork");
    }

    if (pid == 0)
    {
        //ftp服务进程
        /*
        close(sockfds[0]);
        sess->child_fd = sockfds[1];
        */
        /*设置子进程环境*/
        priv_sock_set_child_context(sess);
        handle_child(sess);
    }
    else
    {
        //nobody进程
        /*
        close(sockfds[1]);
        sess->parent_fd = sockfds[0];
        */
        /*设置父进程环境*/
        priv_sock_set_parent_context(sess);
        handle_parent(sess);
    }
}
Exemplo n.º 2
0
void priv_sock_set_proto_context(session_t *sess)
{
    if(sess->nobody_fd != -1)
    {
        /* 在子进程中关闭nobody_fd套接字 */
        close(sess->nobody_fd);
        sess->nobody_fd = -1;
    }

    /* 启动控制连接定时器,捕获SIGALRM信号,并对其进行处理 */
    setup_signal_alarm_ctrl_fd();
    /* 安装SIGURG信号,并对其进行处理 */
    setup_signal_sigurg();
    /* 开启带外数据,即设置套接字选项使其支持带外数据 */
    activate_oobinline(sess->peerfd);
    /* 当有带外数据或紧急数据到来时,允许发送SIGURG信号 */
    activate_signal_sigurg(sess->peerfd);
}
Exemplo n.º 3
0
void begin_session(session_t *sess)
{
    activate_oobinline(sess->ctrl_fd);
    priv_sock_init(sess);
    pid_t pid;
    pid = fork();
    if(pid < 0)
        ERR_EXIT("fork");

    if(pid == 0)
    {
        /* ftp process */
        priv_sock_set_child_context(sess);
        handle_child(sess);
    }else
    {
        /* nobody process */
        priv_sock_set_parent_context(sess);
        handle_parent(sess);
    }
}