immediately when we daemonize.
also drop our retry period for hidserv desc uploads from 10m to 5m
svn:r2111
if(tor_socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) {
log(LOG_ERR, "Couldn't construct socketpair: %s",
tor_socket_strerror(tor_socket_errno(-1)));
+ tor_cleanup();
exit(1);
}
for(i=0; i < smartlist_len(rl->routers); i++) {
router = smartlist_get(rl->routers, i);
+ /* Note: this posts our descriptor to ourselves, if we're an
+ * authdirserver. But I think that's ok. */
if(router->is_trusted_dir)
directory_initiate_command(router, purpose, payload, payload_len);
}
/* use a new copy of the dir, since get_dir_from_string scribbles on it */
if (router_load_routerlist_from_directory(new_directory, get_identity_key())) {
log_fn(LOG_ERR, "We just generated a directory we can't parse. Dying.");
+ tor_cleanup();
exit(0);
}
free(new_directory);
if(tor_socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) {
log(LOG_ERR, "Couldn't construct socketpair: %s",
tor_socket_strerror(tor_socket_errno(-1)));
+ tor_cleanup();
exit(1);
}
*/
if(shutting_down && shutting_down <= now) {
log(LOG_NOTICE,"Clean shutdown finished. Exiting.");
+ tor_cleanup();
exit(0);
}
/* first, reload config variables, in case they've changed */
/* no need to provide argc/v, they've been cached inside init_from_config */
if (init_from_config(0, NULL) < 0) {
+ tor_cleanup();
exit(1);
}
/* reload keys as needed for rendezvous services. */
if (rend_service_load_keys()<0) {
log_fn(LOG_ERR,"Error reloading rendezvous service keys");
+ tor_cleanup();
exit(1);
}
if(retry_all_listeners() < 0) {
if(please_shutdown) {
if(!server_mode()) { /* do it now */
log(LOG_NOTICE,"Interrupt: exiting cleanly.");
+ tor_cleanup();
exit(0);
}
if(shutting_down) { /* we've already been asked. do it now. */
log(LOG_NOTICE,"Second sigint received; exiting now.");
+ tor_cleanup();
exit(0);
} else {
log(LOG_NOTICE,"Interrupt: will shut down in %d seconds. Interrupt again to exit now.", SHUTDOWN_WAIT_LENGTH);
// case SIGABRT:
case SIGTERM:
log(LOG_ERR,"Catching signal %d, exiting cleanly.", the_signal);
+ tor_cleanup();
exit(0);
case SIGINT:
please_shutdown = 1;
/** Called before we make any calls to network-related functions.
* (Some operating systems require their network libraries to be
* initialized.) */
-int network_init(void)
+static int network_init(void)
{
#ifdef MS_WINDOWS
/* This silly exercise is necessary before windows will allow gethostbyname to work.
*/
void exit_function(void)
{
- /* Remove our pid file. We don't care if there was an error when we
- * unlink, nothing we could do about it anyways. */
- if(options.PidFile)
- unlink(options.PidFile);
+/* XXX if we ever daemonize, this gets called immediately */
#ifdef MS_WINDOWS
WSACleanup();
#endif
/** Main entry point for the Tor command-line client.
*/
-int tor_init(int argc, char *argv[]) {
+static int tor_init(int argc, char *argv[]) {
/* give it somewhere to log to initially */
add_temp_log();
return 0;
}
+/** Do whatever cleanup is necessary before shutting Tor down. */
void tor_cleanup(void) {
+ /* Remove our pid file. We don't care if there was an error when we
+ * unlink, nothing we could do about it anyways. */
+ if(options.PidFile)
+ unlink(options.PidFile);
crypto_global_cleanup();
}
service_status.dwCurrentState = SERVICE_STOPPED;
return;
}
- SetServiceStatus(hStatus, &service_status);
+ SetServiceStatus(hStatus, &service_status);
}
void nt_service_body(int argc, char **argv)
int advertised_server_mode(void);
int proxy_mode(void);
-int main(int argc, char *argv[]);
+void tor_cleanup(void);
/********************************* onion.c ***************************/
#define NUM_INTRO_POINTS 3
/** If we can't build our intro circuits, don't retry for this long. */
-#define INTRO_CIRC_RETRY_PERIOD 60*10
+#define INTRO_CIRC_RETRY_PERIOD 60*5
/** Don't try to build more than this many circuits before giving up
* for a while.*/
#define MAX_INTRO_CIRCS_PER_PERIOD 10
return -1;
} else {
fflush(0);
+ tor_cleanup();
exit(0);
return -1; /* never reached */
}
}
-/** Parse a directory from <b>s</b> and, when done, store the
+/** Parse a directory from <b>str</b> and, when done, store the
* resulting routerlist in *<b>dest</b>, freeing the old value if necessary.
* If <b>pkey</b> is provided, we check the directory signature with pkey.
*/
test_eq(1, is_obsolete_version("0.0.2", "Tor 0.0.2pre1,Tor 0.0.3"));
test_eq(0, is_obsolete_version("0.1.0", "Tor 0.0.2,Tor 0.0.3"));
test_eq(0, is_obsolete_version("0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"));
+ test_eq(0, is_obsolete_version("0.0.5", "0.0.5-cvs"));
+ test_eq(0, is_obsolete_version("0.0.5.1-cvs", "0.0.5"));
}
void test_rend_fns()