📄 ftp.c
字号:
//此命令通知服务中止以前的FTP命令和与之相关的数据传送。如果先前的操作
//已经完成,则没有动作,返回226。如果没有完成,返回426,然后再返回
//226。关闭控制连接,数据连接不关闭。
{"DELE", CmdDele},
//删除(DELE)
//此命令删除指定路径下的文件。用户进程负责对删除的提示。
{"RMD", CmdRmd},
//删除目录(RMD)
//此命令删除目录。
{"MKD", CmdMkd},
//创建目录(MKD)
//此命令在指定路径下创建新目录。
{"PWD", CmdPwd},
//打印工作目录(PWD)
//在响应是返回当前工作目录。
{"LIST", CmdList},
//列表(LIST)
//服务器传送列表到被动DTP,如果路径指定一个目录或许多文件,返回指定
//路径下的文件列表。如果路径名指定一个文件,服务器返回文件的当前信
//息,参数为空表示用户当前的工作目录或默认目录。数据传输在ASCII或
//EBCDIC下进行,用户必须确认这一点。因为文件信息因系统不同而不同,所
//以不可能被程序自动利用,但是人类用户却很需要。
{"NLST", CmdNlst},
//名字列表(NLST)
//服务器传送目录表名到用户,路径名应指定目录或其它系统指定的文件群描
//述子;空参数指当前目录。服务器返回文件名数据流,以ASCII或EBCDIC形
//式传送,并以<CRLF>或<NL>分隔。这里返回的信息有时可以供程序进行进一
//步处理。
{"SITE", CmdSite},
//站点参数(SITE)
//服务器用来提供服务器系统信息,信息因系统不同而不同,格式在HELP
//SITE命令应答中给出。
{"SYST", CmdSyst},
//系统(SYST)
//用于确定服务器上运行的操作系统。
{"STAT", CmdStat},
//状态(STAT)
//此命令返回控制连接状态,它可以在文件传送过程中发送,服务器返回操作
//进行的状态。也可以在文件传送之间发送,这时命令有参数,参数是路径名,
//此命令的功能除了数据在控制连接上传送以外和列表命令相似。如果指定部
//分路径,服务器以文件名或与说明相关的属性返回;如没有参数,服务器返
//回服务器FTP进程的状态信息,包括传输参数的当前值和连接状态。
{"HELP", Cmdhelp},
//帮助(HELP)
//这条命令我们在平常系统中得到的帮助没有什么区别,响应类型是211或214。
//建议在使用USER命令前使用此命令。
{"NOOP", Cmdnoop},
//等待(NOOP);必须
//此命令不产生什么实际动作,它仅使服务器返回OK。
{NULL, NULL}
};
//*********************************************************************************************************
void FtpCmdTask(void *pdata);
void FtpTranTask(void *pdata);
void FtpListeningTask(void *pdata);
uint8 SendStr(uint16 LinkHandle, char *str);
/*********************************************************************************************************
** "函数定义"
** functions here
********************************************************************************************************/
/*********************************************************************************************************
** Function name: InitFtp
** Descriptions: init ZLG/FS-S
** Input:Fip: FPT linker info
**
** Output TRUE: OK
** FALSE: NOK
** Created by: chenmingji
** Created Date: 2005-06-03
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 InitFtp (void)
{
uint16 i;
for (i = 0; i < MAX_FTP_LINKS; i++)
{
FtpInfo[i].State = FTP_DEATH;
FtpInfo[i].TraTaskPrio = FTP_TASK_START_PRIO + MAX_FTP_LINKS + i + 1;
}
OSTaskCreate(FtpListeningTask,(void *)0, &TraTaskStk[FtpLISTaskStkLengh - 1], FTP_TASK_START_PRIO);
return TRUE;
}
/*********************************************************************************************************
** Function name: CmdUser
** Descriptions: the processing function of USER
** Input: Parameter: Parameter string
** PLen: legnth of Parameter string
** Fip: FPT linker info
** Output 0: OK
** other: NOK
** Created by: chenmingji
** Created Date: 2005-06-03
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 CmdUser(char *Parameter, uint8 PLen, FTP_INFO *Fip)
//用户名(USER);必须
//参数是标记用户的Telnet串。用户标记是访问服务器必须的,此命令通常
//是控制连接后第一个发出的命令,有些主机还会要求口令和帐户。服务器
//可以在任何时间接收新的USER命令以改变访问控制和(或)帐户信息。
//这可以重新开始登录过程,所以传输参数不变,在进行中的文件传输在过
//去的访问控制参数下完成。
{
Parameter = Parameter;
PLen = PLen;
if (Fip->State != FTP_WAIT_USER)
{
SendStr(Fip->LinkHandle, (char *)ServAvai);
close(Fip->LinkHandle);
}
else
{
Fip->State = FTP_WAIT_PASSWORD;
SendStr(Fip->LinkHandle, (char *)UsrNameOK);
}
Fip->StateEx = 0;
return 0;
}
/*********************************************************************************************************
** Function name: CmdPass
** Descriptions: the processing function of PASS
** Input: Parameter: Parameter string
** PLen: legnth of Parameter string
** Fip: FPT linker info
** Output 0: OK
** other: NOK
** Created by: chenmingji
** Created Date: 2005-06-03
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 CmdPass(char *Parameter, uint8 PLen, FTP_INFO *Fip)
//口令(PASS)
//参数是标记用户口令的Telnet串。此命令紧跟USER命令,在某些站点它是
//完成访问控制不可缺少的一步。因此口令是个重要的东西,因此不能显示
//出来,服务器方没有办法隐藏口令,所以这一任务得由用户FTP进程完成。
{
Parameter = Parameter;
PLen = PLen;
if (Fip->State != FTP_WAIT_PASSWORD)
{
SendStr(Fip->LinkHandle, (char *)ServAvai);
close(Fip->LinkHandle);
}
else
{
Fip->State = FTP_NOOP;
SendStr(Fip->LinkHandle, (char *)UsrEnter);
}
Fip->StateEx = 0;
return 0;
}
/*********************************************************************************************************
** Function name: CmdAcct
** Descriptions: the processing function of ACCT
** Input: Parameter: Parameter string
** PLen: legnth of Parameter string
** Fip: FPT linker info
** Output 0: OK
** other: NOK
** Created by: chenmingji
** Created Date: 2005-06-03
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 CmdAcct(char *Parameter, uint8 PLen, FTP_INFO *Fip)
//认证 (ACCT)
//参数是标记用户帐户的Telnet串。此命令不需要与USER相关,一些站点可
//能需要帐户用于登录,另一些可以限制帐户的权限,在后一种情况下,此
//命令可在任何时候发送。应答的不同可以区别不同的情况:当登录需要帐
//户信息时,对PASS命令的响应是332。另外,如果不需要帐户信息,对PASS
//的响应是230,如果需要帐户信息在以后需要,服务器会返回332或532,
//这要看它是保存此命令还是拒绝此命令了。
{
Parameter = Parameter;
PLen = PLen;
SendStr(Fip->LinkHandle, (char *)CmdNotAllow);
Fip->StateEx = 0;
return 0;
}
/*********************************************************************************************************
** Function name: CmdCwd
** Descriptions: the processing function of CWD
** Input: Parameter: Parameter string
** PLen: legnth of Parameter string
** Fip: FPT linker info
** Output 0: OK
** other: NOK
** Created by: chenmingji
** Created Date: 2005-06-03
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 CmdCwd(char *Parameter, uint8 PLen, FTP_INFO *Fip)
//改变工作目录(CWD)
//此命令使用户可以在不同的目录或数据集下工作而不用改变它的登录或帐
//户信息。传输参数也不变。参数一般是目录名或与系统相关的文件集合。
{
Parameter[PLen - 2] = 0;
Parameter[PLen - 1] = 0;
if (Parameter[PLen - 3] != '/')
{
Parameter[PLen - 2] = '/';
}
if (Parameter[1] == '/')
{
strcpy(Fip->Path, (const char *)Parameter + 1);
}
else if (strlen((const char *)(Fip->Path)) + PLen < FTP_PATH_LEGTH + 5)
{
if (Parameter[PLen - 3] == '/')
{
Parameter[PLen - 2] = 0;
}
strcat(Fip->Path, (const char *)Parameter + 1);
}
strcpy((char *)(Fip->Buf), CwdInfo1);
strcat((char *)(Fip->Buf), (const char *)(Fip->Path));
strcat((char *)(Fip->Buf), (const char *)(CwdInfo2));
SendStr(Fip->LinkHandle, (char *)(Fip->Buf));
Fip->StateEx = 0;
return 0;
}
/*********************************************************************************************************
** Function name: CmdCdup
** Descriptions: the processing function of CDUP
** Input: Parameter: Parameter string
** PLen: legnth of Parameter string
** Fip: FPT linker info
** Output 0: OK
** other: NOK
** Created by: chenmingji
** Created Date: 2005-06-03
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 CmdCdup(char *Parameter, uint8 PLen, FTP_INFO *Fip)
//回到上一层目录(CDUP)
//此命令要求系统实现目录树结构,它的响应和CWD的相同。
{
uint32 Legth;
char *cp;
Parameter = Parameter;
PLen = PLen;
cp = Fip->Path;
while (*cp != 0)
{
cp++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -