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); } }
//读取配置文件 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); }
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."); } } }
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); }
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."); } }
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."); }
//处理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."); } }
/* * 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); }