4 /* TODO: these functions need proper documenting! */
10 /* Return value queries */
11 int vsf_sysutil_retval_is_error(int retval
);
14 kVSFSysUtilErrUnknown
= 1,
15 kVSFSysUtilErrADDRINUSE
,
19 kVSFSysUtilErrOPNOTSUPP
21 enum EVSFSysUtilError
vsf_sysutil_get_error(void);
23 /* Signal handling utility functions */
24 enum EVSFSysUtilSignal
26 kVSFSysUtilSigALRM
= 1,
33 enum EVSFSysUtilInterruptContext
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
,
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
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
,
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
);
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 */