int _prelude_log_set_abort_level_from_string(const char *level) { size_t i; char *eptr; long lvalue; struct { const char *prefix; prelude_log_t level; } tbl[] = { { "CRIT", PRELUDE_LOG_CRIT }, { "ERR", PRELUDE_LOG_ERR }, { "WARN", PRELUDE_LOG_WARN }, { "INFO", PRELUDE_LOG_INFO }, { "DEBUG", PRELUDE_LOG_DEBUG } }; prelude_return_val_if_fail(level != NULL, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strncasecmp(tbl[i].prefix, level, strlen(tbl[i].prefix)) == 0 ) { _prelude_log_set_abort_level(tbl[i].level); return 0; } } lvalue = strtol(level, &eptr, 10); if ( eptr != (level + strlen(level)) || lvalue == LONG_MIN || lvalue == LONG_MAX ) { prelude_log(PRELUDE_LOG_WARN, "Invalid abort level specified: '%s'.\n", level); return -1; } _prelude_log_set_abort_level(lvalue); return 0; }
/** * prelude_init: * @argc: Address of the argc parameter of your main() function. * @argv: Address of the argv parameter of your main() function. * * Call this function before using any other Prelude functions in your applications. * It will initialize everything needed to operate the library and parses some standard * command line options. @argc and @argv are adjusted accordingly so your own code will * never see those standard arguments. * * Returns: 0 on success, a negative value if an error occured. */ int prelude_init(int *argc, char **argv) { int ret; const char *env; if ( libprelude_refcount++ > 0 ) return 0; env = getenv("LIBPRELUDE_DEBUG"); if ( env ) prelude_log_set_debug_level(atoi(env)); env = getenv("LIBPRELUDE_TLS_DEBUG"); if ( env ) { gnutls_global_set_log_level(atoi(env)); gnutls_global_set_log_function(tls_log_func); } env = getenv("LIBPRELUDE_LOGFILE"); if ( env ) prelude_log_set_logfile(env); env = getenv("LIBPRELUDE_PREFIX"); if ( env ) _prelude_prefix = strdup(env); env = getenv("LIBPRELUDE_ABORT"); if ( env ) { if ( *env ) _prelude_log_set_abort_level_from_string(env); else _prelude_log_set_abort_level(PRELUDE_LOG_CRIT); } prelude_thread_init(NULL); if ( ! getcwd(_prelude_init_cwd, sizeof(_prelude_init_cwd)) ) _prelude_init_cwd[0] = 0; ret = _prelude_timer_init(); if ( ret < 0 ) return ret; ret = glthread_atfork(prelude_fork_prepare, prelude_fork_parent, prelude_fork_child); if ( ret != 0 ) return prelude_error_from_errno(ret); slice_arguments(argc, argv); ret = gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_prelude); if ( ret < 0 ) return prelude_error_verbose(PRELUDE_ERROR_TLS, "gcrypt initialization failed: %s", gcry_strerror(ret)); ret = gnutls_global_init(); if ( ret < 0 ) return prelude_error_verbose(PRELUDE_ERROR_TLS, "TLS initialization failed: %s", gnutls_strerror(ret)); return 0; }