vsftpd 2.0.7 - initial checkin.
[tomato.git] / release / src / router / vsftpd / sysutil.h
blobbb9c6edd175300154748c1222a9428ae4d709f4f
1 #ifndef VSF_SYSUTIL_H
2 #define VSF_SYSUTIL_H
4 /* TODO: these functions need proper documenting! */
6 #ifndef VSF_FILESIZE_H
7 #include "filesize.h"
8 #endif
10 /* Return value queries */
11 int vsf_sysutil_retval_is_error(int retval);
12 enum EVSFSysUtilError
14 kVSFSysUtilErrUnknown = 1,
15 kVSFSysUtilErrADDRINUSE,
16 kVSFSysUtilErrNOSYS,
17 kVSFSysUtilErrINTR,
18 kVSFSysUtilErrINVAL,
19 kVSFSysUtilErrOPNOTSUPP
21 enum EVSFSysUtilError vsf_sysutil_get_error(void);
23 /* Signal handling utility functions */
24 enum EVSFSysUtilSignal
26 kVSFSysUtilSigALRM = 1,
27 kVSFSysUtilSigTERM,
28 kVSFSysUtilSigCHLD,
29 kVSFSysUtilSigPIPE,
30 kVSFSysUtilSigURG,
31 kVSFSysUtilSigHUP
33 enum EVSFSysUtilInterruptContext
35 kVSFSysUtilUnknown,
36 kVSFSysUtilIO
38 typedef void (*vsf_sighandle_t)(void*);
39 typedef void (*vsf_async_sighandle_t)(int);
40 typedef void (*vsf_context_io_t)(int, int, void*);
42 void vsf_sysutil_install_null_sighandler(const enum EVSFSysUtilSignal sig);
43 void vsf_sysutil_install_sighandler(const enum EVSFSysUtilSignal,
44 vsf_sighandle_t handler, void* p_private);
45 void vsf_sysutil_install_async_sighandler(const enum EVSFSysUtilSignal sig,
46 vsf_async_sighandle_t handler);
47 void vsf_sysutil_default_sig(const enum EVSFSysUtilSignal sig);
48 void vsf_sysutil_install_io_handler(vsf_context_io_t handler, void* p_private);
49 void vsf_sysutil_uninstall_io_handler(void);
50 void vsf_sysutil_check_pending_actions(
51 const enum EVSFSysUtilInterruptContext context, int retval, int fd);
52 void vsf_sysutil_block_sig(const enum EVSFSysUtilSignal sig);
53 void vsf_sysutil_unblock_sig(const enum EVSFSysUtilSignal sig);
55 /* Alarm setting/clearing utility functions */
56 void vsf_sysutil_set_alarm(const unsigned int trigger_seconds);
57 void vsf_sysutil_clear_alarm(void);
59 /* Directory related things */
60 char* vsf_sysutil_getcwd(char* p_dest, const unsigned int buf_size);
61 int vsf_sysutil_mkdir(const char* p_dirname, const unsigned int mode);
62 int vsf_sysutil_rmdir(const char* p_dirname);
63 int vsf_sysutil_chdir(const char* p_dirname);
64 int vsf_sysutil_rename(const char* p_from, const char* p_to);
66 struct vsf_sysutil_dir;
67 struct vsf_sysutil_dir* vsf_sysutil_opendir(const char* p_dirname);
68 void vsf_sysutil_closedir(struct vsf_sysutil_dir* p_dir);
69 const char* vsf_sysutil_next_dirent(struct vsf_sysutil_dir* p_dir);
71 /* File create/open/close etc. */
72 enum EVSFSysUtilOpenMode
74 kVSFSysUtilOpenReadOnly = 1,
75 kVSFSysUtilOpenWriteOnly,
76 kVSFSysUtilOpenReadWrite
78 int vsf_sysutil_open_file(const char* p_filename,
79 const enum EVSFSysUtilOpenMode);
80 /* Fails if file already exists */
81 int vsf_sysutil_create_file(const char* p_filename);
82 /* Overwrites if file already exists */
83 int vsf_sysutil_create_overwrite_file(const char* p_filename);
84 /* Creates file or appends if already exists */
85 int vsf_sysutil_create_append_file(const char* p_filename);
86 /* Creates or appends */
87 int vsf_sysutil_create_or_open_file(const char* p_filename, unsigned int mode);
88 void vsf_sysutil_dupfd2(int old_fd, int new_fd);
89 void vsf_sysutil_close(int fd);
90 int vsf_sysutil_close_failok(int fd);
91 int vsf_sysutil_unlink(const char* p_dead);
92 int vsf_sysutil_write_access(const char* p_filename);
94 /* Reading and writing */
95 void vsf_sysutil_lseek_to(const int fd, filesize_t seek_pos);
96 filesize_t vsf_sysutil_get_file_offset(const int file_fd);
97 int vsf_sysutil_read(const int fd, void* p_buf, const unsigned int size);
98 int vsf_sysutil_write(const int fd, const void* p_buf,
99 const unsigned int size);
100 /* Reading and writing, with handling of interrupted system calls and partial
101 * reads/writes. Slightly more usable than the standard UNIX API!
103 int vsf_sysutil_read_loop(const int fd, void* p_buf, unsigned int size);
104 int vsf_sysutil_write_loop(const int fd, const void* p_buf, unsigned int size);
106 struct vsf_sysutil_statbuf;
107 int vsf_sysutil_stat(const char* p_name, struct vsf_sysutil_statbuf** p_ptr);
108 int vsf_sysutil_lstat(const char* p_name, struct vsf_sysutil_statbuf** p_ptr);
109 void vsf_sysutil_fstat(int fd, struct vsf_sysutil_statbuf** p_ptr);
110 void vsf_sysutil_dir_stat(const struct vsf_sysutil_dir* p_dir,
111 struct vsf_sysutil_statbuf** p_ptr);
112 int vsf_sysutil_statbuf_is_regfile(const struct vsf_sysutil_statbuf* p_stat);
113 int vsf_sysutil_statbuf_is_symlink(const struct vsf_sysutil_statbuf* p_stat);
114 int vsf_sysutil_statbuf_is_socket(const struct vsf_sysutil_statbuf* p_stat);
115 int vsf_sysutil_statbuf_is_dir(const struct vsf_sysutil_statbuf* p_stat);
116 filesize_t vsf_sysutil_statbuf_get_size(
117 const struct vsf_sysutil_statbuf* p_stat);
118 const char* vsf_sysutil_statbuf_get_perms(
119 const struct vsf_sysutil_statbuf* p_stat);
120 const char* vsf_sysutil_statbuf_get_date(
121 const struct vsf_sysutil_statbuf* p_stat, int use_localtime);
122 const char* vsf_sysutil_statbuf_get_numeric_date(
123 const struct vsf_sysutil_statbuf* p_stat, int use_localtime);
124 unsigned int vsf_sysutil_statbuf_get_links(
125 const struct vsf_sysutil_statbuf* p_stat);
126 int vsf_sysutil_statbuf_get_uid(const struct vsf_sysutil_statbuf* p_stat);
127 int vsf_sysutil_statbuf_get_gid(const struct vsf_sysutil_statbuf* p_stat);
128 int vsf_sysutil_statbuf_is_readable_other(
129 const struct vsf_sysutil_statbuf* p_stat);
130 const char* vsf_sysutil_statbuf_get_sortkey_mtime(
131 const struct vsf_sysutil_statbuf* p_stat);
133 int vsf_sysutil_chmod(const char* p_filename, unsigned int mode);
134 void vsf_sysutil_fchown(const int fd, const int uid, const int gid);
135 void vsf_sysutil_fchmod(const int fd, unsigned int mode);
136 int vsf_sysutil_readlink(const char* p_filename, char* p_dest,
137 unsigned int bufsiz);
139 /* Get / unget various locks. Lock gets are blocking. Write locks are
140 * exclusive; read locks are shared.
142 int vsf_sysutil_lock_file_write(int fd);
143 int vsf_sysutil_lock_file_read(int fd);
144 void vsf_sysutil_unlock_file(int fd);
146 /* Mapping/unmapping */
147 enum EVSFSysUtilMapPermission
149 kVSFSysUtilMapProtReadOnly = 1,
150 kVSFSysUtilMapProtNone
152 void vsf_sysutil_memprotect(void* p_addr, unsigned int len,
153 const enum EVSFSysUtilMapPermission perm);
154 void vsf_sysutil_memunmap(void* p_start, unsigned int length);
156 /* Memory allocating/freeing */
157 void* vsf_sysutil_malloc(unsigned int size);
158 void* vsf_sysutil_realloc(void* p_ptr, unsigned int size);
159 void vsf_sysutil_free(void* p_ptr);
161 /* Process creation/exit/process handling */
162 unsigned int vsf_sysutil_getpid(void);
163 int vsf_sysutil_fork(void);
164 int vsf_sysutil_fork_failok(void);
165 void vsf_sysutil_exit(int exit_code);
166 struct vsf_sysutil_wait_retval
168 int PRIVATE_HANDS_OFF_syscall_retval;
169 int PRIVATE_HANDS_OFF_exit_status;
171 struct vsf_sysutil_wait_retval vsf_sysutil_wait(void);
172 int vsf_sysutil_wait_reap_one(void);
173 int vsf_sysutil_wait_get_retval(
174 const struct vsf_sysutil_wait_retval* p_waitret);
175 int vsf_sysutil_wait_exited_normally(
176 const struct vsf_sysutil_wait_retval* p_waitret);
177 int vsf_sysutil_wait_get_exitcode(
178 const struct vsf_sysutil_wait_retval* p_waitret);
180 /* Various string functions */
181 unsigned int vsf_sysutil_strlen(const char* p_text);
182 char* vsf_sysutil_strdup(const char* p_str);
183 void vsf_sysutil_memclr(void* p_dest, unsigned int size);
184 void vsf_sysutil_memcpy(void* p_dest, const void* p_src,
185 const unsigned int size);
186 void vsf_sysutil_strcpy(char* p_dest, const char* p_src, unsigned int maxsize);
187 int vsf_sysutil_memcmp(const void* p_src1, const void* p_src2,
188 unsigned int size);
189 int vsf_sysutil_strcmp(const char* p_src1, const char* p_src2);
190 int vsf_sysutil_atoi(const char* p_str);
191 filesize_t vsf_sysutil_a_to_filesize_t(const char* p_str);
192 const char* vsf_sysutil_ulong_to_str(unsigned long the_ulong);
193 const char* vsf_sysutil_filesize_t_to_str(filesize_t the_filesize);
194 const char* vsf_sysutil_double_to_str(double the_double);
195 const char* vsf_sysutil_uint_to_octal(unsigned int the_uint);
196 unsigned int vsf_sysutil_octal_to_uint(const char* p_str);
197 int vsf_sysutil_toupper(int the_char);
198 int vsf_sysutil_isspace(int the_char);
199 int vsf_sysutil_isprint(int the_char);
200 int vsf_sysutil_isalnum(int the_char);
201 int vsf_sysutil_isdigit(int the_char);
203 /* Socket handling */
204 struct vsf_sysutil_sockaddr;
205 struct vsf_sysutil_socketpair_retval
207 int socket_one;
208 int socket_two;
210 void vsf_sysutil_sockaddr_alloc(struct vsf_sysutil_sockaddr** p_sockptr);
211 void vsf_sysutil_sockaddr_clear(struct vsf_sysutil_sockaddr** p_sockptr);
212 void vsf_sysutil_sockaddr_alloc_ipv4(struct vsf_sysutil_sockaddr** p_sockptr);
213 void vsf_sysutil_sockaddr_alloc_ipv6(struct vsf_sysutil_sockaddr** p_sockptr);
214 void vsf_sysutil_sockaddr_clone(
215 struct vsf_sysutil_sockaddr** p_sockptr,
216 const struct vsf_sysutil_sockaddr* p_src);
217 int vsf_sysutil_sockaddr_addr_equal(const struct vsf_sysutil_sockaddr* p1,
218 const struct vsf_sysutil_sockaddr* p2);
219 int vsf_sysutil_sockaddr_is_ipv6(
220 const struct vsf_sysutil_sockaddr* p_sockaddr);
221 void vsf_sysutil_sockaddr_set_ipv4addr(struct vsf_sysutil_sockaddr* p_sockptr,
222 const unsigned char* p_raw);
223 void vsf_sysutil_sockaddr_set_ipv6addr(struct vsf_sysutil_sockaddr* p_sockptr,
224 const unsigned char* p_raw);
225 void vsf_sysutil_sockaddr_set_any(struct vsf_sysutil_sockaddr* p_sockaddr);
226 void vsf_sysutil_sockaddr_set_port(struct vsf_sysutil_sockaddr* p_sockptr,
227 unsigned short the_port);
228 int vsf_sysutil_is_port_reserved(unsigned short port);
229 int vsf_sysutil_get_ipsock(const struct vsf_sysutil_sockaddr* p_sockaddr);
230 unsigned int vsf_sysutil_get_ipaddr_size(void);
231 void* vsf_sysutil_sockaddr_get_raw_addr(
232 struct vsf_sysutil_sockaddr* p_sockaddr);
233 const void* vsf_sysutil_sockaddr_ipv6_v4(
234 const struct vsf_sysutil_sockaddr* p_sockaddr);
235 const void* vsf_sysutil_sockaddr_ipv4_v6(
236 const struct vsf_sysutil_sockaddr* p_sockaddr);
237 int vsf_sysutil_get_ipv4_sock(void);
238 int vsf_sysutil_get_ipv6_sock(void);
239 struct vsf_sysutil_socketpair_retval
240 vsf_sysutil_unix_stream_socketpair(void);
241 int vsf_sysutil_bind(int fd, const struct vsf_sysutil_sockaddr* p_sockptr);
242 int vsf_sysutil_listen(int fd, const unsigned int backlog);
243 void vsf_sysutil_getsockname(int fd, struct vsf_sysutil_sockaddr** p_sockptr);
244 void vsf_sysutil_getpeername(int fd, struct vsf_sysutil_sockaddr** p_sockptr);
245 int vsf_sysutil_accept_timeout(int fd, struct vsf_sysutil_sockaddr* p_sockaddr,
246 unsigned int wait_seconds);
247 int vsf_sysutil_connect_timeout(int fd,
248 const struct vsf_sysutil_sockaddr* p_sockaddr,
249 unsigned int wait_seconds);
250 void vsf_sysutil_dns_resolve(struct vsf_sysutil_sockaddr** p_sockptr,
251 const char* p_name);
252 /* Option setting on sockets */
253 void vsf_sysutil_activate_keepalive(int fd);
254 void vsf_sysutil_set_iptos_throughput(int fd);
255 void vsf_sysutil_activate_reuseaddr(int fd);
256 void vsf_sysutil_set_nodelay(int fd);
257 void vsf_sysutil_activate_sigurg(int fd);
258 void vsf_sysutil_activate_oobinline(int fd);
259 void vsf_sysutil_activate_linger(int fd);
260 void vsf_sysutil_deactivate_linger_failok(int fd);
261 void vsf_sysutil_activate_noblock(int fd);
262 void vsf_sysutil_deactivate_noblock(int fd);
263 /* This does SHUT_RDWR */
264 void vsf_sysutil_shutdown_failok(int fd);
265 /* And this does SHUT_RD */
266 void vsf_sysutil_shutdown_read_failok(int fd);
267 int vsf_sysutil_recv_peek(const int fd, void* p_buf, unsigned int len);
269 const char* vsf_sysutil_inet_ntop(
270 const struct vsf_sysutil_sockaddr* p_sockptr);
271 const char* vsf_sysutil_inet_ntoa(const void* p_raw_addr);
272 int vsf_sysutil_inet_aton(
273 const char* p_text, struct vsf_sysutil_sockaddr* p_addr);
275 /* User database queries etc. */
276 struct vsf_sysutil_user;
277 struct vsf_sysutil_group;
279 struct vsf_sysutil_user* vsf_sysutil_getpwuid(const int uid);
280 struct vsf_sysutil_user* vsf_sysutil_getpwnam(const char* p_user);
281 const char* vsf_sysutil_user_getname(const struct vsf_sysutil_user* p_user);
282 const char* vsf_sysutil_user_get_homedir(
283 const struct vsf_sysutil_user* p_user);
284 int vsf_sysutil_user_getuid(const struct vsf_sysutil_user* p_user);
285 int vsf_sysutil_user_getgid(const struct vsf_sysutil_user* p_user);
287 struct vsf_sysutil_group* vsf_sysutil_getgrgid(const int gid);
288 const char* vsf_sysutil_group_getname(const struct vsf_sysutil_group* p_group);
290 /* More random things */
291 unsigned int vsf_sysutil_getpagesize(void);
292 unsigned char vsf_sysutil_get_random_byte(void);
293 unsigned int vsf_sysutil_get_umask(void);
294 void vsf_sysutil_set_umask(unsigned int umask);
295 void vsf_sysutil_make_session_leader(void);
296 void vsf_sysutil_tzset(void);
297 const char* vsf_sysutil_get_current_date(void);
298 void vsf_sysutil_qsort(void* p_base, unsigned int num_elem,
299 unsigned int elem_size,
300 int (*p_compar)(const void *, const void *));
301 char* vsf_sysutil_getenv(const char* p_var);
302 typedef void (*exitfunc_t)(void);
303 void vsf_sysutil_set_exit_func(exitfunc_t exitfunc);
305 /* Syslogging (bah) */
306 void vsf_sysutil_openlog(void);
307 void vsf_sysutil_syslog(const char* p_text, int severe);
309 /* Credentials handling */
310 int vsf_sysutil_running_as_root(void);
311 void vsf_sysutil_setuid(const struct vsf_sysutil_user* p_user);
312 void vsf_sysutil_setgid(const struct vsf_sysutil_user* p_user);
313 void vsf_sysutil_setuid_numeric(int uid);
314 void vsf_sysutil_setgid_numeric(int gid);
315 int vsf_sysutil_geteuid(void);
316 int vsf_sysutil_getegid(void);
317 void vsf_sysutil_seteuid(const struct vsf_sysutil_user* p_user);
318 void vsf_sysutil_setegid(const struct vsf_sysutil_user* p_user);
319 void vsf_sysutil_seteuid_numeric(int uid);
320 void vsf_sysutil_setegid_numeric(int gid);
321 void vsf_sysutil_clear_supp_groups(void);
322 void vsf_sysutil_initgroups(const struct vsf_sysutil_user* p_user);
323 void vsf_sysutil_chroot(const char* p_root_path);
325 /* Time handling */
326 void vsf_sysutil_update_cached_time(void);
327 long vsf_sysutil_get_cached_time_sec(void);
328 long vsf_sysutil_get_cached_time_usec(void);
329 long vsf_sysutil_parse_time(const char* p_text);
330 void vsf_sysutil_sleep(double seconds);
331 int vsf_sysutil_setmodtime(const char* p_file, long the_time, int is_localtime);
333 #endif /* VSF_SYSUTIL_H */