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