/* ftpd.h */
#ifndef __FTPD_H
#define __FTPD_H
#define POS 1
#define DATA 2
#define USER_NAME 3
#define LOGGED_IN 4
#define CWD 5
#define LEN 6
#define PARENT_FD 7
#define DATA_FD 8
#define DATA_ADDR 9
#define LAST_DATA 10
#define DATA_PORT 11
#define FILE 12
#define TYPE 13
#define DOWNLOAD 14
#define PATH 15
#define APPEND 16
#define CONNECTED 17
#define USER_SITE 18
#define STRING 19
#define BINARY 20
#define FROMNAME 21
#define IDLE_SETTING 22
#define FTP_TIME (sprintf("[%s] ", ctime(time())[4..15]))
#define UNAME socket_info[ fd ][ USER_NAME ]
#define UCWD socket_info[ fd ][ CWD ]
#define UTYPE socket_info[ fd ][ TYPE ]
#define USITE socket_info[ fd ][ USER_SITE ]
#define UPATH socket_info[ fd ][ PATH ]
#define UDATA socket_info[ fd ][ DATA ]
#define MAX_UNIQUE_TRIES 10
#define MONTHS ({ "Jan", "Feb", "Mar", "Apr", "May", "Jun", \
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" })
#define SECS_IN_YEAR (365 * 24 * 60 * 60)
/*
* Listed 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", 0, "(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", 1, "<sp> file-name" }),
"size" : ({ "SIZE", 1, "<sp> path-name" }),
"mdtm" : ({ "MDTM", 1, "<sp> path-name" })
]);
mapping sitecmdtab = ([
"idle" : ({ "USER", 1, "[ <sp> timeout ]" }),
"umask" : ({ "UMASK", 0, "[ <sp> umask ]" }),
"chmod" : ({ "CHMOD", 0, "<sp> path-name" }),
"time" : ({ "TIME", 1, "(return local time)" }),
"help" : ({ "HELP", 1, "[ <sp> <string> ]" })
]);
#define PERMISSION_DENIED550(S) socket_write( fd, sprintf( \
"550 Permission denied to %s.\n", S) )
#define PERMISSION_DENIED553(S) socket_write( fd, sprintf( \
"553 Permission denied to %s.\n", S) )
/*
* these flags determine read level access
*/
#define VALID_READ 0 // rely on valid_read()
#define RESTRICTED_READ 1 // ditto, but limited to public dirs
#define WRITE_LIMIT_READ 2 // access limited by write access
/*
* these flags determine write level access
*/
#define VALID_WRITE 0 // rely on valid_write()
#define RESTRICTED_WRITE 1 // ditto, but limited to public dirs
#define READ_ONLY 2 // no write access, at all
#endif /* __FTPD_H */