diff options
-rw-r--r-- | changes/bug32883 | 5 | ||||
-rw-r--r-- | src/app/main/main.c | 22 | ||||
-rw-r--r-- | src/app/main/ntmain.c | 52 | ||||
-rw-r--r-- | src/app/main/ntmain.h | 3 | ||||
-rw-r--r-- | src/feature/api/tor_api_internal.h | 5 |
5 files changed, 40 insertions, 47 deletions
diff --git a/changes/bug32883 b/changes/bug32883 new file mode 100644 index 0000000000..6a15e0221b --- /dev/null +++ b/changes/bug32883 @@ -0,0 +1,5 @@ + o Code simplification and refactoring (windows services): + - The windows service logic now uses the tor_api.h entry points, to + avoid needless code duplication, and to prevent bugs related to + the different entry points getting out of sync. Closes ticket + 32883. diff --git a/src/app/main/main.c b/src/app/main/main.c index 427c75fbc3..36f85c6a40 100644 --- a/src/app/main/main.c +++ b/src/app/main/main.c @@ -1238,15 +1238,10 @@ tor_run_main(const tor_main_configuration_t *tor_cfg) memcpy(argv + tor_cfg->argc, tor_cfg->argv_owned, tor_cfg->argc_owned*sizeof(char*)); -#ifdef NT_SERVICE - { - int done = 0; - result = nt_service_parse_options(argc, argv, &done); - if (done) { - goto done; - } - } -#endif /* defined(NT_SERVICE) */ + int done = 0; + result = nt_service_parse_options(argc, argv, &done); + if (done) + goto done; pubsub_install(); @@ -1279,11 +1274,16 @@ tor_run_main(const tor_main_configuration_t *tor_cfg) #endif } + if (tor_cfg->run_tor_only && get_options()->command != CMD_RUN_TOR) { + log_err(LD_CONFIG, "Unsupported command when running as an NT service."); + result = -1; + tor_cleanup(); + goto done; + } + switch (get_options()->command) { case CMD_RUN_TOR: -#ifdef NT_SERVICE nt_service_set_state(SERVICE_RUNNING); -#endif result = run_tor_main_loop(); break; case CMD_KEYGEN: diff --git a/src/app/main/ntmain.c b/src/app/main/ntmain.c index ced158e686..96da1690f2 100644 --- a/src/app/main/ntmain.c +++ b/src/app/main/ntmain.c @@ -29,6 +29,8 @@ #include "lib/evloop/compat_libevent.h" #include "lib/fs/winlib.h" #include "lib/log/win32err.h" +#include "feature/api/tor_api.h" +#include "feature/api/tor_api_internal.h" #include <windows.h> #define GENSRV_SERVICENAME "tor" @@ -263,7 +265,6 @@ nt_service_control(DWORD request) static void nt_service_body(int argc, char **argv) { - int r; (void) argc; /* unused */ (void) argv; /* unused */ nt_service_loadlibrary(); @@ -283,24 +284,20 @@ nt_service_body(int argc, char **argv) return; } - r = tor_init(backup_argc, backup_argv); - if (r) { - /* Failed to start the Tor service */ - r = NT_SERVICE_ERROR_TORINIT_FAILED; - service_status.dwCurrentState = SERVICE_STOPPED; - service_status.dwWin32ExitCode = r; - service_status.dwServiceSpecificExitCode = r; - service_fns.SetServiceStatus_fn(hStatus, &service_status); + tor_main_configuration_t *cfg = tor_main_configuration_new(); + cfg->run_tor_only = 1; + if (tor_main_configuration_set_command_line(cfg, backup_argc, + backup_argv) < 0) return; - } /* Set the service's status to SERVICE_RUNNING and start the main * event loop */ service_status.dwCurrentState = SERVICE_RUNNING; service_fns.SetServiceStatus_fn(hStatus, &service_status); - set_main_thread(); - run_tor_main_loop(); - tor_cleanup(); + + tor_run_main(cfg); + + tor_main_configuration_free(cfg); } /** Main service entry point. Starts the service control dispatcher and waits @@ -323,29 +320,14 @@ nt_service_main(void) printf("Service error %d : %s\n", (int) result, errmsg); tor_free(errmsg); if (result == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { - if (tor_init(backup_argc, backup_argv)) + tor_main_configuration_t *cfg = tor_main_configuration_new(); + cfg->run_tor_only = 1; + if (tor_main_configuration_set_command_line(cfg, backup_argc, + backup_argv) < 0) return; - switch (get_options()->command) { - case CMD_RUN_TOR: - run_tor_main_loop(); - break; - case CMD_LIST_FINGERPRINT: - case CMD_HASH_PASSWORD: - case CMD_VERIFY_CONFIG: - case CMD_DUMP_CONFIG: - case CMD_KEYGEN: - case CMD_KEY_EXPIRATION: - log_err(LD_CONFIG, "Unsupported command (--list-fingerprint, " - "--hash-password, --keygen, --dump-config, --verify-config, " - "or --key-expiration) in NT service."); - break; - case CMD_RUN_UNITTESTS: - case CMD_IMMEDIATE: - default: - log_err(LD_CONFIG, "Illegal command number %d: internal error.", - get_options()->command); - } - tor_cleanup(); + + tor_run_main(cfg); + tor_main_configuration_free(cfg); } } } diff --git a/src/app/main/ntmain.h b/src/app/main/ntmain.h index 7a03c0de71..c2d6e23da7 100644 --- a/src/app/main/ntmain.h +++ b/src/app/main/ntmain.h @@ -22,7 +22,8 @@ int nt_service_is_stopping(void); void nt_service_set_state(DWORD state); #else #define nt_service_is_stopping() 0 +#define nt_service_parse_options(a, b, c) (0) +#define nt_service_set_state(s) STMT_NIL #endif /* defined(NT_SERVICE) */ #endif /* !defined(TOR_NTMAIN_H) */ - diff --git a/src/feature/api/tor_api_internal.h b/src/feature/api/tor_api_internal.h index d52b2caf44..ef06cd7e6f 100644 --- a/src/feature/api/tor_api_internal.h +++ b/src/feature/api/tor_api_internal.h @@ -29,6 +29,11 @@ struct tor_main_configuration_t { /** Socket that Tor will use as an owning control socket. Owned. */ tor_socket_t owning_controller_socket; + + /** Disable commands other than "run tor". Not for use from outside Tor + * itself; if you need to use this for embedding, please contact the tor + * developers. */ + int run_tor_only; }; #endif /* !defined(TOR_API_INTERNAL_H) */ |