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