int dnscrypt_proxy_main(int argc, char *argv[]) { ProxyContext proxy_context; setvbuf(stdout, NULL, _IOLBF, BUFSIZ); stack_trace_on_crash(); #ifdef PLUGINS if ((app_context.dcps_context = plugin_support_context_new()) == NULL) { logger_noformat(NULL, LOG_ERR, "Unable to setup plugin support"); exit(2); } #endif if (proxy_context_init(&proxy_context, argc, argv) != 0) { logger_noformat(NULL, LOG_ERR, "Unable to start the proxy"); exit(1); } #ifdef PLUGINS if (plugin_support_context_load(app_context.dcps_context) != 0) { logger_noformat(NULL, LOG_ERR, "Unable to load plugins"); exit(2); } #endif app_context.proxy_context = &proxy_context; logger_noformat(&proxy_context, LOG_INFO, "Generating a new key pair"); dnscrypt_client_init_with_new_key_pair(&proxy_context.dnscrypt_client); logger_noformat(&proxy_context, LOG_INFO, "Done"); if (cert_updater_init(&proxy_context) != 0 || udp_listener_bind(&proxy_context) != 0 || tcp_listener_bind(&proxy_context) != 0) { exit(1); } #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif revoke_privileges(&proxy_context); if (cert_updater_start(&proxy_context) != 0) { exit(1); } if (skip_dispatch == 0) { event_base_dispatch(proxy_context.event_loop); } logger_noformat(&proxy_context, LOG_INFO, "Stopping proxy"); cert_updater_free(&proxy_context); udp_listener_stop(&proxy_context); tcp_listener_stop(&proxy_context); event_base_free(proxy_context.event_loop); #ifdef PLUGINS plugin_support_context_free(app_context.dcps_context); #endif proxy_context_free(&proxy_context); app_context.proxy_context = NULL; salsa20_random_close(); return 0; }
int main(int argc, char *argv[]) { ProxyContext proxy_context; uv_loop_t *event_loop = uv_loop_new(); stack_trace_on_crash(); proxy_context_init(&proxy_context, event_loop, argc, argv); app_context.proxy_context = &proxy_context; logger_noformat(&proxy_context, LOG_INFO, "Generating a new key pair"); dnscrypt_client_init_with_new_key_pair(&proxy_context.dnscrypt_client); logger_noformat(&proxy_context, LOG_INFO, "Done"); if (cert_updater_init(&proxy_context) != 0 || tcp_listener_bind(&proxy_context) != 0 || udp_listener_bind(&proxy_context) != 0) { exit(1); } signal(SIGPIPE, SIG_IGN); revoke_privileges(&proxy_context); if (cert_updater_start(&proxy_context) != 0) { exit(1); } uv_run(event_loop); logger_noformat(&proxy_context, LOG_INFO, "Stopping proxy"); cert_updater_stop(&proxy_context); tcp_listener_stop(&proxy_context); udp_listener_stop(&proxy_context); uv_loop_delete(event_loop); proxy_context_free(&proxy_context); alt_arc4random_close(); return 0; }