12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- * Part of Very Secure FTPd
- * Licence: GPL v2
- * Author: Chris Evans
- * banner.c
- *
- * Calls exposed to handle the junk a typical FTP server has to do upon
- * entering a new directory (messages, etc), as well as general banner
- * writing support.
- */
- #include "banner.h"
- #include "strlist.h"
- #include "str.h"
- #include "sysstr.h"
- #include "tunables.h"
- #include "ftpcmdio.h"
- #include "filestr.h"
- #include "session.h"
- #include "sysutil.h"
- /* Definitions */
- #define VSFTP_MAX_VISIT_REMEMBER 100
- #define VSFTP_MAX_MSGFILE_SIZE 4000
- void
- vsf_banner_dir_changed(struct vsf_session* p_sess, int ftpcode)
- {
- struct mystr dir_str = INIT_MYSTR;
- /* Do nothing if .message support is off */
- if (!tunable_dirmessage_enable)
- {
- return;
- }
- if (p_sess->p_visited_dir_list == 0)
- {
- struct mystr_list the_list = INIT_STRLIST;
- p_sess->p_visited_dir_list = vsf_sysutil_malloc(sizeof(struct mystr_list));
- *p_sess->p_visited_dir_list = the_list;
- }
- str_getcwd(&dir_str);
- /* Do nothing if we already visited this directory */
- if (!str_list_contains_str(p_sess->p_visited_dir_list, &dir_str))
- {
- /* Just in case, cap the max. no of visited directories we'll remember */
- if (str_list_get_length(p_sess->p_visited_dir_list) <
- VSFTP_MAX_VISIT_REMEMBER)
- {
- str_list_add(p_sess->p_visited_dir_list, &dir_str, 0);
- }
- /* If we have a .message file, squirt it out prepended by the ftpcode and
- * the continuation mark '-'
- */
- {
- struct mystr msg_file_str = INIT_MYSTR;
- if (tunable_message_file)
- {
- (void) str_fileread(&msg_file_str, tunable_message_file,
- VSFTP_MAX_MSGFILE_SIZE);
- }
- vsf_banner_write(p_sess, &msg_file_str, ftpcode);
- str_free(&msg_file_str);
- }
- }
- str_free(&dir_str);
- }
- void
- vsf_banner_write(struct vsf_session* p_sess, struct mystr* p_str, int ftpcode)
- {
- struct mystr msg_line_str = INIT_MYSTR;
- unsigned int str_pos = 0;
- while (str_getline(p_str, &msg_line_str, &str_pos))
- {
- vsf_cmdio_write_str_hyphen(p_sess, ftpcode, &msg_line_str);
- }
- str_free(&msg_line_str);
- }
|