SCOUG-Programming Mailing List Archives
Return to [ 29 | 
May | 
1998 ]
 >> Next Message >>
 
 
 
Content Type:   text/plain 
Sorry for the delay - been busy.  
 
Here is the document I mentioned at the last meeting that I had previously posted.  
 
I had joked about writing GetLine() on line through this list.  After I thought about it, I think I will try   
something similar.    
 
Over the next week or so, I'll post the evolution of GetLine().  Intially I'll write it the niave way   
(mistakes and all).  Then, I will show what evolutions I made, hopefully with comments and ideas   
from the Peanut Gallery.  
 
Sound good?  
 
 
Here's the doc:  
 
 
May 14, 1998  
SCOUG Programming SIG  
 
FTP Server Project  
 
 
Overview  
 
The purpose of this document is to introduce some of the essential  
TCP/IP and FTP concepts that framed the development of this FTP server.  
Each issue will be explored in more detail during the next few weeks and  
months.  
 
This project began when we first started running the SCOUG and Sundial  
web sites on our own OS/2 machine.  As I searched high and low for FTP  
servers, I found many choices, but each of them had a fatal flaw.  I  
settled on one, Penguin FTPD that did the best job - but I soon  
discovered it was poorly supported and had several bugs.  So, I asked  
myself what it would take to write my own FTP server.  I examined the  
appropriate RFCs and it looked like a reasonable task.  I set a limit of  
building a prototype in a weekend.  As a result, not everything is  
perfect, elegant or efficient.  
 
TCP/IP 101  
 
At this point, you only need a minimal understanding of TCP/IP to follow  
along.  The basic concept that we will use is a socket.  A socket is an  
abstraction for communication over TCP/IP.  Sockets can be connected to  
two processes on the same machine or different machines.  It is this  
concept that makes the Internet go round.  Sockets are connected to a  
specific port(or port number) on a given machine.  Certain ports are  
reserved for specific protocols.  In our case FTP communication is  
normally initiated on port 21 and data is transmitted on port 20.  
 
Design Goals  
 
Having just gone through all of the OS/2 FTP programs, I had a few very  
specific design goals in mind.  The first was Unix compatibility.  The  
FTP specification is fairly loose about what format the directory  
listings are in, but there is a de facto standard to use the format  
produced by the Unix command ls (for obvious reasons).  However, some  
FTP servers do not use this format.  This creates problems for some  
tools like FTP-PM.  
 
Another Unix related issue was the representation of paths and drive  
letters.  In Unix, there are no drive letters.  If a user does have  
access to multiple drives, how should that be represented?  In the FTPD  
that comes with OS/2, they literally type "CD D:\Tmp".  In others they  
type "CD /d/tmp".  I like the latter because it is more consistent with  
the Unix format directory listings.  Also, it makes it more clear what  
"CD /" means.  
 
The next issue was security.  Any FTP server, including ours, should  
allow a user's root directory to be something other than the root  
directory.  For example, if I want all users to start in E:\FTP.  Most  
support this, but many programs will tell the user they are in E:\FTP.  
This is a security risk because it tells the user something about the  
underlying directory structure of the server.  By itself that  
information is harmless, but to a dedicated hacker, this could be  
valuable.  
 
These two issues lead to very complicated handling of directory names  
and references - an issue that I did not foresee, and a module that  
could use rewriting.  
 
Remote maintenance was an area that sorely lacked in the other FTPDs.  
Many of them were designed as PM applications, where the only UI was to  
show the number of current connections.  I saw no need for a PM process.  
Also, I wanted to allow for remotely configuring and reinitializing the  
server.  Initially this meant never storing configuration information in  
memory - always reading from the files.  That way, the files could be  
manipulated remotely and the changes would take affect for future  
operations.  Ideally (but not implemented), there would be a telnet or  
web interface for tasks such as creating users.  
 
 
Environmental Factors  
 
There are two ways an FTP Demon can run.  Many start and listen to the  
appropriate port for FTP connections.  Others, such as the FTPD that is  
included with OS/2, start a process who's only job is to listen for FTP  
connections.  When a connection is made, it spawns a new process to  
handle that connection.  There are pros and cons to each.  The single  
process/multi-threaded option is obviously the "OS/2" way to do it.  
However, if a thread crashes, there is a good chance the entire FTPD  
will crash as well.  Infact, this is a significant problem with the FTPD  
we are currently using.  The multiprocess model takes more resources,  
but it is resilient if a process crashes.  Also, it slightly simplifies  
design as well as makes it compatible with INETD.  I chose the  
multi-process model because it meant a quicker implementation - remember  
I was trying to do this in a weekend!  
 
 
Internal Design  
 
The protocol for FTP (which we will examine more closely later), is  
basically a command followed by one or more parameters.  The server then  
sends a response code and takes the appropriate action.  The concept  
behind the command dispatch loop is straightforward.  A command string  
is retrieved and broken into its parts (the command and optional  
parameters).  The command is compared to all known commands and  
translated into an internal identifier.  That identifier is used to  
reference an array of functions to handle each command.  The  
appropriate function is called and the loop repeats.  
 
Another key concept is a Command Structure which holds all of the  
information about the connection and the command.  This structure is  
passed around to all of the Handle functions for manipulation.  
 
Next meeting  
 
This was intended to give you a quick background to the project we will  
be looking at.  At this month's meeting I plan to look at the actual FTP  
protocol specifications as well as the implementation of some of the  
aspects discussed above.  
 
 
 
 
 
 
 
 
=====================================================  
 
To unsubscribe from this list, send an email message  
to "steward@scoug.com". In the body of the message,  
put the command "unsubscribe scoug-programming".  
 
For problems, contact the list owner at  
"rollin@scoug.com".  
 
=====================================================  
 
  
 >> Next Message >>
Return to [ 29 | 
May | 
1998 ] 
  
  
The Southern California OS/2 User Group
 P.O. Box 26904
 Santa Ana, CA  92799-6904, USA
Copyright 2001 the Southern California OS/2 User Group.  ALL RIGHTS 
RESERVED. 
 
SCOUG, Warp Expo West, and Warpfest are trademarks of the Southern California OS/2 User Group.
OS/2, Workplace Shell, and IBM are registered trademarks of International 
Business Machines Corporation.
All other trademarks remain the property of their respective owners.
 
 |