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