void wi_dictionary_initialize(void) { _wi_dictionary_buckets_per_page = wi_page_size() / sizeof(_wi_dictionary_bucket_t); #ifndef _WI_DICTIONARY_USE_QSORT_R _wi_dictionary_sort_lock = wi_lock_init(wi_lock_alloc()); #endif }
void wd_transfers_init(void) { wd_transfer_runtime_id = wi_runtime_register_class(&wd_transfer_runtime_class); wd_transfers = wi_array_init(wi_mutable_array_alloc()); wd_transfers_update_queue_lock = wi_lock_init(wi_lock_alloc()); }
void wi_array_initialize(void) { _wi_array_items_per_page = wi_page_size() / sizeof(_wi_array_item_t); #ifndef HAVE_QSORT_R _wi_array_sort_lock = wi_lock_init(wi_lock_alloc()); #endif }
wi_config_t * wi_config_init_with_path(wi_config_t *config, wi_string_t *path, wi_dictionary_t *types, wi_dictionary_t *defaults) { config->lock = wi_lock_init(wi_lock_alloc()); config->path = wi_retain(path); config->types = wi_retain(types); config->changes = wi_set_init(wi_mutable_set_alloc()); config->defaults = wi_retain(defaults); return config; }
void wi_uuid_initialize(void) { _wi_uuid_clock_lock = wi_lock_init(wi_lock_alloc()); if(!_wi_uuid_get_node(_wi_uuid_node)) { _wi_uuid_get_random_buffer(_wi_uuid_node, sizeof(_wi_uuid_node)); _wi_uuid_node[0] |= 0x01; } }
static wd_transfer_t * wd_transfer_init_with_user(wd_transfer_t *transfer, wd_user_t *user) { transfer->state = WD_TRANSFER_QUEUED; transfer->queue_time = wi_time_interval(); transfer->user = wi_retain(user); transfer->hash = wi_retain(wi_data_sha1(wi_data_with_random_bytes(1024))); transfer->socket_lock = wi_lock_init(wi_lock_alloc()); transfer->state_lock = wi_condition_lock_init_with_condition(wi_condition_lock_alloc(), transfer->state); transfer->fd = -1; return transfer; }
void wt_init_servers(void) { wt_server_runtime_id = wi_runtime_register_class(&wt_server_runtime_class); wt_servers = wi_list_init(wi_list_alloc()); wt_servers_lock = wi_lock_init(wi_lock_alloc()); wt_servers_timer = wi_timer_init_with_function(wi_timer_alloc(), wt_update_servers, WT_SERVERS_UPDATE_INTERVAL, true); }
void wd_users_init(void) { wd_user_runtime_id = wi_runtime_register_class(&wd_user_runtime_class); wd_users = wi_dictionary_init(wi_dictionary_alloc()); wd_users_uid_lock = wi_lock_init(wi_lock_alloc()); wd_users_timer = wi_timer_init_with_function(wi_timer_alloc(), wd_users_update_idle, WD_USERS_TIMER_INTERVAL, true); }
void wd_transfers_initialize(void) { wd_transfer_runtime_id = wi_runtime_register_class(&wd_transfer_runtime_class); wd_transfers = wi_array_init(wi_mutable_array_alloc()); wd_transfers_status_lock = wi_lock_init(wi_lock_alloc()); wd_transfers_user_downloads = wi_dictionary_init_with_capacity_and_callbacks(wi_mutable_dictionary_alloc(), 0, wi_dictionary_default_key_callbacks, wi_dictionary_null_value_callbacks); wd_transfers_user_uploads = wi_dictionary_init_with_capacity_and_callbacks(wi_mutable_dictionary_alloc(), 0, wi_dictionary_default_key_callbacks, wi_dictionary_null_value_callbacks); wd_transfers_queue_lock = wi_condition_lock_init_with_condition(wi_condition_lock_alloc(), 0); }
static wd_user_t * wd_user_init_with_socket(wd_user_t *user, wi_socket_t *socket) { wi_address_t *address; user->uid = wd_user_next_uid(); user->socket = wi_retain(socket); user->state = WD_USER_CONNECTED; user->login_time = wi_time_interval(); user->idle_time = user->login_time; address = wi_socket_address(socket); user->ip = wi_retain(wi_address_string(address)); user->host = wi_retain(wi_address_hostname(address)); user->user_lock = wi_recursive_lock_init(wi_recursive_lock_alloc()); user->socket_lock = wi_lock_init(wi_lock_alloc()); user->transfers_queue = wi_array_init(wi_array_alloc()); return user; }
void wi_socket_initialize(void) { #ifdef HAVE_OPENSSL_SSL_H #ifdef WI_PTHREADS wi_lock_t *lock; wi_uinteger_t i, count; #endif SSL_library_init(); #ifdef WI_PTHREADS count = CRYPTO_num_locks(); _wi_socket_ssl_locks = wi_array_init_with_capacity(wi_array_alloc(), count); for(i = 0; i < count; i++) { lock = wi_lock_init(wi_lock_alloc()); wi_array_add_data(_wi_socket_ssl_locks, lock); wi_release(lock); } CRYPTO_set_id_callback(_wi_socket_ssl_id_function); CRYPTO_set_locking_callback(_wi_socket_ssl_locking_function); #endif #endif }
void wi_uuid_initialize(void) { struct timeval tv; uint32_t i; _wi_uuid_clock_lock = wi_lock_init(wi_lock_alloc()), _wi_uuid_random_fd = open("/dev/urandom", O_RDONLY); if(_wi_uuid_random_fd < 0) _wi_uuid_random_fd = open("/dev/random", O_RDONLY | O_NONBLOCK); gettimeofday(&tv, NULL); _WI_UUID_SRANDOM((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec); for(i = (tv.tv_sec ^ tv.tv_usec) & 0x1F; i > 0; i--) _WI_UUID_RANDOM(); if(!_wi_uuid_get_node(_wi_uuid_node)) { _wi_uuid_get_random_buffer(_wi_uuid_node, sizeof(_wi_uuid_node)); _wi_uuid_node[0] |= 0x01; } }
void wi_string_initialize(void) { _wi_string_constant_string_lock = wi_lock_init(wi_lock_alloc()); _wi_string_constant_string_table = wi_dictionary_init_with_capacity_and_callbacks(wi_mutable_dictionary_alloc(), 2000, wi_dictionary_null_key_callbacks, wi_dictionary_default_value_callbacks); }
int main(int argc, const char **argv) { wi_mutable_array_t *arguments; wi_pool_t *pool; wi_string_t *string, *root_path; int ch, facility; wi_boolean_t test_config, daemonize, change_directory, switch_user; /* init libwired */ wi_initialize(); wi_load(argc, argv); pool = wi_pool_init(wi_pool_alloc()); wi_log_syslog = true; wi_log_syslog_facility = LOG_DAEMON; /* init core systems */ wt_version_init(); wt_status_lock = wi_lock_init(wi_lock_alloc()); wt_start_date = wi_date_init(wi_date_alloc()); /* set defaults */ root_path = WI_STR(WT_ROOT); wi_settings_config_path = wi_string_init_with_cstring(wi_string_alloc(), WT_CONFIG_PATH); test_config = false; daemonize = true; change_directory = true; switch_user = true; /* init reexec argument list */ arguments = wi_array_init(wi_mutable_array_alloc()); /* parse command line switches */ while((ch = getopt(argc, (char * const *) argv, "46Dd:f:hi:L:ls:tuVvXx")) != -1) { switch(ch) { case '4': wt_address_family = WI_ADDRESS_IPV4; break; case '6': wt_address_family = WI_ADDRESS_IPV6; break; case 'D': daemonize = false; wi_log_stderr = true; break; case 'd': root_path = wi_string_with_cstring(optarg); break; case 'f': wi_release(wi_settings_config_path); wi_settings_config_path = wi_string_init_with_cstring(wi_string_alloc(), optarg); break; case 'i': wi_log_limit = wi_string_uint32(wi_string_with_cstring(optarg)); break; case 'L': wi_log_syslog = false; wi_log_file = true; wi_release(wi_log_path); wi_log_path = wi_string_init_with_cstring(wi_string_alloc(), optarg); break; case 'l': wi_log_level++; break; case 's': string = wi_string_with_cstring(optarg); facility = wi_log_syslog_facility_with_name(string); if(facility < 0) wi_log_fatal(WI_STR("Could not find syslog facility \"%@\": %m"), string); wi_log_syslog_facility = facility; break; case 't': test_config = true; break; case 'u': break; case 'V': case 'v': wt_version(); break; case 'X': daemonize = false; break; case 'x': daemonize = false; change_directory = false; switch_user = false; break; case '?': case 'h': default: wt_usage(); break; } wi_mutable_array_add_data(arguments, wi_string_with_format(WI_STR("-%c"), ch)); if(optarg) wi_mutable_array_add_data(arguments, wi_string_with_cstring(optarg)); } /* detach */ if(daemonize) { wi_mutable_array_add_data(arguments, WI_STR("-X")); switch(wi_fork()) { case -1: wi_log_fatal(WI_STR("Could not fork: %m")); break; case 0: if(!wi_execv(wi_string_with_cstring(argv[0]), arguments)) wi_log_fatal(WI_STR("Could not execute %s: %m"), argv[0]); break; default: _exit(0); break; } } wi_release(arguments); /* change directory */ if(change_directory) { if(!wi_fs_change_directory(root_path)) wi_log_error(WI_STR("Could not change directory to %@: %m"), root_path); } /* open log */ wi_log_open(); /* init subsystems */ wt_ssl_init(); wt_clients_init(); wt_servers_init(); /* read the config file */ wt_settings_init(); if(!wt_settings_read_config()) exit(1); /* apply settings */ wt_settings_apply_settings(); if(test_config) { printf("Config OK\n"); exit(0); } /* dump command line */ wi_log_info(WI_STR("Started as %@ %@"), wi_process_path(wi_process()), wi_array_components_joined_by_string(wi_process_arguments(wi_process()), WI_STR(" "))); /* init tracker */ wi_log_info(WI_STR("Starting Wired Tracker version %@"), wt_version_string); wt_tracker_init(); /* switch user/group */ if(switch_user) wi_switch_user(wt_settings.user, wt_settings.group); /* create tracker threads after privilege drop */ wt_signals_init(); wt_block_signals(); wt_servers_schedule(); wt_tracker_create_threads(); wt_write_pid(); wt_write_status(true); /* clean up pool after startup */ wi_pool_drain(pool); /* enter the signal handling thread in the main thread */ wt_signal_thread(NULL); /* dropped out */ wt_cleanup(); wi_log_close(); wi_release(pool); return 0; }
void wi_log_initialize(void) { _wi_log_lock = wi_lock_init(wi_lock_alloc()); }
static wd_tracker_t * wd_tracker_init(wd_tracker_t *tracker) { tracker->register_lock = wi_lock_init(wi_lock_alloc()); return tracker; }
void wi_pool_initialize(void) { _wi_pool_stacks_lock = wi_lock_init(wi_lock_alloc()); }
int main(int argc, const char **argv) { wi_pool_t *pool; wi_string_t *string; int ch, facility; wi_boolean_t no_chroot, test_config; /* init libwired */ wi_initialize(); wi_load(argc, argv); pool = wi_pool_init(wi_pool_alloc()); wi_log_startup = true; wi_log_syslog = true; wi_log_syslog_facility = LOG_DAEMON; /* init core systems */ wt_init_version(); wt_status_lock = wi_lock_init(wi_lock_alloc()); wt_start_date = wi_date_init(wi_date_alloc()); /* set defaults */ wi_root_path = wi_string_init_with_cstring(wi_string_alloc(), WT_ROOT); wi_settings_config_path = wi_string_init_with_cstring(wi_string_alloc(), WT_CONFIG_PATH); no_chroot = false; test_config = false; /* parse command line switches */ while((ch = getopt(argc, (char * const *) argv, "46Dd:f:hi:L:ls:tuVv")) != -1) { switch(ch) { case '4': wt_address_family = WI_ADDRESS_IPV4; break; case '6': wt_address_family = WI_ADDRESS_IPV6; break; case 'D': wt_daemonize = false; wi_log_stderr = true; break; case 'd': wi_release(wi_root_path); wi_root_path = wi_string_init_with_cstring(wi_string_alloc(), optarg); break; case 'f': wi_release(wi_settings_config_path); wi_settings_config_path = wi_string_init_with_cstring(wi_string_alloc(), optarg); break; case 'i': wi_log_limit = wi_string_uint32(wi_string_with_cstring(optarg)); break; case 'L': wi_log_syslog = false; wi_log_file = true; wi_release(wi_log_path); wi_log_path = wi_string_init_with_cstring(wi_string_alloc(), optarg); break; case 'l': wi_log_level++; break; case 's': string = wi_string_with_cstring(optarg); facility = wi_log_syslog_facility_with_name(string); if(facility < 0) { wi_log_err(WI_STR("Could not find syslog facility \"%@\": %m"), string); } wi_log_syslog_facility = facility; break; case 't': test_config = true; break; case 'u': no_chroot = true; break; case 'V': case 'v': wt_version(); break; case '?': case 'h': default: wt_usage(); break; } } /* open log */ wi_log_open(); /* init subsystems */ wt_init_ssl(); wt_init_clients(); wt_init_servers(); /* read the config file */ wt_settings_chroot = !no_chroot; wt_init_settings(); if(!wt_read_config()) exit(1); /* change root directory */ if(!no_chroot) { if(!wi_change_root()) wi_log_err(WI_STR("Could not change root to %@: %m"), wi_root_path); } /* apply config */ wt_apply_config(); if(test_config) { printf("Config OK\n"); exit(0); } /* dump command line */ if(wi_log_level >= WI_LOG_DEBUG) { wi_log_debug(WI_STR("Started as %@ %@"), wi_process_path(wi_process()), wi_array_components_joined_by_string(wi_process_arguments(wi_process()), WI_STR(" "))); } /* init tracker */ wi_log_info(WI_STR("Starting Wired Tracker version %@"), wt_version_string); wt_init_tracker(); /* detach (don't chdir, don't close i/o channels) */ if(wt_daemonize) { if(!wi_daemon()) wi_log_err(WI_STR("Could not become a daemon: %m")); } /* switch user/group */ wi_switch_user(wt_settings.user, wt_settings.group); /* create tracker threads after privilege drop */ wt_init_signals(); wt_block_signals(); wt_schedule_servers(); wt_fork_tracker(); wt_write_pid(); wt_write_status(true); wi_log_startup = false; wi_release(pool); pool = wi_pool_init(wi_pool_alloc()); /* enter the signal handling thread in the main thread */ wt_signal_thread(NULL); /* dropped out */ wt_cleanup(); wi_log_close(); wi_release(pool); return 0; }