Previous patch

Home

Next patch

./doc/INTERNALS

Patch: Additional logging in NTP

+Source code Files
+~~~~~~~~~~~~~~~~~
+Always compiled:
+  main.c      - General setup. Listen for and fork new sessions.
+  data.c      - Data connection forwarding.
+  control.c   - Session startup. Control session parsing commands.
+  ftp-cmds.c  - List of ftp commands and functions to act on them.
+  misc.c      - Miscellaneous functions, mainly socket stuff.
+  configs.c   - Config file parsing, and carrying out some config file options.
+  str.c       - Safe (?) buffer handling code.
+
+Conditionally compiled:
+  ntp.c       - Non transparent proxy support. (default on)
+ (linux|bsd).c - Data connection NAT stuff.
+  cache.c     - Generic cache code.
+  httpcache.c - Cache module to route requests through an HTTP proxy.
+ localcache.c - Local caching module.
+  cachemgr.c  - Cache manager code for local cache.
+  vscan.c     - Virus scanning for local cache.
+  transdata.c - Client/server stuff for transparent proxied data connections.
+  ssl.c       - ssl connections between frox and the ftp server
+
+Important Functions
+~~~~~~~~~~~~~~~~~~~
+The main loop is run_daemon() in main.c - it forks a new process for
+each new connection and only terminates when sent a SIGKILL/SIGSTOP.
+
+Each new connection starts in init_session() which gets a USER command
+for ntp if necessary, makes the connection to the remote host, and
+initialises the cache if this is an anonymous session.
+
+run_loop() is the main loop for each session. It just loops calling
+get_control_line() and {client,data}_control_forward().
+
+get_control_line() selects on the necessary fds. It deals with
+accepting and forwarding data connections as necessary, and only
+returns once it has the control line it was asked for. If it was asked
+for a control line from one of the client/server and data arrives on
+the other it is buffered.
+
+extract_{server,client}_cmd() are the functions which do the initial
+reading and parsing of the raw control streams.
+
+parse_client_cmd() decides what to do with the ftp commands. There are
+a number of arrays that match commands to functions to process them.
+The main one is in ftp_cmds.c, but there are also some in the caching
+code if it is compiled in. All these arrays are held in
+info->cmd_arrays, and parse_client_cmd() works through them until it
+finds a command that matches.
+
+We set a SIGALRM each time we receive some activity on a connection.
+If a write blocks or the session is quiet for too long it doesn't get
+reset and we die.
+
+Caching
+~~~~~~~
+
+Caching code gets called at session initialisation and with a number
+of ftp commands so it can follow what is going on. It gets called for
+a file retrieve and can either forward it on or return a file
+descriptor the file can be read from. During file retrieval each read
+buffer is sent to cache_inc_data() which has the chance to read or
+edit it.
+
+Local caching is almost all implemented in the cachemgr.c file which
+runs in a separate process. It sends back file descriptors to the
+other processes - for cached files a file descriptor to read the file
+from, and for uncached ones one to write to.
+
+Transparent proxying of data Connections
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Transparently proxying data connections requires doing NAT both on
+connections we make and to intercept other connections. This requires
+root priveliges which are retained by a separate process forked off at
+startup. This process is communicated with over a socket - requests
+are sent, and file descriptors passed back.
+
+
+-