Update copyrights to 2021, using "make update-copyright"
[tor.git] / src / app / main / shutdown.c
bloba6065db5da149d64b3831d6277ca6c93f6955d9e
1 /* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
7 /**
8 * @file shutdown.c
9 * @brief Code to free global resources used by Tor.
11 * In the future, this should all be handled by the subsystem manager. */
13 #include "core/or/or.h"
15 #include "app/config/config.h"
16 #include "app/config/statefile.h"
17 #include "app/main/main.h"
18 #include "app/main/shutdown.h"
19 #include "app/main/subsysmgr.h"
20 #include "core/mainloop/connection.h"
21 #include "core/mainloop/mainloop_pubsub.h"
22 #include "core/or/channeltls.h"
23 #include "core/or/circuitlist.h"
24 #include "core/or/circuitmux_ewma.h"
25 #include "core/or/circuitpadding.h"
26 #include "core/or/connection_edge.h"
27 #include "core/or/dos.h"
28 #include "core/or/scheduler.h"
29 #include "feature/client/addressmap.h"
30 #include "feature/client/bridges.h"
31 #include "feature/client/entrynodes.h"
32 #include "feature/client/transports.h"
33 #include "feature/control/control.h"
34 #include "feature/control/control_auth.h"
35 #include "feature/dirauth/authmode.h"
36 #include "feature/dirauth/shared_random.h"
37 #include "feature/dircache/consdiffmgr.h"
38 #include "feature/dircache/dirserv.h"
39 #include "feature/dirparse/routerparse.h"
40 #include "feature/hibernate/hibernate.h"
41 #include "feature/hs/hs_common.h"
42 #include "feature/nodelist/microdesc.h"
43 #include "feature/nodelist/networkstatus.h"
44 #include "feature/nodelist/nodelist.h"
45 #include "feature/nodelist/routerlist.h"
46 #include "feature/relay/ext_orport.h"
47 #include "feature/relay/relay_config.h"
48 #include "feature/stats/bwhist.h"
49 #include "feature/stats/geoip_stats.h"
50 #include "feature/stats/rephist.h"
51 #include "lib/evloop/compat_libevent.h"
52 #include "lib/geoip/geoip.h"
54 void evdns_shutdown(int);
56 /** Do whatever cleanup is necessary before shutting Tor down. */
57 void
58 tor_cleanup(void)
60 const or_options_t *options = get_options();
61 if (options->command == CMD_RUN_TOR) {
62 time_t now = time(NULL);
63 /* Remove our pid file. We don't care if there was an error when we
64 * unlink, nothing we could do about it anyways. */
65 tor_remove_file(options->PidFile);
66 /* Remove control port file */
67 tor_remove_file(options->ControlPortWriteToFile);
68 /* Remove cookie authentication file */
70 char *cookie_fname = get_controller_cookie_file_name();
71 tor_remove_file(cookie_fname);
72 tor_free(cookie_fname);
74 /* Remove Extended ORPort cookie authentication file */
76 char *cookie_fname = get_ext_or_auth_cookie_file_name();
77 if (cookie_fname)
78 tor_remove_file(cookie_fname);
79 tor_free(cookie_fname);
81 if (accounting_is_enabled(options))
82 accounting_record_bandwidth_usage(now, get_or_state());
83 or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */
84 or_state_save(now);
85 if (authdir_mode(options)) {
86 sr_save_and_cleanup();
88 if (authdir_mode_tests_reachability(options))
89 rep_hist_record_mtbf_data(now, 0);
92 timers_shutdown();
94 tor_free_all(0); /* We could move tor_free_all back into the ifdef below
95 later, if it makes shutdown unacceptably slow. But for
96 now, leave it here: it's helped us catch bugs in the
97 past. */
100 /** Free all memory that we might have allocated somewhere.
101 * If <b>postfork</b>, we are a worker process and we want to free
102 * only the parts of memory that we won't touch. If !<b>postfork</b>,
103 * Tor is shutting down and we should free everything.
105 * Helps us find the real leaks with sanitizers and the like. Also valgrind
106 * should then report 0 reachable in its leak report (in an ideal world --
107 * in practice libevent, SSL, libc etc never quite free everything). */
108 void
109 tor_free_all(int postfork)
111 if (!postfork) {
112 evdns_shutdown(1);
114 geoip_free_all();
115 geoip_stats_free_all();
116 routerlist_free_all();
117 networkstatus_free_all();
118 addressmap_free_all();
119 dirserv_free_all();
120 rep_hist_free_all();
121 bwhist_free_all();
122 circuit_free_all();
123 circpad_machines_free();
124 entry_guards_free_all();
125 pt_free_all();
126 channel_tls_free_all();
127 channel_free_all();
128 connection_free_all();
129 connection_edge_free_all();
130 scheduler_free_all();
131 nodelist_free_all();
132 microdesc_free_all();
133 routerparse_free_all();
134 control_free_all();
135 bridges_free_all();
136 consdiffmgr_free_all();
137 hs_free_all();
138 dos_free_all();
139 circuitmux_ewma_free_all();
140 accounting_free_all();
141 circpad_free_all();
143 if (!postfork) {
144 config_free_all();
145 relay_config_free_all();
146 or_state_free_all();
148 if (!postfork) {
149 #ifndef _WIN32
150 tor_getpwnam(NULL);
151 #endif
153 /* stuff in main.c */
155 tor_mainloop_disconnect_pubsub();
157 if (!postfork) {
158 release_lockfile();
161 subsystems_shutdown();
163 /* Stuff in util.c and address.c*/
164 if (!postfork) {
165 esc_router_info(NULL);