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