Monday, November 08, 2010 at 12:06 AM.

system.verbs.builtins.tcp.ftp.openConnection

on openConnection (host, username, password, flmessages=true) {
	<<Changes
		<<5/17/03; 8:41:44 PM by JES
			<<Fixed a bug which could mask the real error message from the server, if the server drops the connection after a failed login.
	local (adrconnectiontable);
	bundle { //allocate a table to store information for this connection
		local (adrtable = @system.temp.ftp);
		if not defined (adrtable^) {
			new (tabletype, adrtable)};
		loop {
			adrconnectiontable = @adrtable^.[string (random (1, 10000))];
			semaphore.lock (this, 3600);
			if not defined (adrconnectiontable^) {
				new (tabletype, adrconnectiontable);
				semaphore.unlock (this);
				break};
			semaphore.unlock (this)};
		adrconnectiontable^.flmessages = flmessages;
		adrconnectiontable^.timeCreated = clock.now ();
		adrconnectiontable^.host = host;
		adrconnectiontable^.username = username};
	on fatal (errmsg) {
		<<tcp.ftp.quit ()
		<<delete (adrconnectiontable)
		try { //should not be fatal
			tcp.closeStream (adrconnectiontable^.commandStream)};
		try { //should also not be fatal
			delete (adrconnectiontable)};
		scriptError (errmsg)};
	try {
		adrconnectiontable^.commandStream = tcp.openStream (host, 21);
		local (response = tcp.ftp.readResponse (adrconnectiontable));
		if response beginsWith "5" { // there's some other kinda error
			fatal ("Error " + response + " logging on to " + host)};
		response = tcp.ftp.sendCommand (adrconnectiontable, "USER " + username);
		if response beginsWith "5" {
			fatal (response + " Bad Username")};
		response = tcp.ftp.sendCommand (adrconnectiontable, "PASS " + string (password));
		if response beginsWith "5" {
			fatal (response + " Bad Username or Password")};
		response = tcp.ftp.sendCommand (adrconnectiontable, "PWD"); // get our default directory
		adrconnectiontable^.currentHostDirectory = string.nthField (response, '"', 2);
		adrconnectiontable^.rootDirectory = adrconnectiontable^.currentHostDirectory}
	else {
		fatal (tryError)}; //deallocate the connection table
	return (adrconnectiontable)}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.