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