1/* 2 * Part of Very Secure FTPd 3 * Licence: GPL v2 4 * Author: Chris Evans 5 * banner.c 6 * 7 * Calls exposed to handle the junk a typical FTP server has to do upon 8 * entering a new directory (messages, etc), as well as general banner 9 * writing support. 10 */ 11 12#include "banner.h" 13#include "strlist.h" 14#include "str.h" 15#include "sysstr.h" 16#include "tunables.h" 17#include "ftpcmdio.h" 18#include "filestr.h" 19#include "session.h" 20#include "sysutil.h" 21 22/* Definitions */ 23#define VSFTP_MAX_VISIT_REMEMBER 100 24#define VSFTP_MAX_MSGFILE_SIZE 4000 25 26void 27vsf_banner_dir_changed(struct vsf_session* p_sess, int ftpcode) 28{ 29 struct mystr dir_str = INIT_MYSTR; 30 /* Do nothing if .message support is off */ 31 if (!tunable_dirmessage_enable) 32 { 33 return; 34 } 35 if (p_sess->p_visited_dir_list == 0) 36 { 37 struct mystr_list the_list = INIT_STRLIST; 38 p_sess->p_visited_dir_list = vsf_sysutil_malloc(sizeof(struct mystr_list)); 39 *p_sess->p_visited_dir_list = the_list; 40 } 41 str_getcwd(&dir_str); 42 /* Do nothing if we already visited this directory */ 43 if (!str_list_contains_str(p_sess->p_visited_dir_list, &dir_str)) 44 { 45 /* Just in case, cap the max. no of visited directories we'll remember */ 46 if (str_list_get_length(p_sess->p_visited_dir_list) < 47 VSFTP_MAX_VISIT_REMEMBER) 48 { 49 str_list_add(p_sess->p_visited_dir_list, &dir_str, 0); 50 } 51 /* If we have a .message file, squirt it out prepended by the ftpcode and 52 * the continuation mark '-' 53 */ 54 { 55 struct mystr msg_file_str = INIT_MYSTR; 56 (void) str_fileread(&msg_file_str, tunable_message_file, 57 VSFTP_MAX_MSGFILE_SIZE); 58 vsf_banner_write(p_sess, &msg_file_str, ftpcode); 59 str_free(&msg_file_str); 60 } 61 } 62 str_free(&dir_str); 63} 64 65void 66vsf_banner_write(struct vsf_session* p_sess, struct mystr* p_str, int ftpcode) 67{ 68 struct mystr msg_line_str = INIT_MYSTR; 69 unsigned int str_pos = 0; 70 while (str_getline(p_str, &msg_line_str, &str_pos)) 71 { 72 vsf_cmdio_write_str_hyphen(p_sess, ftpcode, &msg_line_str); 73 } 74 str_free(&msg_line_str); 75} 76 77