/* Do not remove the headers from this file! see /USAGE for more info. */
#define MAX_IDLE_TIME 600 // This is really x+60 seconds. LWI.
#define NEEDS_ARG() if(!arg){ info->cmdPipe->send("500 command not understood.\n"); return; }
#define FTPLOG(x) LOG_D->log(LOG_FTP, x)
#define FTP_WELCOME "/data/config/FTPWELCOME"
#ifdef ALLOW_ANON_FTP
#define ANON_PREFIX "/ftp/pub"
#define ANON_USER() (member_array(info->user, anon_logins) != -1)
#define ANON_CHECK(x) if(ANON_USER() && x[0..(strlen(ANON_PREFIX)-1)] != ANON_PREFIX) { info->cmdPipe->send("550 Pemission denied.\n"); if(info->dataPipe) destruct(info->dataPipe); return; }
#else
#define ANON_CHECK(x)
#endif
#define FTP_BLOCK_SIZE 1024
class ftp_session {
int connected;
string user;
mixed priv;
string pwd;
object dataPipe;
object cmdPipe;
int idleTime;
int binary;
string targetFile;
string command;
int filepos;
string renamefrom;
}
private void FTP_CMD_user(class ftp_session, string);
private void FTP_CMD_pass(class ftp_session, string);
private void FTP_CMD_retr(class ftp_session, string);
private void FTP_CMD_stor(class ftp_session, string);
private void FTP_CMD_nlst(class ftp_session, string);
private void FTP_CMD_list(class ftp_session, string);
private void FTP_CMD_pwd(class ftp_session, string);
private void FTP_CMD_cdup(class ftp_session, string);
private void FTP_CMD_cwd(class ftp_session, string);
private void FTP_CMD_quit(class ftp_session, string);
private void FTP_CMD_type(class ftp_session, string);
private void FTP_CMD_mkd(class ftp_session, string);
private void FTP_CMD_port(class ftp_session, string);
private void FTP_CMD_noop(class ftp_session, string);
private void FTP_CMD_dele(class ftp_session, string);
private void FTP_CMD_syst(class ftp_session, string);
private void FTP_CMD_pasv(class ftp_session, string);
string FTP_CMD_retr_callback(object);