Exemplo n.º 1
0
Arquivo: process.c Projeto: dcant/zftp
void handle_ftpcmd(session_t *sess)
{
	char buf[MAXCMD] = {0};
	sprintf(buf, "Welcome to zftp!\r\n%d", FTP_READY);
	ftp_cmdio_write_m(sess->ctrl_fd, FTP_READY, buf);
	while (1) {
		start_signal_alarm_ctrl();
		_reset_session_cmd(sess);

		int ret = ftp_cmdio_get_cmd_args(sess->ctrl_fd, sess->ftp_cmd_line,
			MAXCMD);
		if (ret == -1) {
			if (errno == EINTR)
				continue;
			ERROR_EXIT("ftp_cmdio_get_cmd_args");
		} else if (ret == 0)
			exit(0);

		str_trim_crlf(sess->ftp_cmd_line);
		str_split(sess->ftp_cmd_line, sess->ftp_cmd_op,
			sess->ftp_cmd_arg, ' ');
		str_toupper(sess->ftp_cmd_op);

		_handle_map(sess);
	}
}
Exemplo n.º 2
0
//读取配置文件
void parseconf_load_file(const char *path)
{
	FILE *fp = fopen(path, "r");
	if (fp == NULL)
		ERR_EXIT("fopen");

	char setting_line[1024] = {0};
	while (fgets(setting_line, sizeof(setting_line), fp) != NULL)
	{
        //去掉空行、全是空格的、以#号开头的注释行
		if (strlen(setting_line) == 0
			|| setting_line[0] == '#'
			|| str_all_space(setting_line))
			continue;

        //去掉后面的/r/n
		str_trim_crlf(setting_line);

        //解析配置信息
		parseconf_load_setting(setting_line);
		memset(setting_line, 0, sizeof(setting_line));
	}

	fclose(fp);
}
Exemplo n.º 3
0
void handle_child(session_t *pses)
{
    if(pses == NULL)
        handle_error_str("do_cmd_user: pses is NULL.");

    ftp_reply(pses->ctrl_fd, FTP_GREET, "(Mftp 0.1)");      //220
    int iret;
    while(true)
    {
        memset(pses->cmdline, 0, MAX_COMMAND_LINE);
        memset(pses->cmd, 0, MAX_COMMAND);
        memset(pses->arg, 0, MAX_ARG);
        iret = recvline(pses->ctrl_fd, pses->cmdline, MAX_COMMAND_LINE);//接收命令行
        if(iret == -1)
            handle_error("recvline");
        else if(iret == 0)
            handle_error("recvline");

        //去掉\r\n
        str_trim_crlf(pses->cmdline);
        //分割命令和参数
        str_split(pses->cmdline, pses->cmd, pses->arg, ' ');
        //将命令转换成大写
        str_upper(pses->cmd);

#ifdef _DEBUG_
        printf("cmd = [%s] arg = [%s]\n", pses->cmd,pses->arg);
#endif
        //处理ftp命令
        int len = ARRAYLEN(ctrl_cmds);
        int i = 0;
        for(i = 0; i < len; i++)
        {
            if(strcmp(ctrl_cmds[i].cmd, pses->cmd) == 0)
            {
                if(ctrl_cmds[i].cmd_handler != NULL)
                {
                    (*ctrl_cmds[i].cmd_handler)(pses);
                    //等价于ctrl_cmds[i].cmd_handler(pses);
                }
                else
                {
                    ftp_reply(pses->ctrl_fd, FTP_COMMANDNOTIMPL, "Unimplement command.");   //502
                }
                break;
            }
        }

        if(i >= len)
        {
            //没找到命令
            ftp_reply(pses->ctrl_fd, FTP_BADCMD, "Unknown command.");
        }

    }
}
Exemplo n.º 4
0
void parseconf_load_file(const char *path){
	FILE *fp = fopen(path, "r");
	if(fp == NULL) ERR_EXIT("fopen");
	
	char setting_line[MAX_SETTING_LINE] = {0};
	while(fgets(setting_line, sizeof(setting_line), fp) != NULL){
		if(strlen(setting_line) == 0 
			|| setting_line[0] == '#'
			|| str_all_space(setting_line))
			continue;
		str_trim_crlf(setting_line);
		parseconf_load_setting(setting_line);
		memset(setting_line, 0, sizeof setting_line);
	}
	fclose(fp);

}
Exemplo n.º 5
0
void handle_child(session_t* sess)
{
	ftp_reply(sess, FTP_GREET, "(miniftpd 0.1)");
	int ret;	

	while(1)	
	{
		memset(sess->cmdline, 0, sizeof(sess->cmdline));
		memset(sess->cmd, 0, sizeof(sess->cmd));
		memset(sess->arg, 0, sizeof(sess->arg));
	
		start_cmdio_alarm();
	
		ret = readline(sess->ctrl_fd, sess->cmdline, MAX_COMMAND_LINE);
		if(ret == -1)
			ERR_EXIT("readline");
		
		else if(ret == 0)
			exit(EXIT_SUCCESS);		

		//remove \r\n	
		//parse FTP command and ar
		str_trim_crlf(sess->cmdline);
		str_split(sess->cmdline, sess->cmd, sess->arg, ' ');
		str_upper(sess->cmd);	
		
		int i;
		int size = sizeof(ctrl_cmds) / sizeof(ctrl_cmds[0]);
		for(i = 0; i < size; ++i)
		{
			if(strcmp(ctrl_cmds[i].cmd, sess->cmd) == 0)
			{
				if(ctrl_cmds[i].cmd_handler != NULL)
					ctrl_cmds[i].cmd_handler(sess);
				else
					ftp_reply(sess, FTP_COMMANDNOTIMPL, 
					"Unimplement command");
				break;
			}
		}
		
		if(i == size)
			ftp_reply(sess, FTP_BADCMD, "Unknown command.");
	}
}
Exemplo n.º 6
0
void handle_sigurg(int sig)
{
	if(p_sess->data_fd == -1)
		return;

	char cmdline[MAX_COMMAND_LINE] = {0};
	int ret = readline(p_sess->ctrl_fd, cmdline, MAX_COMMAND_LINE);
	if(ret <= 0)
		ERR_EXIT("readline");

	str_trim_crlf(cmdline);

	if(strcmp(cmdline, "ABOR") == 0 || 
	   strcmp(cmdline, "\377\364\377\362ABOR") == 0)
	{
		p_sess->abor_received = 1;
		shutdown(p_sess->data_fd, SHUT_RDWR);
	}
	else 
		ftp_reply(p_sess, FTP_BADCMD, "Unknown command.");
}
Exemplo n.º 7
0
//处理SIGURG信号,实质是处理带外数据
static void handle_signal_sigurg(int sig)
{
    char cmdline[1024] = {0};
    int ret = readline(p_sess->peerfd, cmdline, sizeof cmdline);
    if(ret <= 0) //存在带外数据,不可能为0
        ERR_EXIT("readline");

    str_trim_crlf(cmdline);
    str_upper(cmdline);

    if(strcmp("ABOR", cmdline) == 0 
        || strcmp("\377\364\377\362ABOR", cmdline) == 0)
    {
        //处理abor指令
        p_sess->is_receive_abor = 1;
        close(p_sess->data_fd);
        p_sess->data_fd = -1;
    }
    else
    {
        //未识别的命令
        ftp_reply(p_sess, FTP_BADCMD, "Unknown command.");
    }
}
Exemplo n.º 8
0
/*
* parseconf_load_file -- 加载配置文件配置
* 参数:
    @path: 配置文件路径
*/
void parseconf_load_file(const char *path)
{
    FILE *fp = fopen(path, "r");
    if(fp == NULL)
        handle_error("fopen");
    char setting_line[1024] = {0};

    while(fgets(setting_line, sizeof(setting_line), fp) != NULL)
    {
        if((strlen(setting_line) == 0) ||
            (setting_line[0] == '#') ||
            str_all_space(setting_line))
            {
                memset(setting_line, 0, sizeof(setting_line));
                continue;
            }
        //将得到的有效字符串去除\r\n
        str_trim_crlf(setting_line);
        //解析配置行,将信息保存在对应的变量中
        parseconf_load_setting(setting_line);
        memset(setting_line, 0, sizeof(setting_line));
    }
    fclose(fp);
}