lib: Add global config namespace
This commit is contained in:
parent
4f8bd6d404
commit
34d3bfcf14
|
@ -556,7 +556,7 @@ int main(int argc, char *argv[])
|
||||||
ctx.in = stdin;
|
ctx.in = stdin;
|
||||||
ctx.out = stdout;
|
ctx.out = stdout;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "aes-test");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
|
|
|
@ -26,7 +26,7 @@ int main(int argc, char *argv[])
|
||||||
int i = 0, limit = 0;
|
int i = 0, limit = 0;
|
||||||
|
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "crypt_burn");
|
||||||
lib->plugins->load(lib->plugins, PLUGINS);
|
lib->plugins->load(lib->plugins, PLUGINS);
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,7 @@ int main(int argc, char *argv[])
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "dh_speed");
|
||||||
lib->plugins->load(lib->plugins, argv[1]);
|
lib->plugins->load(lib->plugins, argv[1]);
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ int main(int argc, char *argv[])
|
||||||
rr_set_t *rrset;
|
rr_set_t *rrset;
|
||||||
rr_t *rr;
|
rr_t *rr;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "dnssec");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
dbg = dbg_dnssec;
|
dbg = dbg_dnssec;
|
||||||
|
|
|
@ -35,7 +35,7 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
chunk_t res;
|
chunk_t res;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "fetch");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
lib->plugins->load(lib->plugins, PLUGINS);
|
lib->plugins->load(lib->plugins, PLUGINS);
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ int main(int argc, char *argv[])
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
int limit = 0, i = 0;
|
int limit = 0, i = 0;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "hash_burn");
|
||||||
lib->plugins->load(lib->plugins, PLUGINS);
|
lib->plugins->load(lib->plugins, PLUGINS);
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ int main(int argc, char *argv[])
|
||||||
char buf[8096];
|
char buf[8096];
|
||||||
int read;
|
int read;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "key2keyid");
|
||||||
lib->plugins->load(lib->plugins, PLUGINS);
|
lib->plugins->load(lib->plugins, PLUGINS);
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ int main(int argc, char *argv[])
|
||||||
char buf[8096];
|
char buf[8096];
|
||||||
int read, n;
|
int read, n;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "keyid2sql");
|
||||||
lib->plugins->load(lib->plugins, PLUGINS);
|
lib->plugins->load(lib->plugins, PLUGINS);
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ int main(int argc, char *argv[])
|
||||||
int sizes[16] = { 1, 13, 100, 1000, 16, 10000, 50, 17,
|
int sizes[16] = { 1, 13, 100, 1000, 16, 10000, 50, 17,
|
||||||
123, 32, 8, 64, 8096, 1024, 123, 9 };
|
123, 32, 8, 64, 8096, 1024, 123, 9 };
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "malloc_speed");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
print_mallinfo();
|
print_mallinfo();
|
||||||
|
|
|
@ -71,7 +71,7 @@ int main(int argc, char *argv[])
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "pubkey_speed");
|
||||||
lib->plugins->load(lib->plugins, argv[1]);
|
lib->plugins->load(lib->plugins, argv[1]);
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
|
|
|
@ -251,7 +251,7 @@ static void cleanup()
|
||||||
*/
|
*/
|
||||||
static void init()
|
static void init()
|
||||||
{
|
{
|
||||||
library_init(NULL);
|
library_init(NULL, "tls_test");
|
||||||
|
|
||||||
dbg = dbg_tls;
|
dbg = dbg_tls;
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ main(int argc, char *argv[])
|
||||||
const char **notice = copyright;
|
const char **notice = copyright;
|
||||||
const char **co;
|
const char **co;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "_copyright");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv, "", opts, NULL)) != EOF)
|
while ((opt = getopt_long(argc, argv, "", opts, NULL)) != EOF)
|
||||||
|
|
|
@ -322,7 +322,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
dbg = dbg_stderr;
|
dbg = dbg_stderr;
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "charon-cmd"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,7 +161,7 @@ int main(int argc, char *argv[])
|
||||||
dbg = dbg_syslog;
|
dbg = dbg_syslog;
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "charon-nm"))
|
||||||
{
|
{
|
||||||
library_deinit();
|
library_deinit();
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
|
|
|
@ -250,7 +250,7 @@ int main(int argc, char *argv[])
|
||||||
dbg = dbg_syslog;
|
dbg = dbg_syslog;
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, dmn_name))
|
||||||
{
|
{
|
||||||
library_deinit();
|
library_deinit();
|
||||||
exit(status);
|
exit(status);
|
||||||
|
|
|
@ -289,7 +289,7 @@ int main(int argc, char *argv[])
|
||||||
dbg = dbg_stderr;
|
dbg = dbg_stderr;
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "charon"))
|
||||||
{
|
{
|
||||||
library_deinit();
|
library_deinit();
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
|
|
|
@ -136,7 +136,7 @@ int main(int argc, char* argv[])
|
||||||
/* avoid confusing leak reports in build process */
|
/* avoid confusing leak reports in build process */
|
||||||
setenv("LEAK_DETECTIVE_DISABLE", "1", 0);
|
setenv("LEAK_DETECTIVE_DISABLE", "1", 0);
|
||||||
/* don't use a strongswan.conf, forces integrity check to disabled */
|
/* don't use a strongswan.conf, forces integrity check to disabled */
|
||||||
library_init("");
|
library_init("", "checksum_builder");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
integrity = integrity_checker_create(NULL);
|
integrity = integrity_checker_create(NULL);
|
||||||
|
|
|
@ -435,7 +435,7 @@ int main(int argc, char *argv[])
|
||||||
char *suite_file = "suite.conf", *test_file = NULL, *preload, *plugins;
|
char *suite_file = "suite.conf", *test_file = NULL, *preload, *plugins;
|
||||||
file_logger_t *logger;
|
file_logger_t *logger;
|
||||||
|
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "conftest"))
|
||||||
{
|
{
|
||||||
library_deinit();
|
library_deinit();
|
||||||
return SS_RC_LIBSTRONGSWAN_INTEGRITY;
|
return SS_RC_LIBSTRONGSWAN_INTEGRITY;
|
||||||
|
|
|
@ -774,7 +774,7 @@ void Init_dumm()
|
||||||
/* there are too many to report, rubyruby... */
|
/* there are too many to report, rubyruby... */
|
||||||
setenv("LEAK_DETECTIVE_DISABLE", "1", 1);
|
setenv("LEAK_DETECTIVE_DISABLE", "1", 1);
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "dumm");
|
||||||
|
|
||||||
dumm = dumm_create(NULL);
|
dumm = dumm_create(NULL);
|
||||||
|
|
||||||
|
|
|
@ -479,7 +479,7 @@ int main(int argc, char *argv[])
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
guest_t *guest;
|
guest_t *guest;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "dumm");
|
||||||
gtk_init(&argc, &argv);
|
gtk_init(&argc, &argv);
|
||||||
|
|
||||||
pages = linked_list_create();
|
pages = linked_list_create();
|
||||||
|
|
|
@ -600,7 +600,7 @@ JNI_METHOD(CharonVpnService, initializeCharon, jboolean,
|
||||||
dbg = dbg_android;
|
dbg = dbg_android;
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "charon"))
|
||||||
{
|
{
|
||||||
library_deinit();
|
library_deinit();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -133,7 +133,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
dbg = dbg_stderr;
|
dbg = dbg_stderr;
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "charon-xpc"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,7 +109,7 @@ bool libimcv_init(bool is_imv)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* we are the first to initialize libstrongswan */
|
/* we are the first to initialize libstrongswan */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "libimcv"))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,7 +288,7 @@ int main(int argc, char *argv[])
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "imv_policy_manager"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -466,12 +466,12 @@ int main(int argc, char *argv[])
|
||||||
atexit(cleanup);
|
atexit(cleanup);
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "pacman"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
if (!lib->plugins->load(lib->plugins,
|
if (!lib->plugins->load(lib->plugins,
|
||||||
lib->settings->get_str(lib->settings, "attest.load", "sqlite")))
|
lib->settings->get_str(lib->settings, "pacman.load", "sqlite")))
|
||||||
{
|
{
|
||||||
exit(SS_RC_INITIALIZATION_FAILED);
|
exit(SS_RC_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
|
|
|
@ -439,7 +439,7 @@ int main(int argc, char *argv[])
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "attest"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,6 +145,7 @@ void library_deinit()
|
||||||
threads_deinit();
|
threads_deinit();
|
||||||
backtrace_deinit();
|
backtrace_deinit();
|
||||||
|
|
||||||
|
free((void*)this->public.ns);
|
||||||
free(this);
|
free(this);
|
||||||
lib = NULL;
|
lib = NULL;
|
||||||
}
|
}
|
||||||
|
@ -234,7 +235,7 @@ static bool check_memwipe()
|
||||||
/*
|
/*
|
||||||
* see header file
|
* see header file
|
||||||
*/
|
*/
|
||||||
bool library_init(char *settings)
|
bool library_init(char *settings, const char *namespace)
|
||||||
{
|
{
|
||||||
private_library_t *this;
|
private_library_t *this;
|
||||||
printf_hook_t *pfh;
|
printf_hook_t *pfh;
|
||||||
|
@ -250,6 +251,7 @@ bool library_init(char *settings)
|
||||||
.public = {
|
.public = {
|
||||||
.get = _get,
|
.get = _get,
|
||||||
.set = _set,
|
.set = _set,
|
||||||
|
.ns = strdup(namespace ?: "libstrongswan"),
|
||||||
},
|
},
|
||||||
.ref = 1,
|
.ref = 1,
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/*
|
||||||
|
* Copyright (C) 2010-2014 Tobias Brunner
|
||||||
* Copyright (C) 2008 Martin Willi
|
* Copyright (C) 2008 Martin Willi
|
||||||
* Hochschule fuer Technik Rapperswil
|
* Hochschule fuer Technik Rapperswil
|
||||||
*
|
*
|
||||||
|
@ -139,6 +140,12 @@ struct library_t {
|
||||||
*/
|
*/
|
||||||
bool (*set)(library_t *this, char *name, void *object);
|
bool (*set)(library_t *this, char *name, void *object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Namespace used for settings etc. (i.e. the name of the binary that uses
|
||||||
|
* the library)
|
||||||
|
*/
|
||||||
|
const char *ns;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Printf hook registering facility
|
* Printf hook registering facility
|
||||||
*/
|
*/
|
||||||
|
@ -239,12 +246,17 @@ struct library_t {
|
||||||
* Initialize library, creates "lib" instance.
|
* Initialize library, creates "lib" instance.
|
||||||
*
|
*
|
||||||
* library_init() may be called multiple times in a single process, but each
|
* library_init() may be called multiple times in a single process, but each
|
||||||
* caller should call library_deinit() for each call to library_init().
|
* caller must call library_deinit() for each call to library_init().
|
||||||
|
*
|
||||||
|
* The settings and namespace arguments are only used on the first call.
|
||||||
*
|
*
|
||||||
* @param settings file to read settings from, may be NULL for default
|
* @param settings file to read settings from, may be NULL for default
|
||||||
|
* @param namespace name of the binary that uses the library, determines
|
||||||
|
* the first section name when reading config options.
|
||||||
|
* Defaults to libstrongswan if NULL.
|
||||||
* @return FALSE if integrity check failed
|
* @return FALSE if integrity check failed
|
||||||
*/
|
*/
|
||||||
bool library_init(char *settings);
|
bool library_init(char *settings, const char *namespace);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deinitialize library, destroys "lib" instance.
|
* Deinitialize library, destroys "lib" instance.
|
||||||
|
|
|
@ -65,7 +65,7 @@ static array_t *load_suites(test_configuration_t configs[],
|
||||||
bool old = FALSE;
|
bool old = FALSE;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "test-runner");
|
||||||
|
|
||||||
test_setup_handler();
|
test_setup_handler();
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ static bool call_fixture(test_case_t *tcase, bool up)
|
||||||
*/
|
*/
|
||||||
static bool pre_test(test_runner_init_t init)
|
static bool pre_test(test_runner_init_t init)
|
||||||
{
|
{
|
||||||
library_init(NULL);
|
library_init(NULL, "test-runner");
|
||||||
|
|
||||||
/* use non-blocking RNG to generate keys fast */
|
/* use non-blocking RNG to generate keys fast */
|
||||||
lib->settings->set_default_str(lib->settings,
|
lib->settings->set_default_str(lib->settings,
|
||||||
|
|
|
@ -34,7 +34,7 @@ int main (int arc, char *argv[])
|
||||||
bool debug;
|
bool debug;
|
||||||
int threads, timeout;
|
int threads, timeout;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "manager");
|
||||||
if (!lib->plugins->load(lib->plugins,
|
if (!lib->plugins->load(lib->plugins,
|
||||||
lib->settings->get_str(lib->settings, "manager.load", PLUGINS)))
|
lib->settings->get_str(lib->settings, "manager.load", PLUGINS)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,7 +33,7 @@ int main(int arc, char *argv[])
|
||||||
char *uri;
|
char *uri;
|
||||||
int timeout, threads;
|
int timeout, threads;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "medsrv");
|
||||||
if (!lib->plugins->load(lib->plugins,
|
if (!lib->plugins->load(lib->plugins,
|
||||||
lib->settings->get_str(lib->settings, "medsrv.load", PLUGINS)))
|
lib->settings->get_str(lib->settings, "medsrv.load", PLUGINS)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -229,7 +229,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "openac"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,7 @@ static void remove_callback()
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "pki"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1212,7 +1212,7 @@ int main(int argc, char *argv[])
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "pool"))
|
||||||
{
|
{
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,7 +166,7 @@ static void init()
|
||||||
PLUGIN_PROVIDE(CUSTOM, "pt-tls-client"),
|
PLUGIN_PROVIDE(CUSTOM, "pt-tls-client"),
|
||||||
PLUGIN_DEPENDS(CUSTOM, "tnccs-manager"),
|
PLUGIN_DEPENDS(CUSTOM, "tnccs-manager"),
|
||||||
};
|
};
|
||||||
library_init(NULL);
|
library_init(NULL, "pt-tls-client");
|
||||||
libtnccs_init();
|
libtnccs_init();
|
||||||
|
|
||||||
dbg = dbg_pt_tls;
|
dbg = dbg_pt_tls;
|
||||||
|
|
|
@ -487,7 +487,7 @@ int main(int argc, char **argv)
|
||||||
err_t ugh = NULL;
|
err_t ugh = NULL;
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
if (!library_init(NULL))
|
if (!library_init(NULL, "scepclient"))
|
||||||
{
|
{
|
||||||
library_deinit();
|
library_deinit();
|
||||||
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
|
||||||
|
|
|
@ -419,7 +419,7 @@ int main (int argc, char **argv)
|
||||||
bool attach_gdb = FALSE;
|
bool attach_gdb = FALSE;
|
||||||
bool load_warning = FALSE;
|
bool load_warning = FALSE;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "starter");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
libhydra_init("starter");
|
libhydra_init("starter");
|
||||||
|
|
|
@ -480,7 +480,7 @@ int main(int argc, char *argv[])
|
||||||
const stroke_token_t *token;
|
const stroke_token_t *token;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
library_init(NULL);
|
library_init(NULL, "stroke");
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
|
|
Loading…
Reference in New Issue