1 /* Copyright 2003-2008 Wang, Chun-Pin All rights reserved. */
2 #ifndef	_SMBFTPD_H_
3 #define _SMBFTPD_H_
4 
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <pwd.h>
8 #include <netdb.h>
9 #include <netinet/in.h>
10 
11 #include <config.h>
12 
13 /* param.c */
14 enum smbftpd_mode {
15 	MODE_NORMAL = 0,
16 	MODE_SMB
17 };
18 
19 struct opt_set {
20 	struct opt_set *next;
21 	char *key;
22 	char *value;
23 };
24 
25 #define SECURITY_POLICY_SECURE    0x1
26 #define SECURITY_POLICY_NOSECURE  0x2
27 #define ENCRYPTION_TYPE_SSL       0x1
28 #define ENCRYPTION_TYPE_TLS       0x2
29 
30 /* system config read from config file */
31 typedef struct smbftpd_conf_t {
32 	struct opt_set *chroot_set;
33 	struct opt_set *max_download_rate;
34 	struct opt_set *max_upload_rate;
35 	char *server_name;
36 	char *listen_on_address;
37 	char *port;
38 	char *force_passive_ip;
39 	char *share_conf_path;
40 	char *exception_list;
41 	char *pid_file;
42 	char *transfer_log_path;
43 	char *no_login_list;
44 	char *virtual_user_mapping;
45 	char *virtual_user_auth_method;
46 	char *virtual_user_auth_config;
47 	char *ssl_cert_file;
48 	char *ssl_key_file;
49 	char *ssl_debug_log;
50 	char *charset_encoding;
51 	enum smbftpd_mode default_mode;
52 	int support_utf8_client;
53 	int using_utf8_filesystem;
54 	int show_program_version;
55 	int security_policy;
56 	int encryption_type;
57 	int normal_user_must_secure;
58 	int anonym_disable_secure;
59 	int debug_mode;
60 	int log_command;
61 	int do_wtmp_log;
62 	int require_valid_shell;
63 	int restricted_ports;
64 	unsigned int passive_port_low;
65 	unsigned int passive_port_high;
66 	int anonymous_login;
67 	int anonymous_only;
68 	int anonymous_readonly;
69 	int empty_passwd_login;
70 	int show_symlinks;
71 	int show_dot_files;
72 	int disable_epsv;
73 	int umask;
74 	int max_connection;
75 	int max_connection_per_ip;
76 	int timeout;
77 	int max_timeout;
78 } smbftpd_conf_t;
79 
80 /* struct to save smbftpd_share.conf share's information */
81 typedef struct smbftpd_share {
82 	struct smbftpd_share *next;
83 	char *share;
84 	char *path;
85 	char *rw;
86 	char *ro;
87 	char *disable_download;
88 	char *disable_ls;
89 	char *disable_modify;
90 	int browseable;
91 } smbftpd_share_t;
92 
93 void config_init();
94 void config_release();
95 int config_read(char *conf_path);
96 
97 typedef struct smbftpd_valid_share {
98 	struct smbftpd_valid_share *next;
99 	char *share;
100 	char *path;
101 	int writable;
102 	int disable_download;
103 	int disable_ls;
104 	int disable_modify;
105 	int browseable;
106 } smbftpd_valid_share_t;
107 
108 /**
109  * Struct for every forked child.
110  */
111 typedef struct {
112 	char username[256];
113 	char *home;
114 	char remotehost[NI_MAXHOST];
115 	struct passwd *pw_user;
116 	smbftpd_valid_share_t *valid_shares;
117 	int chroot;
118 	enum smbftpd_mode mode;
119 	off_t max_upload_rate;
120 	off_t max_download_rate;
121 	off_t byte_uploaded;
122 	off_t byte_downloaded;
123 	int transfer_type; /* TYPE_A, TYPE_I, TYPE_L; */
124 	int using_utf8_client;
125 	int logged_in;
126 	int guest;
127 	struct _ssl_ctrl {
128 		int ssl_encrypt_data;    /* RFC2228: default state is "Clear" */
129 		int PBSZ_used_flag;      /* RFC2228: PBSZ must be used before first PROT */
130 		int ssl_active_flag;     /* To replace the ssl_active_flag */
131 		int ssl_data_active_flag; /* To replace the ssl_data_active_flag */
132 	} ssl_ctrl;
133 } smbftpd_session_t;
134 
135 //struct sockaddr_in;
136 #ifdef  INET6
137 //struct sockaddr_in6;
138 #endif
139 union sockunion {
140 	struct sockinet {
141 #ifdef  HAVE_SI_LEN
142 		u_char  si_len;
143 #endif
144 		sa_family_t  si_family;
145 		u_short si_port;
146 #ifdef INET6
147 		char padding[sizeof(struct sockaddr_in6) - sizeof(sa_family_t) -
148 			sizeof(unsigned short int)];
149 #else /* !INET6 */
150 		char padding[sizeof(struct sockaddr_in) - sizeof(sa_family_t) -
151 			sizeof(unsigned short int)];
152 #endif /* INET6 */
153 	} su_si;
154 	struct sockaddr_in  su_sin;
155 #ifdef  INET6
156 	struct sockaddr_in6 su_sin6;
157 #endif
158 };
159 #ifdef  HAVE_SI_LEN
160 #define su_len          su_si.si_len
161 #endif
162 #define su_family       su_si.si_family
163 #define su_port         su_si.si_port
164 
165 /* log.c */
166 #define LOGCMD(cmd, file)		smbftpd_logcmd((cmd), (file), NULL, -1)
167 #define LOGCMD2(cmd, file1, file2)	smbftpd_logcmd((cmd), (file1), (file2), -1)
168 #define LOGBYTES(cmd, file, cnt)	smbftpd_logcmd((cmd), (file), NULL, (cnt))
169 void smbftpd_logcmd(const char *cmd, const char *file1, const char *file2, off_t cnt);
170 int smbftpd_xferlog_open(const char *log_path);
171 void smbftpd_xferlog_close(void);
172 void smbftpd_xferlog_write(const char *cmd, const char *file, off_t size, time_t tstart, time_t tend);
173 void smbftpd_logwtmp(const char *name, const char *host);
174 
175 /* reply.c */
176 void reply(int n, const char *fmt, ...);
177 void reply_noformat(int n, const char *str);
178 void reply_fs2client(int n, const char *fmt, ...);
179 #define	LONG_REPLY(x)		(x*-1)
180 #define	IS_LONG_REPLY(x)	(x < 0)
181 
182 void fatalerror(const char *s);
183 
184 /* share.c */
185 
186 /* Used in SzGetRealPath()'s flag */
187 #define FLAG_CHECK_WRITABLE     0x0001
188 #define FLAG_NO_FOLLOW_LINK     0x0002
189 #define FLAG_NO_FOLLOW_LAST_LINK        0x0004 /* For rename */
190 
191 const smbftpd_valid_share_t *smbftpd_get_share_by_path(smbftpd_valid_share_t *validshares, const char *path);
192 int smbfptd_replace_share_path(smbftpd_valid_share_t *validshares, char *path, int bufsize);
193 char *smbftpd_get_realpath(smbftpd_valid_share_t *validshares, const char *path, int flags);
194 int smbftpd_valid_share_get(const char *user, const char *home_dir, smbftpd_share_t *shares,smbftpd_valid_share_t **ppvalid_shares);
195 void smbftpd_valid_share_free(smbftpd_valid_share_t **validshares);
196 int smbftpd_share_enum(char *path, smbftpd_share_t **smb_shares);
197 void smbftpd_share_free(smbftpd_share_t **smb_shares);
198 
199 /* misc.c */
200 const char *set_get_value(struct opt_set *set, const char *user);
201 char *doublequote(const char *s);
202 char *str_trim_space(char *str);
203 char *str_trim_space_quote(char *szstr);
204 int is_user_in_list(const char *user, const char *list);
205 int is_user_in_group(const char *user, const char *group);
206 int smbftpd_config_parser(const char *file, int (*opt_handler)(char *option, char *optarg));
207 
208 /* proctitle.c */
209 void compat_setproctitle_init(int argc, char *argv[]);
210 void proc_title_init(const char *fmt, ...);
211 void proc_title_set(const char *cmd);
212 
213 /* pwcache.c */
214 #ifndef HAVE_PWCACHE
215 char *user_from_uid(uid_t uid, int nouser);
216 char *group_from_gid(gid_t gid, int nogroup);
217 #endif
218 
219 /* ftpcmd.y */
220 int yyparse(void);
221 int mygetline(char *s, int n, FILE *iop);
222 
223 /* main.c */
224 void dologout(int status);
225 
226 /* oob.c */
227 #define STARTXFER       flagxfer(1)
228 #define ENDXFER         flagxfer(0)
229 #define START_UNSAFE    maskurg(1)
230 #define END_UNSAFE      maskurg(0)
231 void flagxfer(int flag);
232 void set_receive_sigurg();
233 int sigurg_received();
234 int check_oob(void);
235 void maskurg(int flag);
236 
237 /* unicode.c */
238 int smbftpd_unicode_open(const char *encoding);
239 void smbftpd_unicode_close();
240 const char *smbftpd_charset_fs2client(const char *inbuf, char *outbuf, size_t outlen);
241 char *smbftpd_charset_client2fs(const char *inbuf);
242 
243 /* textuser.c */
244 typedef struct {
245 	char *user;
246 	char *group;
247 	char *home;
248 	char *password;
249 } smbftpd_text_user_t;
250 
251 void smbftpd_text_user_free(smbftpd_text_user_t *smbftpd_user);
252 int smbftpd_text_user_get(const char *path, const char *user, smbftpd_text_user_t *smbftpd_user);
253 int smbftpd_text_user_set(const char *path, const char *user, const smbftpd_text_user_t *smbftpd_user);
254 
255 #endif /* _SMBFTPD_H_ */
256