mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-04-01 05:45:33 +01:00
Merge 5551cbfb2b
into af8e036e7b
This commit is contained in:
commit
b6a1aedbef
1 changed files with 111 additions and 20 deletions
|
@ -144,6 +144,44 @@ I64 FTPFileDownload(CTCPSocket *data_socket, U8 *dest)
|
|||
return -1;
|
||||
}
|
||||
|
||||
I64 FTPFileUpload(CTCPSocket *data_socket, U8 *source)
|
||||
{ // New upload function
|
||||
CFile *f;
|
||||
I64 read_bytes, total_sent = 0, res;
|
||||
U8 buf[BLK_SIZE];
|
||||
I64 offset;
|
||||
|
||||
progress4 = 0;
|
||||
f = FOpen(source, "r");
|
||||
if (!f)
|
||||
{
|
||||
ST_ERR_ST "Failed to open %s for reading\n", source;
|
||||
return -1;
|
||||
}
|
||||
|
||||
while ((read_bytes = FBlkRead(f, buf)) > 0)
|
||||
{
|
||||
offset = 0;
|
||||
while (offset < read_bytes)
|
||||
{
|
||||
res = TCPSocketSend(data_socket, buf + offset, read_bytes - offset);
|
||||
if (res <= 0)
|
||||
{
|
||||
ST_ERR_ST "Failed to send data\n";
|
||||
FClose(f);
|
||||
return -1;
|
||||
}
|
||||
offset += res;
|
||||
total_sent += res;
|
||||
progress4 += res;
|
||||
}
|
||||
}
|
||||
|
||||
FClose(f);
|
||||
TCPSocketClose(data_socket);
|
||||
return total_sent;
|
||||
}
|
||||
|
||||
I64 FTPFileView(U8 *filename=NULL, CTask *parent=NULL, CTask **_pu_task=NULL)
|
||||
{
|
||||
U8 *st = MStrPrint("Cd(\"%Q\");Plain(\"%Q\");", __DIR__, filename);
|
||||
|
@ -223,7 +261,6 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
if (!hostname)
|
||||
hostname = StrGet("\nEnter FTP server address (URL or IPV4): ");
|
||||
|
||||
|
||||
if (!IPV4AddressParse(hostname, &addr))
|
||||
{
|
||||
error = DNSAddressInfoGet(hostname, NULL, &result);
|
||||
|
@ -238,7 +275,7 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
if (current->family == AF_INET)
|
||||
{
|
||||
temp_ipv4 = current->address;
|
||||
addr = EndianU32(temp_ipv4->address); // why does it need EndianU32
|
||||
addr = EndianU32(temp_ipv4->address);
|
||||
break;
|
||||
}
|
||||
current = current->next;
|
||||
|
@ -249,7 +286,6 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
NetErr("FTP Client: Failed to resolve address.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ipv4_address.port = EndianU16(port);
|
||||
|
@ -271,7 +307,6 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
|
||||
FTPMessageGet(message_socket, buf);
|
||||
|
||||
|
||||
"\n\nType HELP for command list.\n\n";
|
||||
while (TRUE)
|
||||
{
|
||||
|
@ -282,7 +317,7 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
{
|
||||
switch (tk)
|
||||
{
|
||||
case TK_IDENT: // command
|
||||
case TK_IDENT:
|
||||
"COMMAND:%s\n", cc->cur_str;
|
||||
for (i = 0; i < StrLen(cc->cur_str); i++)
|
||||
cc->cur_str[i] = ToUpper(cc->cur_str[i]);
|
||||
|
@ -374,7 +409,6 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
goto lex_done;
|
||||
}
|
||||
|
||||
|
||||
temp = MStrPrint("RETR %s\r\n", input_str);
|
||||
TCPSocketSendString(message_socket, temp);
|
||||
FTPFileDownload(data_socket, dest);
|
||||
|
@ -384,8 +418,62 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
FTPFileView(dest);
|
||||
|
||||
goto lex_done;
|
||||
}
|
||||
else if (!StrCompare(cc->cur_str, "STOR") || // New STOR case
|
||||
!StrCompare(cc->cur_str, "PUT"))
|
||||
{
|
||||
StrFirstRemove(input_str, " ");
|
||||
if (!StrCompare(input_str, ""))
|
||||
{
|
||||
ST_ERR_ST "Must provide argument!\n";
|
||||
goto lex_done;
|
||||
}
|
||||
|
||||
if (!FileExists(input_str))
|
||||
{
|
||||
ST_ERR_ST "File %s does not exist!\n", input_str;
|
||||
goto lex_done;
|
||||
}
|
||||
|
||||
U8 *remote_filename = FTPFilePrompt(input_str);
|
||||
if (remote_filename == NULL)
|
||||
{
|
||||
ST_ERR_ST "Remote filename cannot be empty!";
|
||||
goto lex_done;
|
||||
}
|
||||
|
||||
TCPSocketSendString(message_socket, "PASV\r\n");
|
||||
if (FTPReplyPassiveParse(message_socket, &data_ipv4) != 0)
|
||||
{
|
||||
ST_ERR_ST "Error parsing server response to PASV command!\n";
|
||||
Free(remote_filename);
|
||||
goto lex_done;
|
||||
}
|
||||
|
||||
data_socket = TCPSocket(AF_INET);
|
||||
data_socket->timeout = 2 * JIFFY_FREQ;
|
||||
|
||||
if (TCPSocketConnect(data_socket, &data_ipv4) != 0)
|
||||
{
|
||||
ST_ERR_ST "Failed to connect data socket!";
|
||||
TCPSocketClose(data_socket);
|
||||
Free(remote_filename);
|
||||
goto lex_done;
|
||||
}
|
||||
|
||||
temp = MStrPrint("STOR %s\r\n", remote_filename);
|
||||
TCPSocketSendString(message_socket, temp);
|
||||
Free(temp);
|
||||
Free(remote_filename);
|
||||
|
||||
I64 upload_result = FTPFileUpload(data_socket, input_str);
|
||||
if (upload_result < 0)
|
||||
ST_ERR_ST "Upload failed!\n");
|
||||
else
|
||||
"\n%lld bytes uploaded successfully.\n", upload_result;
|
||||
|
||||
FTPMessageGet(message_socket, buf);
|
||||
goto lex_done;
|
||||
}
|
||||
else if (!StrCompare(cc->cur_str, "VIEW") ||
|
||||
!StrCompare(cc->cur_str, "CAT"))
|
||||
|
@ -423,6 +511,12 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
goto lex_done;
|
||||
}
|
||||
else if (!StrCompare(cc->cur_str, "USER"))
|
||||
{
|
||||
StrFirstRemove(input_str, " ");
|
||||
if (!StrCompare(input_str, ""))
|
||||
{
|
||||
ST_ERR_ST "Must provide argument!\n");
|
||||
else if (!StrCompare(cc->cur_str, "USER"))
|
||||
{
|
||||
StrFirstRemove(input_str, " ");
|
||||
if (!StrCompare(input_str, ""))
|
||||
|
@ -439,7 +533,6 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
Free(temp);
|
||||
|
||||
goto lex_done;
|
||||
|
||||
}
|
||||
else if (!StrCompare(cc->cur_str, "PASS"))
|
||||
{
|
||||
|
@ -458,7 +551,6 @@ I64 FTPClient(U8 *hostname=NULL, U16 port=21)
|
|||
Free(temp);
|
||||
|
||||
goto lex_done;
|
||||
|
||||
}
|
||||
else if (!StrCompare(cc->cur_str, "QUIT") ||
|
||||
!StrCompare(cc->cur_str, "EXIT") ||
|
||||
|
@ -482,17 +574,16 @@ Command List:
|
|||
|
||||
(Alternate names separated by '/'; names case-insensitive)
|
||||
|
||||
|
||||
CWD/CD <path> = Change Working Directory to <path>.
|
||||
LIST/DIR/LS = List directory contents.
|
||||
PWD = Print name of current directory.
|
||||
RETR/GET <file> = Download copy of <file> from server.
|
||||
VIEW/CAT <file> = Print the contents of <file> to the screen.
|
||||
USER <username> = Set username to <username>.
|
||||
PASS <password> = Set password to <password>.
|
||||
QUIT/EXIT/BYE = End FTP session.\n\n";
|
||||
CWD/CD <path> = Change Working Directory to <path>
|
||||
LIST/DIR/LS = List directory contents
|
||||
PWD = Print current directory
|
||||
RETR/GET <file> = Download file from server
|
||||
STOR/PUT <file> = Upload file to server
|
||||
VIEW/CAT <file> = View file contents
|
||||
USER <username> = Set username
|
||||
PASS <password> = Set password
|
||||
QUIT/EXIT/BYE = End session\n\n";
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -503,6 +594,6 @@ QUIT/EXIT/BYE = End FTP session.\n\n";
|
|||
lex_done:
|
||||
CompCtrlDel(cc);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
FTPClient;
|
||||
FTPClient;
|
||||
|
|
Loading…
Reference in a new issue