#ifndef __SYS__FTP #define __SYS__FTP class dataconn { mixed data; /* The string/filename to be sent */ string path; /* Full path to the file */ int pos; /* current position in string/file */ int parent_fd; /* the control connection socket */ int type; /* type of transfer */ int len; /* current length */ int append; /* append to existing file? */ } class session { int fd; /* control connection socket */ string user_name; /* user name */ int logged_in; /* are we logged in with password? */ string cwd; /* current directory */ string data_addr; /* host to use for data connections */ int last_data; /* time of last command */ int data_port; /* port to use for data connections */ int data_fd; /* the data connection socket */ int type; /* type of transfer (FILE or STRING) */ int idle; /* idle timeout */ string rnfr; /* source name for RENAME operation */ int offset; /* offset in string/file */ int use_default; /* use the default data connection? */ int pasv_fd; /* socket on which we listen in passive mode */ int pasv_cb; /* was the listen callback called? */ } /* Wombles here after */ #define STRING 1 #define FILE 2 #define DOWNLOAD 3 #define BINARY 4 #define MASK_L 1 #define MASK_C 2 #define MASK_F 4 #define MASK_A 8 #define MASK_R 16 #define MASK_D 32 /* ----------------------------------------------- debugging defines. ----------------------------------------------- */ #define TP_CRE "shaydz" #undef DEBUG #ifdef DEBUG #define TPCRE(STR) if (find_player(TP_CRE)) \ tell_object(find_player(TP_CRE), STR) #define DEBUG_SEND /* define to debug data_write_callback() */ #define DEBUG_RECEIVE /* define to debug data_{read|close}_callback() */ #else #define TPCRE(STR) #undef DEBUG_SEND #undef DEBUG_RECEIVE #endif /* ----------------------------------------------- log file defines. ----------------------------------------------- */ #define LOGGING #ifdef LOGGING #define LOG_CONNECT /* define to log all connections */ #define LOG_FILE /* define to log all file xfers */ #define LOG_CD_SIZE /* define to log cd's and file size commands */ #define LOG_DEBUG /* define to log debug messages */ #define LOG_FILENAME "/secure/log/ftpd.log" #else #undef LOG_CONNECT #undef LOG_FILE #undef LOG_CD_SIZE #undef LOG_DEBUG #endif #define BLOCK_SIZE 65536 /* ----------------------------------------------- driver version defines. ----------------------------------------------- */ #define NEWDRIVER #ifdef __VERSION__ #define VERSION __VERSION__ #else #ifndef VERSION #define VERSION version() #endif #endif #define CHECK_LOGIN() if (!sess->logged_in) \ { \ eventWrite(fd, "530 Please login with USER and PASS.\r\n"); \ break; \ } #define CHECK_CMD(INT) if (sizeof(bits) != INT+1) \ { \ eventWrite(fd, sprintf("500 '%s': command not understood.\r\n", \ str)); \ break; \ } #define CHECK_CMD2(INT,INT2) if (sizeof(bits) < INT+1 ||\ sizeof(bits) > INT2+1) \ { \ eventWrite(fd, sprintf("500 '%s': command not understood.\r\n", \ str)); \ break; \ } #define CHECK_PLAYER() if (sess->logged_in == 2) \ { \ eventWrite(fd, "553 Permission denied (you are not a creator)\r\n"); \ break; \ } #define CHECK_STRING sess->type == STRING #define UNAME sess->user_name #define HOME_DIR(NAME) "/w/"+NAME protected void setup_ftp(); protected string get_path(int fd, string str); protected void do_update(string name, int fd); protected void data_write_callback(int fd); /* * List of recognized commands in order defined in RFC 765 * ({ Command, Implemented?, Help text }) */ mapping cmdtab = ([ "user" : ({ "USER", 1, "<sp> username" }), "pass" : ({ "PASS", 1, "<sp> password" }), "acct" : ({ "ACCT", 0, "(specify account)" }), "smnt" : ({ "SMNT", 0, "(structure mount)" }), "rein" : ({ "REIN", 0, "(reinitialize server state)" }), "quit" : ({ "QUIT", 1, "(terminate service)", }), "port" : ({ "PORT", 1, "<sp> b0, b1, b2, b3, b4" }), "pasv" : ({ "PASV", 0, "(set server in passive mode)" }), "type" : ({ "TYPE", 1, "<sp> [ A | E | I | L ]" }), "stru" : ({ "STRU", 0, "(specify file structure)" }), "mode" : ({ "MODE", 0, "(specify transfer mode)" }), "retr" : ({ "RETR", 1, "<sp> file-name" }), "stor" : ({ "STOR", 1, "<sp> file-name" }), "appe" : ({ "APPE", 1, "<sp> file-name" }), "mlfl" : ({ "MLFL", 0, "(mail file)" }), "mail" : ({ "MAIL", 0, "(mail to user)" }), "msnd" : ({ "MSND", 0, "(mail send to terminal)" }), "msom" : ({ "MSOM", 0, "(mail send to terminal or mailbox)" }), "msam" : ({ "MSAM", 0, "(mail send to terminal and mailbox)" }), "mrsq" : ({ "MRSQ", 0, "(mail recipient scheme question)" }), "mrcp" : ({ "MRCP", 0, "(mail recipient)" }), "allo" : ({ "ALLO", 1, "allocate storage (vacuously)" }), "rest" : ({ "REST", 1, "(restart command)" }), "rnfr" : ({ "RNFR", 1, "<sp> file-name" }), "rnto" : ({ "RNTO", 1, "<sp> file-name" }), "abor" : ({ "ABOR", 1, "(abort operation)" }), "dele" : ({ "DELE", 1, "<sp> file-name" }), "cwd" : ({ "CWD" , 1, "[ <sp> directory-name ]" }), "xcwd" : ({ "XCWD", 1, "[ <sp> directory-name ]" }), "list" : ({ "LIST", 1, "[ <sp> path-name ]" }), "nlst" : ({ "NLST", 1, "[ <sp> path-name ]" }), "site" : ({ "SITE", 1, "site-cmd [ <sp> arguments ]" }), "syst" : ({ "SYST", 1, "(get type of operating system)" }), "stat" : ({ "STAT", 1, "[ <sp> path-name ]" }), "help" : ({ "HELP", 1, "[ <sp> <string> ]" }), "noop" : ({ "NOOP", 1, "" }), "mkd" : ({ "MKD" , 1, "<sp> path-name" }), "xmkd" : ({ "XMKD", 1, "<sp> path-name" }), "rmd" : ({ "RMD" , 1, "<sp> path-name" }), "xrmd" : ({ "XRMD", 1, "<sp> path-name" }), "pwd" : ({ "PWD" , 1, "(return current directory)" }), "xpwd" : ({ "XPWD", 1, "(return current directory)" }), "cdup" : ({ "CDUP", 1, "(change to parent directory)" }), "xcup" : ({ "XCUP", 1, "(change to parent directory)" }), "stou" : ({ "STOU", 0, "<sp> file-name" }), "size" : ({ "SIZE", 1, "<sp> path-name" }), "mdtm" : ({ "MDTM", 1, "<sp> path-name" }) ]); mapping sitecmdtab = ([ "idle" : ({ "IDLE", 1, "[ <sp> timeout ]" }), "help" : ({ "HELP", 1, "[ <sp> <string> ]" }), "newer" : ({ "NEWER", 0, "<sp> YYYYMMDDHHMMSS [ <sp> path-name ]" }), "minfo" : ({ "MINFO", 0, "<sp> YYYYMMDDHHMMSS [ <sp> path-name ]" }), "time" : ({ "TIME", 1, "(prints local time)" }), "upd" : ({ "UPD", 1, "<sp> path-name" }) ]); #define FTP_VERSION "Version 13.2" #define LOGIN_OB "/secure/login" #endif /* __SYS__FTP */