?? ftp.c
字號(hào):
case SM_FTP_RESPOND:
SM_FTP_RESPOND_Label:
if(!TCPIsPutReady(FTPSocket))
{
return TRUE;
}
else
{
ROM char* pMsg;
pMsg = FTPResponseString[FTPResponse];
while( (v = *pMsg++) )
{
USARTPut(v);
TCPPut(FTPSocket, v);
}
TCPFlush(FTPSocket);
FTPResponse = FTP_RESP_NONE;
smFTP = SM_FTP_CONNECTED;
}
// No break - this will speed up little bit
case SM_FTP_CONNECTED:
if ( FTPCommand != FTP_CMD_NONE )
{
if ( ExecuteFTPCommand(FTPCommand) )
{
if ( FTPResponse != FTP_RESP_NONE )
smFTP = SM_FTP_RESPOND;
else if ( FTPCommand == FTP_CMD_QUIT )
smFTP = SM_FTP_NOT_CONNECTED;
FTPCommand = FTP_CMD_NONE;
smFTPCommand = SM_FTP_CMD_IDLE;
}
else if ( FTPResponse != FTP_RESP_NONE )
{
smFTP = SM_FTP_RESPOND;
goto SM_FTP_RESPOND_Label;
}
}
break;
}
return TRUE;
}
static BOOL ExecuteFTPCommand(FTP_COMMAND cmd)
{
switch(cmd)
{
case FTP_CMD_USER:
FTPFlags.Bits.bUserSupplied = TRUE;
FTPFlags.Bits.bLoggedIn = FALSE;
FTPResponse = FTP_RESP_USER_OK;
strncpy(FTPUser, FTP_argv[1], sizeof(FTPUser));
break;
case FTP_CMD_PASS:
if ( !FTPFlags.Bits.bUserSupplied )
FTPResponse = FTP_RESP_LOGIN;
else
{
if ( FTPVerify(FTPUser, FTP_argv[1]) )
{
FTPFlags.Bits.bLoggedIn = TRUE;
FTPResponse = FTP_RESP_PASS_OK;
}
else
FTPResponse = FTP_RESP_LOGIN;
}
break;
case FTP_CMD_QUIT:
return Quit();
case FTP_CMD_PORT:
FTPDataPort.v[1] = (BYTE)atoi(FTP_argv[5]);
FTPDataPort.v[0] = (BYTE)atoi(FTP_argv[6]);
FTPResponse = FTP_RESP_OK;
break;
case FTP_CMD_STOR:
return PutFile();
case FTP_CMD_ABORT:
FTPResponse = FTP_RESP_OK;
if ( FTPDataSocket != INVALID_SOCKET )
TCPDisconnect(FTPDataSocket);
break;
default:
FTPResponse = FTP_RESP_UNKNOWN;
break;
}
return TRUE;
}
static BOOL Quit(void)
{
switch(smFTPCommand)
{
case SM_FTP_CMD_IDLE:
#if defined(FTP_PUT_ENABLED)
if ( smFTPCommand == SM_FTP_CMD_RECEIVE )
MPFSClose();
#endif
if ( FTPDataSocket != INVALID_SOCKET )
{
#if defined(FTP_PUT_ENABLED)
MPFSClose();
#endif
TCPDisconnect(FTPDataSocket);
smFTPCommand = SM_FTP_CMD_WAIT;
}
else
goto Quit_Done;
break;
case SM_FTP_CMD_WAIT:
if ( !TCPIsConnected(FTPDataSocket) )
{
Quit_Done:
FTPResponse = FTP_RESP_QUIT_OK;
smFTPCommand = SM_FTP_CMD_WAIT_FOR_DISCONNECT;
}
break;
case SM_FTP_CMD_WAIT_FOR_DISCONNECT:
if ( TCPIsPutReady(FTPSocket) )
{
if ( TCPIsConnected(FTPSocket) )
TCPDisconnect(FTPSocket);
}
break;
}
return FALSE;
}
static BOOL PutFile(void)
{
BYTE v;
switch(smFTPCommand)
{
case SM_FTP_CMD_IDLE:
if ( !FTPFlags.Bits.bLoggedIn )
{
FTPResponse = FTP_RESP_LOGIN;
return TRUE;
}
else
{
FTPResponse = FTP_RESP_DATA_OPEN;
FTPDataSocket = TCPConnect(&REMOTE_HOST(FTPSocket), FTPDataPort.Val);
// Make sure that a valid socket was available and returned
// If not, return with an error
if(FTPDataSocket != INVALID_SOCKET)
{
smFTPCommand = SM_FTP_CMD_WAIT;
}
else
{
FTPResponse = FTP_RESP_DATA_NO_SOCKET;
return TRUE;
}
}
break;
case SM_FTP_CMD_WAIT:
if ( TCPIsConnected(FTPDataSocket) )
{
#if defined(FTP_PUT_ENABLED)
if ( !MPFSIsInUse() )
#endif
{
#if defined(FTP_PUT_ENABLED)
FTPFileHandle = MPFSFormat();
#endif
smFTPCommand = SM_FTP_CMD_RECEIVE;
}
}
break;
case SM_FTP_CMD_RECEIVE:
if ( TCPIsGetReady(FTPDataSocket) )
{
// Reload timeout timer.
lastActivity = TickGet();
MPFSPutBegin(FTPFileHandle);
while( TCPGet(FTPDataSocket, &v) )
{
USARTPut(v);
#if defined(FTP_PUT_ENABLED)
MPFSPut(v);
#endif
}
FTPFileHandle = MPFSPutEnd();
TCPDiscard(FTPDataSocket);
// Print hash characters on FTP client display
if(TCPIsPutReady(FTPSocket))
{
TCPPut(FTPSocket, '#');
TCPFlush(FTPSocket);
}
}
else if ( !TCPIsConnected(FTPDataSocket) )
{
#if defined(FTP_PUT_ENABLED)
MPFSPutEnd();
MPFSClose();
#endif
TCPDisconnect(FTPDataSocket);
FTPDataSocket = INVALID_SOCKET;
FTPResponse = FTP_RESP_DATA_CLOSE;
return TRUE;
}
}
return FALSE;
}
static FTP_COMMAND ParseFTPCommand(char *cmd)
{
FTP_COMMAND i;
for ( i = 0; i < (FTP_COMMAND)FTP_COMMAND_TABLE_SIZE; i++ )
{
if ( !memcmppgm2ram((void*)cmd, (ROM void*)FTPCommandString[i], 4) )
return i;
}
return FTP_CMD_UNKNOWN;
}
static void ParseFTPString(void)
{
BYTE *p;
BYTE v;
enum { SM_FTP_PARSE_PARAM, SM_FTP_PARSE_SPACE } smParseFTP;
smParseFTP = SM_FTP_PARSE_PARAM;
p = (BYTE*)&FTPString[0];
// Skip white blanks
while( *p == ' ' )
p++;
FTP_argv[0] = (char*)p;
FTP_argc = 1;
while( (v = *p) )
{
switch(smParseFTP)
{
case SM_FTP_PARSE_PARAM:
if ( v == ' ' || v == ',' )
{
*p = '\0';
smParseFTP = SM_FTP_PARSE_SPACE;
}
else if ( v == '\r' || v == '\n' )
*p = '\0';
break;
case SM_FTP_PARSE_SPACE:
if ( v != ' ' )
{
FTP_argv[FTP_argc++] = (char*)p;
smParseFTP = SM_FTP_PARSE_PARAM;
}
break;
}
p++;
}
}
#endif // #if defined(STACK_USE_FTP_SERVER)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -