1/* 2 * Part of Very Secure FTPd 3 * Licence: GPL v2 4 * Author: Chris Evans 5 * sysstr.c 6 * 7 * This file basically wraps system functions so that we can deal in our 8 * nice abstracted string buffer objects. 9 */ 10 11#include <stdio.h> 12#include "sysstr.h" 13#include "str.h" 14#include "secbuf.h" 15#include "sysutil.h" 16#include "defs.h" 17#include "utility.h" 18#include "tunables.h" 19 20void 21str_getcwd(struct mystr* p_str) 22{ 23 static char* p_getcwd_buf; 24 char* p_ret; 25 //if (p_getcwd_buf == 0) 26 if(p_getcwd_buf == NULL) 27 { 28 vsf_secbuf_alloc(&p_getcwd_buf, VSFTP_PATH_MAX); 29 } 30 /* In case getcwd() fails */ 31 str_empty(p_str); 32 p_ret = vsf_sysutil_getcwd(p_getcwd_buf, VSFTP_PATH_MAX); 33 if (p_ret != 0) 34 { 35 str_alloc_text(p_str, p_getcwd_buf); 36 } 37} 38 39int 40str_write_loop(const struct mystr* p_str, const int fd) 41{ 42 return vsf_sysutil_write_loop(fd, str_getbuf(p_str), str_getlen(p_str)); 43} 44 45int 46str_read_loop(struct mystr* p_str, const int fd) 47{ 48 return vsf_sysutil_read_loop( 49 fd, (char*) str_getbuf(p_str), str_getlen(p_str)); 50} 51 52int 53str_mkdir(const struct mystr* p_str, const unsigned int mode) 54{ 55 return vsf_sysutil_mkdir(str_getbuf(p_str), mode); 56} 57 58int 59str_rmdir(const struct mystr* p_str) 60{ 61 return vsf_sysutil_rmdir(str_getbuf(p_str)); 62} 63 64int 65str_unlink(const struct mystr* p_str) 66{ 67 return vsf_sysutil_unlink(str_getbuf(p_str)); 68} 69 70int 71str_chdir(const struct mystr* p_str) 72{ 73 return vsf_sysutil_chdir(str_getbuf(p_str)); 74} 75 76int 77str_open(const struct mystr* p_str, const enum EVSFSysStrOpenMode mode) 78{ 79 enum EVSFSysUtilOpenMode open_mode = kVSFSysStrOpenUnknown; 80 switch (mode) 81 { 82 case kVSFSysStrOpenReadOnly: 83 open_mode = kVSFSysUtilOpenReadOnly; 84 break; 85 default: 86 bug("unknown mode value in str_open"); 87 break; 88 } 89 return vsf_sysutil_open_file(str_getbuf(p_str), open_mode); 90} 91 92int 93str_stat(const struct mystr* p_str, struct vsf_sysutil_statbuf** p_ptr) 94{ 95 return vsf_sysutil_stat(str_getbuf(p_str), p_ptr); 96} 97 98int 99str_lstat(const struct mystr* p_str, struct vsf_sysutil_statbuf** p_ptr) 100{ 101 return vsf_sysutil_lstat(str_getbuf(p_str), p_ptr); 102} 103 104int 105str_create(const struct mystr* p_str) 106{ 107 return vsf_sysutil_create_file(str_getbuf(p_str)); 108} 109 110int 111str_create_overwrite(const struct mystr* p_str) 112{ 113 return vsf_sysutil_create_overwrite_file(str_getbuf(p_str)); 114} 115 116int 117str_create_append(const struct mystr* p_str) 118{ 119 return vsf_sysutil_create_or_open_file( 120 str_getbuf(p_str), tunable_file_open_mode); 121} 122 123int 124str_chmod(const struct mystr* p_str, unsigned int mode) 125{ 126 return vsf_sysutil_chmod(str_getbuf(p_str), mode); 127} 128 129int 130str_rename(const struct mystr* p_from_str, const struct mystr* p_to_str) 131{ 132 return vsf_sysutil_rename(str_getbuf(p_from_str), str_getbuf(p_to_str)); 133} 134 135struct vsf_sysutil_dir* 136str_opendir(const struct mystr* p_str) 137{ 138 return vsf_sysutil_opendir(str_getbuf(p_str)); 139} 140 141// James 142void str_next_dirent(const char *session_user, const char *base_dir, struct mystr *p_filename_str, struct vsf_sysutil_dir *p_dir) 143{ 144 const char* p_filename = vsf_sysutil_next_dirent(session_user, base_dir, p_dir); 145 str_empty(p_filename_str); 146 if (p_filename != 0) 147 { 148 str_alloc_text(p_filename_str, p_filename); 149 } 150} 151 152int 153str_readlink(struct mystr* p_str, const struct mystr* p_filename_str) 154{ 155 static char* p_readlink_buf; 156 int retval; 157 if (p_readlink_buf == 0) 158 { 159 vsf_secbuf_alloc(&p_readlink_buf, VSFTP_PATH_MAX); 160 } 161 /* In case readlink() fails */ 162 str_empty(p_str); 163 /* Note: readlink(2) does not NULL terminate, but our wrapper does */ 164 retval = vsf_sysutil_readlink(str_getbuf(p_filename_str), p_readlink_buf, 165 VSFTP_PATH_MAX); 166 if (vsf_sysutil_retval_is_error(retval)) 167 { 168 return retval; 169 } 170 str_alloc_text(p_str, p_readlink_buf); 171 return 0; 172} 173 174struct vsf_sysutil_user* 175str_getpwnam(const struct mystr* p_user_str) 176{ 177 return vsf_sysutil_getpwnam(str_getbuf(p_user_str)); 178} 179 180void 181str_syslog(const struct mystr* p_str, int severe) 182{ 183 vsf_sysutil_syslog(str_getbuf(p_str), severe); 184} 185 186