1 /*
2  * ProFTPD - FTP server daemon
3  * Copyright (c) 2009-2017 The ProFTPD Project team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18  *
19  * As a special exemption, The ProFTPD Project team and other respective
20  * copyright holders give permission to link this program with OpenSSL, and
21  * distribute the resulting executable, without including the source code for
22  * OpenSSL in the source distribution.
23  */
24 
25 #ifndef PR_CMD_H
26 #define PR_CMD_H
27 
28 cmd_rec *pr_cmd_alloc(pool *p, unsigned int, ...);
29 int pr_cmd_clear_cache(cmd_rec *cmd);
30 const char *pr_cmd_get_displayable_str(cmd_rec *cmd, size_t *len);
31 int pr_cmd_get_errno(cmd_rec *cmd);
32 
33 int pr_cmd_cmp(cmd_rec *cmd, int cmd_id);
34 int pr_cmd_strcmp(cmd_rec *cmd, const char *cmd_name);
35 
36 /* Returns the cmd ID for the given command string, or -1 if there was an
37  * error (with errno set appropriately).  NOTE: the given command name
38  * MUST be all uppercased before being passed in for the proper ID to be
39  * be returned.
40  *
41  * A return value of 0 means "unknown command".
42  */
43 int pr_cmd_get_id(const char *name_name);
44 
45 /* These IDs are indices into a static list in the Command API. */
46 #define	PR_CMD_USER_ID		1
47 #define PR_CMD_PASS_ID		2
48 #define PR_CMD_ACCT_ID		3
49 #define PR_CMD_CWD_ID		4
50 #define PR_CMD_XCWD_ID		5
51 #define PR_CMD_CDUP_ID		6
52 #define PR_CMD_XCUP_ID		7
53 #define PR_CMD_SMNT_ID		8
54 #define PR_CMD_REIN_ID		9
55 #define PR_CMD_QUIT_ID		10
56 #define PR_CMD_PORT_ID		11
57 #define PR_CMD_EPRT_ID		12
58 #define PR_CMD_PASV_ID		13
59 #define PR_CMD_EPSV_ID		14
60 #define PR_CMD_TYPE_ID		15
61 #define PR_CMD_STRU_ID		16
62 #define PR_CMD_MODE_ID		17
63 #define PR_CMD_RETR_ID		18
64 #define PR_CMD_STOR_ID		19
65 #define PR_CMD_STOU_ID		20
66 #define PR_CMD_APPE_ID		21
67 #define PR_CMD_ALLO_ID		22
68 #define PR_CMD_REST_ID		23
69 #define PR_CMD_RNFR_ID		24
70 #define PR_CMD_RNTO_ID		25
71 #define PR_CMD_ABOR_ID		26
72 #define PR_CMD_DELE_ID		27
73 #define PR_CMD_MDTM_ID		28
74 #define PR_CMD_RMD_ID		29
75 #define PR_CMD_XRMD_ID		30
76 #define PR_CMD_MKD_ID		31
77 #define PR_CMD_MLSD_ID		32
78 #define PR_CMD_MLST_ID		33
79 #define PR_CMD_XMKD_ID		34
80 #define PR_CMD_PWD_ID		35
81 #define PR_CMD_XPWD_ID		36
82 #define PR_CMD_SIZE_ID		37
83 #define PR_CMD_LIST_ID		38
84 #define PR_CMD_NLST_ID		39
85 #define PR_CMD_SITE_ID		40
86 #define PR_CMD_SYST_ID		41
87 #define PR_CMD_STAT_ID		42
88 #define PR_CMD_HELP_ID		43
89 #define PR_CMD_NOOP_ID		44
90 #define PR_CMD_FEAT_ID		45
91 #define PR_CMD_OPTS_ID		46
92 #define PR_CMD_LANG_ID		47
93 #define PR_CMD_ADAT_ID		48
94 #define PR_CMD_AUTH_ID		49
95 #define PR_CMD_CCC_ID		50
96 #define PR_CMD_CONF_ID		51
97 #define PR_CMD_ENC_ID		52
98 #define PR_CMD_MIC_ID		53
99 #define PR_CMD_PBSZ_ID		54
100 #define PR_CMD_PROT_ID		55
101 #define PR_CMD_MFF_ID		56
102 #define PR_CMD_MFMT_ID		57
103 #define PR_CMD_HOST_ID		58
104 #define PR_CMD_CLNT_ID		59
105 #define PR_CMD_RANG_ID		60
106 
107 /* The minimum and maximum command name lengths. */
108 #define PR_CMD_MIN_NAMELEN	3
109 #define PR_CMD_MAX_NAMELEN	4
110 
111 /* Returns TRUE if the given command is a known HTTP method, FALSE if not
112  * a known HTTP method, and -1 if there is an error.
113  */
114 int pr_cmd_is_http(cmd_rec *cmd);
115 
116 /* Returns TRUE if the given command is a known SMTP method, FALSE if not
117  * a known SMTP method, and -1 if there is an error.
118  */
119 int pr_cmd_is_smtp(cmd_rec *cmd);
120 
121 /* Returns TRUE if the given command appears to be an SSH2 request, FALSE
122  * if not, and -1 if there was an error.
123  */
124 int pr_cmd_is_ssh2(cmd_rec *cmd);
125 
126 int pr_cmd_set_errno(cmd_rec *cmd, int xerrno);
127 int pr_cmd_set_name(cmd_rec *cmd, const char *name);
128 
129 /* Implemented in main.c */
130 int pr_cmd_read(cmd_rec **cmd);
131 int pr_cmd_dispatch(cmd_rec *cmd);
132 int pr_cmd_dispatch_phase(cmd_rec *cmd, int, int);
133 #define PR_CMD_DISPATCH_FL_SEND_RESPONSE	0x001
134 #define PR_CMD_DISPATCH_FL_CLEAR_RESPONSE	0x002
135 
136 void pr_cmd_set_handler(void (*)(server_rec *s, conn_t *conn));
137 
138 #endif /* PR_CMD_H */
139