DDraceNetwork Documentation
Loading...
Searching...
No Matches
system.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3
4/*
5 Title: OS Abstraction
6*/
7
8#ifndef BASE_SYSTEM_H
9#define BASE_SYSTEM_H
10
11#include "dbg.h"
12#include "detect.h"
13#include "fs.h"
14#include "mem.h"
15#include "str.h"
16#include "time.h"
17#include "types.h"
18
19#include <chrono>
20#include <cinttypes>
21#include <cstdarg>
22#include <cstdint>
23#include <cstring>
24#include <ctime>
25#include <functional>
26#include <mutex>
27#include <optional>
28#include <string>
29
30#ifdef __MINGW32__
31#undef PRId64
32#undef PRIu64
33#undef PRIX64
34#define PRId64 "I64d"
35#define PRIu64 "I64u"
36#define PRIX64 "I64X"
37#define PRIzu "Iu"
38#else
39#define PRIzu "zu"
40#endif
41
42#ifdef CONF_FAMILY_UNIX
43#include <sys/un.h>
44#endif
45
46#ifdef CONF_PLATFORM_LINUX
47#include <netinet/in.h>
48#include <sys/socket.h>
49#endif
50
56
60enum
61{
80};
81
106
119IOHANDLE io_open(const char *filename, int flags);
120
132unsigned io_read(IOHANDLE io, void *buffer, unsigned size);
133
150bool io_read_all(IOHANDLE io, void **result, unsigned *result_len);
151
168char *io_read_all_str(IOHANDLE io);
169
180int io_skip(IOHANDLE io, int64_t size);
181
193int io_seek(IOHANDLE io, int64_t offset, ESeekOrigin origin);
194
204int64_t io_tell(IOHANDLE io);
205
215int64_t io_length(IOHANDLE io);
216
228unsigned io_write(IOHANDLE io, const void *buffer, unsigned size);
229
240
250int io_close(IOHANDLE io);
251
261int io_flush(IOHANDLE io);
262
272int io_sync(IOHANDLE io);
273
283int io_error(IOHANDLE io);
284
295
306
317
326
332typedef struct ASYNCIO ASYNCIO;
333
344
353void aio_lock(ASYNCIO *aio);
354
363void aio_unlock(ASYNCIO *aio);
364
374void aio_write(ASYNCIO *aio, const void *buffer, unsigned size);
375
383void aio_write_newline(ASYNCIO *aio);
384
395void aio_write_unlocked(ASYNCIO *aio, const void *buffer, unsigned size);
396
406
420int aio_error(ASYNCIO *aio);
421
429void aio_close(ASYNCIO *aio);
430
438void aio_wait(ASYNCIO *aio);
439
447void aio_free(ASYNCIO *aio);
448
457
469void *thread_init(void (*threadfunc)(void *), void *user, const char *name);
470
478void thread_wait(void *thread);
479
485void thread_yield();
486
496void thread_detach(void *thread);
497
507void thread_init_and_detach(void (*threadfunc)(void *), void *user, const char *name);
508
514
515#if defined(CONF_FAMILY_WINDOWS)
516typedef void *SEMAPHORE;
517#elif defined(CONF_PLATFORM_MACOS)
518#include <semaphore.h>
519typedef sem_t *SEMAPHORE;
520#elif defined(CONF_FAMILY_UNIX)
521#include <semaphore.h>
522typedef sem_t SEMAPHORE;
523#else
524#error not implemented on this platform
525#endif
526
530void sphore_init(SEMAPHORE *sem);
534void sphore_wait(SEMAPHORE *sem);
538void sphore_signal(SEMAPHORE *sem);
542void sphore_destroy(SEMAPHORE *sem);
543
547
553
557extern const NETADDR NETADDR_ZEROED;
558
559#ifdef CONF_FAMILY_UNIX
563typedef int UNIXSOCKET;
567typedef struct sockaddr_un UNIXSOCKETADDR;
568#endif
569
577void net_init();
578
590int net_host_lookup(const char *hostname, NETADDR *addr, int types);
591
604int net_addr_comp(const NETADDR *a, const NETADDR *b);
605
618int net_addr_comp_noport(const NETADDR *a, const NETADDR *b);
619
632void net_addr_str(const NETADDR *addr, char *string, int max_length, bool add_port);
633
659int net_addr_from_url(NETADDR *addr, const char *string, char *host_buf, size_t host_buf_size);
660
670bool net_addr_is_local(const NETADDR *addr);
671
682int net_addr_from_str(NETADDR *addr, const char *string);
683
694
703
711int net_errno();
712
720std::string net_error_message();
721
729int net_would_block();
730
741int net_socket_read_wait(NETSOCKET sock, std::chrono::nanoseconds nanoseconds);
742
748
759int net_socket_type(NETSOCKET sock);
760
771
784int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size);
785
797int net_udp_recv(NETSOCKET sock, NETADDR *addr, unsigned char **data);
798
806void net_udp_close(NETSOCKET sock);
807
813
824
835int net_tcp_listen(NETSOCKET sock, int backlog);
836
848int net_tcp_accept(NETSOCKET sock, NETSOCKET *new_sock, NETADDR *addr);
849
861int net_tcp_connect(NETSOCKET sock, const NETADDR *addr);
862
874
886int net_tcp_send(NETSOCKET sock, const void *data, int size);
887
900int net_tcp_recv(NETSOCKET sock, void *data, int maxsize);
901
909void net_tcp_close(NETSOCKET sock);
910
911#if defined(CONF_FAMILY_UNIX)
917
926
939int net_unix_send(UNIXSOCKET sock, UNIXSOCKETADDR *addr, void *data, int size);
940
949void net_unix_set_addr(UNIXSOCKETADDR *addr, const char *path);
950
958void net_unix_close(UNIXSOCKET sock);
959
960#endif
961
967
984[[gnu::format(printf, 3, 0)]] int str_format_v(char *buffer, int buffer_size, const char *format, va_list args);
985
1002[[gnu::format(printf, 3, 4)]] int str_format(char *buffer, int buffer_size, const char *format, ...);
1003
1004#if !defined(CONF_DEBUG)
1005int str_format_int(char *buffer, size_t buffer_size, int value);
1006
1007template<typename... Args>
1008int str_format_opt(char *buffer, int buffer_size, const char *format, Args... args)
1009{
1010 static_assert(sizeof...(args) > 0, "Use str_copy instead of str_format without format arguments");
1011 return str_format(buffer, buffer_size, format, args...);
1012}
1013
1014template<>
1015inline int str_format_opt(char *buffer, int buffer_size, const char *format, int val) // NOLINT(readability-inconsistent-declaration-parameter-name)
1016{
1017 if(strcmp(format, "%d") == 0)
1018 {
1019 return str_format_int(buffer, buffer_size, val);
1020 }
1021 else
1022 {
1023 return str_format(buffer, buffer_size, format, val);
1024 }
1025}
1026
1027#define str_format str_format_opt
1028#endif
1029
1040int str_utf8_dist(const char *a, const char *b);
1041
1058int str_utf8_dist_buffer(const char *a, const char *b, int *buf, int buf_len);
1059
1078int str_utf32_dist_buffer(const int *a, int a_len, const int *b, int b_len, int *buf, int buf_len);
1079
1085
1098void fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user);
1099
1112void fs_listdir_fileinfo(const char *dir, FS_LISTDIR_CALLBACK_FILEINFO cb, int type, void *user);
1113
1125int fs_makedir_rec_for(const char *path);
1126
1144int fs_storage_path(const char *appname, char *path, int max);
1145
1160int fs_executable_path(char *buffer, int buffer_size);
1161
1174int fs_is_file(const char *path);
1175
1188int fs_is_dir(const char *path);
1189
1201int fs_is_relative_path(const char *path);
1202
1214int fs_chdir(const char *path);
1215
1228char *fs_getcwd(char *buffer, int buffer_size);
1229
1244const char *fs_filename(const char *path);
1245
1261void fs_split_file_extension(const char *filename, char *name, size_t name_size, char *extension = nullptr, size_t extension_size = 0);
1262
1273void fs_normalize_path(char *path);
1274
1286int fs_parent_dir(char *path);
1287
1300int fs_remove(const char *filename);
1301
1314int fs_rename(const char *oldname, const char *newname);
1315
1330int fs_file_time(const char *name, time_t *created, time_t *modified);
1331
1341void swap_endian(void *data, unsigned elem_size, unsigned num);
1342
1343void net_stats(NETSTATS *stats);
1344
1345int str_utf8_to_skeleton(const char *str, int *buf, int buf_len);
1346
1357int str_utf8_comp_confusable(const char *str1, const char *str2);
1358
1368int str_utf8_tolower_codepoint(int code);
1369
1382unsigned bytes_be_to_uint(const unsigned char *bytes);
1383
1395void uint_to_bytes_be(unsigned char *bytes, unsigned value);
1396
1402
1410int pid();
1411
1422void cmdline_fix(int *argc, const char ***argv);
1423
1432void cmdline_free(int argc, const char **argv);
1433
1434#if !defined(CONF_PLATFORM_ANDROID)
1455
1468PROCESS shell_execute(const char *file, EShellExecuteWindowState window_state, const char **arguments = nullptr, size_t num_arguments = 0);
1469
1479int kill_process(PROCESS process);
1480
1491bool is_process_alive(PROCESS process);
1492
1505int open_link(const char *link);
1506
1519int open_file(const char *path);
1520#endif // !defined(CONF_PLATFORM_ANDROID)
1521
1527
1538void generate_password(char *buffer, unsigned length, const unsigned short *random, unsigned random_length);
1539
1552void secure_random_password(char *buffer, unsigned length, unsigned pw_length);
1553
1562void secure_random_fill(void *bytes, unsigned length);
1563
1574int secure_rand_below(int below);
1575
1586bool os_version_str(char *version, size_t length);
1587
1602void os_locale_str(char *locale, size_t length);
1603
1607
1616void crashdump_init_if_available(const char *log_file_path);
1617
1625{
1627 const char **m_ppArgv;
1628
1629public:
1630 CCmdlineFix(int *pArgc, const char ***pppArgv)
1631 {
1632 cmdline_fix(pArgc, pppArgv);
1633 m_Argc = *pArgc;
1634 m_ppArgv = *pppArgv;
1635 }
1637 {
1639 }
1640 CCmdlineFix(const CCmdlineFix &) = delete;
1641};
1642
1643#endif
~CCmdlineFix()
Definition system.h:1636
int m_Argc
Definition system.h:1626
CCmdlineFix(const CCmdlineFix &)=delete
const char ** m_ppArgv
Definition system.h:1627
CCmdlineFix(int *pArgc, const char ***pppArgv)
Definition system.h:1630
void crashdump_init_if_available(const char *log_file_path)
Definition crashdump.cpp:48
void aio_write_newline_unlocked(ASYNCIO *aio)
Definition system.cpp:635
IOHANDLE io_current_exe()
Definition system.cpp:373
void aio_wait(ASYNCIO *aio)
Definition system.cpp:666
void aio_write_unlocked(ASYNCIO *aio, const void *buffer, unsigned size)
Definition system.cpp:578
int io_flush(IOHANDLE io)
Definition system.cpp:335
ESeekOrigin
Definition system.h:86
int64_t io_tell(IOHANDLE io)
Definition system.cpp:293
IOHANDLE io_stderr()
Definition system.cpp:368
IOHANDLE io_open(const char *filename, int flags)
Definition system.cpp:126
int io_close(IOHANDLE io)
Definition system.cpp:330
char * io_read_all_str(IOHANDLE io)
Definition system.cpp:248
void aio_write(ASYNCIO *aio, const void *buffer, unsigned size)
Definition system.cpp:628
void aio_write_newline(ASYNCIO *aio)
Definition system.cpp:644
int io_skip(IOHANDLE io, int64_t size)
Definition system.cpp:264
int aio_error(ASYNCIO *aio)
Definition system.cpp:651
void aio_free(ASYNCIO *aio)
Definition system.cpp:682
unsigned io_write(IOHANDLE io, const void *buffer, unsigned size)
Definition system.cpp:316
bool io_write_newline(IOHANDLE io)
Definition system.cpp:321
bool io_read_all(IOHANDLE io, void **result, unsigned *result_len)
Definition system.cpp:191
void aio_lock(ASYNCIO *aio)
Definition system.cpp:567
void aio_close(ASYNCIO *aio)
Definition system.cpp:657
int io_sync(IOHANDLE io)
Definition system.cpp:340
int io_seek(IOHANDLE io, int64_t offset, ESeekOrigin origin)
Definition system.cpp:269
IOHANDLE io_stdin()
Definition system.cpp:358
int io_error(IOHANDLE io)
Definition system.cpp:353
IOHANDLE io_stdout()
Definition system.cpp:363
ASYNCIO * aio_new(IOHANDLE io)
Definition system.cpp:510
void aio_unlock(ASYNCIO *aio)
Definition system.cpp:572
int64_t io_length(IOHANDLE io)
Definition system.cpp:302
unsigned io_read(IOHANDLE io, void *buffer, unsigned size)
Definition system.cpp:186
@ IOFLAG_APPEND
Definition system.h:79
@ IOFLAG_WRITE
Definition system.h:73
@ IOFLAG_READ
Definition system.h:67
@ IOSEEK_END
Definition system.h:104
@ IOSEEK_CUR
Definition system.h:98
@ IOSEEK_START
Definition system.h:92
void fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user)
Definition system.cpp:2151
const char * fs_filename(const char *path)
Definition system.cpp:2497
void fs_split_file_extension(const char *filename, char *name, size_t name_size, char *extension=nullptr, size_t extension_size=0)
Definition system.cpp:2507
int fs_is_relative_path(const char *path)
Definition system.cpp:2451
void fs_normalize_path(char *path)
Definition system.cpp:2530
int fs_is_file(const char *path)
Definition system.cpp:2423
int fs_executable_path(char *buffer, int buffer_size)
Definition system.cpp:2343
int fs_parent_dir(char *path)
Definition system.cpp:2550
void fs_listdir_fileinfo(const char *dir, FS_LISTDIR_CALLBACK_FILEINFO cb, int type, void *user)
Definition system.cpp:2203
char * fs_getcwd(char *buffer, int buffer_size)
Definition system.cpp:2471
int fs_is_dir(const char *path)
Definition system.cpp:2437
int fs_file_time(const char *name, time_t *created, time_t *modified)
Definition system.cpp:2649
int fs_makedir_rec_for(const char *path)
Definition system.cpp:2402
int fs_storage_path(const char *appname, char *path, int max)
Definition system.cpp:2270
int fs_chdir(const char *path)
Definition system.cpp:2461
int fs_remove(const char *filename)
Definition system.cpp:2567
int fs_rename(const char *oldname, const char *newname)
Definition system.cpp:2627
int UNIXSOCKET
Definition system.h:563
int net_would_block()
Definition system.cpp:2091
int net_host_lookup(const char *hostname, NETADDR *addr, int types)
Definition system.cpp:1163
int net_addr_from_url(NETADDR *addr, const char *string, char *host_buf, size_t host_buf_size)
Definition system.cpp:1244
int net_set_non_blocking(NETSOCKET sock)
Definition system.cpp:1937
int net_socket_type(NETSOCKET sock)
Definition system.cpp:1506
const NETADDR NETADDR_ZEROED
Definition system.cpp:875
int net_errno()
Definition system.cpp:2071
std::string net_error_message()
Definition system.cpp:2080
int net_addr_comp_noport(const NETADDR *a, const NETADDR *b)
Definition system.cpp:958
void net_init()
Definition system.cpp:2100
int net_socket_read_wait(NETSOCKET sock, std::chrono::nanoseconds nanoseconds)
Definition system.cpp:2701
int net_addr_from_str(NETADDR *addr, const char *string)
Definition system.cpp:1307
int net_addr_comp(const NETADDR *a, const NETADDR *b)
Definition system.cpp:920
struct sockaddr_un UNIXSOCKETADDR
Definition system.h:567
struct NETSOCKET_INTERNAL * NETSOCKET
Definition types.h:42
bool net_addr_is_local(const NETADDR *addr)
Definition system.cpp:1293
void net_addr_str(const NETADDR *addr, char *string, int max_length, bool add_port)
Definition system.cpp:1035
int net_tcp_connect_non_blocking(NETSOCKET sock, NETADDR bindaddr)
Definition system.cpp:2026
int net_tcp_listen(NETSOCKET sock, int backlog)
Definition system.cpp:1947
int net_tcp_accept(NETSOCKET sock, NETSOCKET *new_sock, NETADDR *addr)
Definition system.cpp:1961
int net_tcp_connect(NETSOCKET sock, const NETADDR *addr)
Definition system.cpp:2003
NETSOCKET net_tcp_create(NETADDR bindaddr)
Definition system.cpp:1871
int net_tcp_send(NETSOCKET sock, const void *data, int size)
Definition system.cpp:2034
int net_tcp_recv(NETSOCKET sock, void *data, int maxsize)
Definition system.cpp:2050
void net_tcp_close(NETSOCKET sock)
Definition system.cpp:2066
NETSOCKET net_udp_create(NETADDR bindaddr)
Definition system.cpp:1511
void net_udp_close(NETSOCKET sock)
Definition system.cpp:1866
int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size)
Definition system.cpp:1621
int net_udp_recv(NETSOCKET sock, NETADDR *addr, unsigned char **data)
Definition system.cpp:1765
int net_unix_send(UNIXSOCKET sock, UNIXSOCKETADDR *addr, void *data, int size)
Definition system.cpp:2117
void net_unix_set_addr(UNIXSOCKETADDR *addr, const char *path)
Definition system.cpp:2122
UNIXSOCKET net_unix_create_unnamed()
Definition system.cpp:2112
void net_unix_close(UNIXSOCKET sock)
Definition system.cpp:2129
void secure_random_password(char *buffer, unsigned length, unsigned pw_length)
Definition system.cpp:3164
void generate_password(char *buffer, unsigned length, const unsigned short *random, unsigned random_length)
Definition system.cpp:3144
void secure_random_fill(void *bytes, unsigned length)
Definition system.cpp:3180
int secure_rand_below(int below)
Definition system.cpp:3206
void sphore_signal(SEMAPHORE *sem)
Definition system.cpp:863
void sphore_destroy(SEMAPHORE *sem)
Definition system.cpp:867
void sphore_init(SEMAPHORE *sem)
Definition system.cpp:850
void sphore_wait(SEMAPHORE *sem)
Definition system.cpp:854
bool os_version_str(char *version, size_t length)
Definition system.cpp:3222
int kill_process(PROCESS process)
Definition system.cpp:3020
PROCESS shell_execute(const char *file, EShellExecuteWindowState window_state, const char **arguments=nullptr, size_t num_arguments=0)
Definition system.cpp:2960
bool is_process_alive(PROCESS process)
Definition system.cpp:3040
EShellExecuteWindowState
Definition system.h:1444
int open_link(const char *link)
Definition system.cpp:3053
void cmdline_free(int argc, const char **argv)
Definition system.cpp:2951
void os_locale_str(char *locale, size_t length)
Definition system.cpp:3301
void cmdline_fix(int *argc, const char ***argv)
Definition system.cpp:2913
int open_file(const char *path)
Definition system.cpp:3093
int pid()
Definition system.cpp:2904
pid_t PROCESS
Definition types.h:118
@ BACKGROUND
Definition system.h:1453
@ FOREGROUND
Definition system.h:1448
int str_utf8_tolower_codepoint(int code)
Definition tolower.cpp:3
int str_utf32_dist_buffer(const int *a, int a_len, const int *b, int b_len, int *buf, int buf_len)
Definition system.cpp:2827
int str_format_v(char *buffer, int buffer_size, const char *format, va_list args)
Definition system.cpp:2762
int str_utf8_comp_confusable(const char *str1, const char *str2)
Definition confusables.cpp:83
int str_utf8_dist_buffer(const char *a, const char *b, int *buf, int buf_len)
Definition system.cpp:2863
void thread_wait(void *thread)
Definition system.cpp:763
void * thread_init(void(*threadfunc)(void *), void *user, const char *name)
Definition system.cpp:718
void thread_yield()
Definition system.cpp:775
void thread_init_and_detach(void(*threadfunc)(void *), void *user, const char *name)
Definition system.cpp:797
void thread_detach(void *thread)
Definition system.cpp:786
void * IOHANDLE
Definition logger.h:12
Definition system.cpp:387
void * thread
Definition system.cpp:391
unsigned char * buffer
Definition system.cpp:393
IOHANDLE io
Definition system.cpp:389
Definition types.h:72
Definition types.h:92
void swap_endian(void *data, unsigned elem_size, unsigned num)
Definition system.cpp:2675
int str_utf8_dist(const char *a, const char *b)
Definition system.cpp:2807
void uint_to_bytes_be(unsigned char *bytes, unsigned value)
Definition system.cpp:2896
int str_format_int(char *buffer, size_t buffer_size, int value)
Definition system.cpp:2775
int str_format_opt(char *buffer, int buffer_size, const char *format, Args... args)
Definition system.h:1008
void net_stats(NETSTATS *stats)
Definition system.cpp:2883
int net_set_blocking(NETSOCKET sock)
Definition system.cpp:1942
sem_t SEMAPHORE
Definition system.h:522
#define str_format
Definition system.h:1027
unsigned bytes_be_to_uint(const unsigned char *bytes)
Definition system.cpp:2891
int str_utf8_to_skeleton(const char *str, int *buf, int buf_len)
Definition confusables.cpp:66
int(* FS_LISTDIR_CALLBACK_FILEINFO)(const CFsFileInfo *info, int is_dir, int dir_type, void *user)
Definition types.h:37
int(* FS_LISTDIR_CALLBACK)(const char *name, int is_dir, int dir_type, void *user)
Definition types.h:28
float length(const vector2_base< T > &a)
Definition vmath.h:106