From 121a213526ac99f83dce3f329698f3c338096b5f Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 10 Apr 2001 01:54:24 +0000
Subject: [PATCH] FTP client written in Baja.

---
 exec/ftp.src | 311 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 311 insertions(+)
 create mode 100644 exec/ftp.src

diff --git a/exec/ftp.src b/exec/ftp.src
new file mode 100644
index 0000000000..6c0aab22de
--- /dev/null
+++ b/exec/ftp.src
@@ -0,0 +1,311 @@
+# ftp.src
+
+# FTP Client for Synchronet
+
+# Requires Baja v2.30 and Synchronet v3.00d or later
+
+!include sbbsdefs.inc # _ftp_mode and _socket_error
+
+!define ON	"\1gON"
+!define OFF	"\1rOFF"
+
+int sock port i
+str addr user pass src dest fname
+str pasv_mode hash_mode ascii_mode
+
+set _ftp_mode FTP_ECHO_RSP|FTP_HASH|FTP_PASV
+
+print "\r\n\1h\1ySynchronet \1wFTP Client v1.00 \1y- Copyright 2001 Rob Swindell\1n\r\n\r\n"
+
+compare str ""
+if_false
+	compare_word "*"
+	if_false
+		call socket_connect
+		end_if
+	end_if
+
+loop
+
+print "\1n\1hftp\1n> "
+getstr
+compare str ""
+if_equal
+	continue
+	end_if
+
+compare_word "?"
+if_true
+	compare_all_bits _ftp_mode FTP_HASH
+	if_true
+		set hash_mode ON
+	else
+		set hash_mode OFF
+		end_if
+
+	compare_all_bits _ftp_mode FTP_PASV
+	if_true
+		set pasv_mode ON
+	else
+		set pasv_mode OFF
+		end_if
+
+	compare_all_bits _ftp_mode FTP_ASCII
+	if_true
+		set ascii_mode ON
+	else
+		set ascii_mode OFF
+		end_if
+
+	print  "\r\n\1hCommands are\1n:\r\n\r\n"
+	print  "\1h\1yopen   \1w: \1cstart an FTP session\r\n"
+	print  "\1h\1yclose  \1w: \1cclose an FTP session\r\n"
+	print  "\1h\1ydir    \1w: \1cprint a directory listing\r\n"
+	print  "\1h\1ypwd    \1w: \1cprint working directory\r\n"
+	print  "\1h\1ycd     \1w: \1cchange working directory\r\n"
+	printf "\1h\1yhash   \1w: \1ctoggle hash printing during transfer (currently %s\1c)\r\n" hash_mode
+	printf "\1h\1ypasv   \1w: \1ctoggle passive mode transfers (currently %s\1c)\r\n" pasv_mode
+	printf "\1h\1yascii  \1w: \1ctoggle ASCII (CR/LF) mode transfers (currently %s\1c)\r\n" ascii_mode
+	print  "\1h\1yget    \1w: \1cretrieve (download) file\r\n"
+	print  "\1h\1yput    \1w: \1csend (upload) file\r\n"
+	print  "\1h\1ydelete \1w: \1cdelete (erase) file\r\n"
+	print  "\1h\1yquit   \1w: \1cexit FTP\r\n"
+	crlf
+	continue
+	end_if
+
+compare_word "open"
+if_true
+	shift_str 5
+
+	socket_close sock	# In case there's already a socket open
+
+	call socket_connect
+	continue
+	end_if
+
+compare_str "pasv"
+if_true
+	xor _ftp_mode FTP_PASV
+	compare_all_bits _ftp_mode FTP_PASV
+	print "\1h\1cPassive file transfer mode: "
+	if_true
+		print ON
+	else
+		print OFF
+		end_if
+	crlf
+	continue
+	end_if
+
+compare_str "hash"
+if_true
+	xor _ftp_mode FTP_HASH
+	compare_all_bits _ftp_mode FTP_HASH
+	print "\1h\1cHash mark printing: "
+	if_true
+		print ON
+	else
+		print OFF
+		end_if
+	crlf
+	continue
+	end_if
+
+compare_str "ascii"
+if_true
+	xor _ftp_mode FTP_ASCII
+	compare_all_bits _ftp_mode FTP_ASCII
+	print "\1h\1cASCII file transfer mode: "
+	if_true
+		print ON
+	else
+		print OFF
+		end_if
+	crlf
+	continue
+	end_if
+
+compare_str "quit"
+if_true
+	ftp_logout sock
+	socket_close sock
+	return
+	end_if
+
+compare sock 0
+if_true
+	print "Not connected (use '\1i?\1n' for menu).\r\n"
+	continue
+	end_if
+
+# ALL commands from here on require connection
+
+compare_str "close"
+if_true
+	ftp_logout sock
+	if_false
+		printf "!ftp_logout failed socket_error=%d\r\n" _socket_error
+		end_if
+	socket_close sock
+	continue
+	end_if
+
+compare_word "dir"
+if_true
+	shift_str 4
+	ftp_dir sock str
+	if_false
+		printf "!ftp_dir failed socket_error=%d\r\n" _socket_error
+		end_if
+	continue
+	end_if
+
+compare_str "pwd"
+if_true
+	ftp_pwd sock
+	if_false
+		printf "!ftp_pwd failed socket_error=%d\r\n" _socket_error
+		end_if
+	continue
+	end_if
+
+compare_word "cd"
+if_true
+	shift_str 3
+	compare_str ""
+	if_true
+		print "Directory: "
+		getstr
+		end_if
+	ftp_cwd sock str
+	if_false
+		printf "!ftp_cwd failed socket_error=%d\r\n" _socket_error
+		end_if
+	continue
+	end_if
+
+compare_word "delete"
+if_true
+	shift_str 6
+	compare_str ""
+	if_true
+		print "File: "
+		getstr
+		end_if
+	ftp_delete sock str
+	if_false
+		printf "!ftp_delete failed socket_error=%d\r\n" _socket_error
+		end_if
+	continue
+	end_if
+
+
+compare_word "get"
+if_true
+	shift_str 4
+	compare_str ""
+	if_true
+		print "File: "
+		getstr
+		end_if
+	copy fname str
+	# skip path
+	shift_to_last_char fname '/'
+	if_true
+		shift_str fname 1
+		end_if
+	shift_to_last_char fname '\\'
+	if_true
+		shift_str fname 1
+		end_if
+	set dest "%g"	# temp directory
+	strcat dest fname
+	ftp_get sock str dest
+	if_false
+		printf "!ftp_get failed socket_error=%d\r\n" _socket_error
+		continue
+		end_if
+	copy str dest
+	file_send
+	remove_file dest
+	continue
+	end_if
+
+compare_word "put"
+if_true
+	shift_str 4
+	compare_str ""
+	if_true
+		print "File: "
+		getstr
+		end_if
+	copy dest str
+	copy fname str
+	# skip path
+	shift_to_last_char fname '/'
+	if_true
+		shift_str fname 1
+		end_if
+	shift_to_last_char fname '\\'
+	if_true
+		shift_str fname 1
+		end_if
+	set src "%g"	# temp directory
+	strcat src fname
+	copy str src
+	file_receive	# uses str
+	chkfile src
+	if_false
+		continue
+		end_if
+	printf "ftp: sending %s\r\n" fname
+	ftp_put sock src dest
+	if_false
+		remove_file src
+		printf "!ftp_put failed socket_error=%d\r\n" _socket_error
+		continue
+		end_if
+	remove_file src
+	continue
+	end_if
+
+printf "Invalid command (use '\1i?\1n' for menu).\r\n" str
+
+end_loop
+
+########################################
+# Socket create/open/connect sub-routine
+:socket_connect
+
+socket_open sock
+if_false
+	printf "!socket_open failure socket_error=%d\r\n" _socket_error
+	continue
+	end_if
+
+copy addr str
+compare addr ""
+if_true
+	print "address: "
+	getstr addr
+	end_if
+
+set port 21	# default FTP port
+printf "Connecting to %s ... " addr
+socket_connect sock addr port 
+crlf
+if_false
+	printf "!socket_connect failed socket_error=%d\r\n" _socket_error
+	return
+	end_if
+print "login: "
+getstr user
+print "password: "
+getstr pass 60 K_NOECHO
+crlf
+ftp_login sock user pass
+if_false
+	printf "!ftp_login failed socket_error=%d\r\n" _socket_error
+	end_if
+return
-- 
GitLab