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