statefile.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  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-2019, The Tor Project, Inc. */
  5. /* See LICENSE for licensing information */
  6. /**
  7. * \file statefile.c
  8. *
  9. * \brief Handles parsing and encoding the persistent 'state' file that carries
  10. * miscellaneous persistent state between Tor invocations.
  11. *
  12. * This 'state' file is a typed key-value store that allows multiple
  13. * entries for the same key. It follows the same metaformat as described
  14. * in confparse.c, and uses the same code to read and write itself.
  15. *
  16. * The state file is most suitable for small values that don't change too
  17. * frequently. For values that become very large, we typically use a separate
  18. * file -- for example, see how we handle microdescriptors, by storing them in
  19. * a separate file with a journal.
  20. *
  21. * The current state is accessed via get_or_state(), which returns a singleton
  22. * or_state_t object. Functions that change it should call
  23. * or_state_mark_dirty() to ensure that it will get written to disk.
  24. *
  25. * The or_state_save() function additionally calls various functioens
  26. * throughout Tor that might want to flush more state to the the disk,
  27. * including some in rephist.c, entrynodes.c, circuitstats.c, hibernate.c.
  28. */
  29. #define STATEFILE_PRIVATE
  30. #include "core/or/or.h"
  31. #include "core/or/circuitstats.h"
  32. #include "app/config/config.h"
  33. #include "app/config/confparse.h"
  34. #include "core/mainloop/mainloop.h"
  35. #include "core/mainloop/netstatus.h"
  36. #include "core/mainloop/connection.h"
  37. #include "feature/control/control_events.h"
  38. #include "feature/client/entrynodes.h"
  39. #include "feature/hibernate/hibernate.h"
  40. #include "feature/stats/rephist.h"
  41. #include "feature/relay/router.h"
  42. #include "feature/relay/routermode.h"
  43. #include "lib/sandbox/sandbox.h"
  44. #include "app/config/statefile.h"
  45. #include "lib/encoding/confline.h"
  46. #include "lib/net/resolve.h"
  47. #include "lib/version/torversion.h"
  48. #include "app/config/or_state_st.h"
  49. #ifdef HAVE_UNISTD_H
  50. #include <unistd.h>
  51. #endif
  52. /** A list of state-file "abbreviations," for compatibility. */
  53. static config_abbrev_t state_abbrevs_[] = {
  54. { "AccountingBytesReadInterval", "AccountingBytesReadInInterval", 0, 0 },
  55. { "HelperNode", "EntryGuard", 0, 0 },
  56. { "HelperNodeDownSince", "EntryGuardDownSince", 0, 0 },
  57. { "HelperNodeUnlistedSince", "EntryGuardUnlistedSince", 0, 0 },
  58. { "EntryNode", "EntryGuard", 0, 0 },
  59. { "EntryNodeDownSince", "EntryGuardDownSince", 0, 0 },
  60. { "EntryNodeUnlistedSince", "EntryGuardUnlistedSince", 0, 0 },
  61. { NULL, NULL, 0, 0},
  62. };
  63. /** dummy instance of or_state_t, used for type-checking its
  64. * members with CONF_CHECK_VAR_TYPE. */
  65. DUMMY_TYPECHECK_INSTANCE(or_state_t);
  66. #define VAR(varname,conftype,member,initvalue) \
  67. CONFIG_VAR_ETYPE(or_state_t, varname, conftype, member, 0, initvalue)
  68. #define V(member,conftype,initvalue) \
  69. VAR(#member, conftype, member, initvalue)
  70. /** Array of "state" variables saved to the ~/.tor/state file. */
  71. static const config_var_t state_vars_[] = {
  72. /* Remember to document these in state-contents.txt ! */
  73. V(AccountingBytesReadInInterval, MEMUNIT, NULL),
  74. V(AccountingBytesWrittenInInterval, MEMUNIT, NULL),
  75. V(AccountingExpectedUsage, MEMUNIT, NULL),
  76. V(AccountingIntervalStart, ISOTIME, NULL),
  77. V(AccountingSecondsActive, INTERVAL, NULL),
  78. V(AccountingSecondsToReachSoftLimit,INTERVAL, NULL),
  79. V(AccountingSoftLimitHitAt, ISOTIME, NULL),
  80. V(AccountingBytesAtSoftLimit, MEMUNIT, NULL),
  81. VAR("EntryGuard", LINELIST_S, EntryGuards, NULL),
  82. VAR("EntryGuardDownSince", LINELIST_S, EntryGuards, NULL),
  83. VAR("EntryGuardUnlistedSince", LINELIST_S, EntryGuards, NULL),
  84. VAR("EntryGuardAddedBy", LINELIST_S, EntryGuards, NULL),
  85. VAR("EntryGuardPathBias", LINELIST_S, EntryGuards, NULL),
  86. VAR("EntryGuardPathUseBias", LINELIST_S, EntryGuards, NULL),
  87. V(EntryGuards, LINELIST_V, NULL),
  88. VAR("TransportProxy", LINELIST_S, TransportProxies, NULL),
  89. V(TransportProxies, LINELIST_V, NULL),
  90. V(HidServRevCounter, LINELIST, NULL),
  91. V(BWHistoryReadEnds, ISOTIME, NULL),
  92. V(BWHistoryReadInterval, POSINT, "900"),
  93. V(BWHistoryReadValues, CSV, ""),
  94. V(BWHistoryReadMaxima, CSV, ""),
  95. V(BWHistoryWriteEnds, ISOTIME, NULL),
  96. V(BWHistoryWriteInterval, POSINT, "900"),
  97. V(BWHistoryWriteValues, CSV, ""),
  98. V(BWHistoryWriteMaxima, CSV, ""),
  99. V(BWHistoryDirReadEnds, ISOTIME, NULL),
  100. V(BWHistoryDirReadInterval, POSINT, "900"),
  101. V(BWHistoryDirReadValues, CSV, ""),
  102. V(BWHistoryDirReadMaxima, CSV, ""),
  103. V(BWHistoryDirWriteEnds, ISOTIME, NULL),
  104. V(BWHistoryDirWriteInterval, POSINT, "900"),
  105. V(BWHistoryDirWriteValues, CSV, ""),
  106. V(BWHistoryDirWriteMaxima, CSV, ""),
  107. V(Guard, LINELIST, NULL),
  108. V(TorVersion, STRING, NULL),
  109. V(LastRotatedOnionKey, ISOTIME, NULL),
  110. V(LastWritten, ISOTIME, NULL),
  111. V(TotalBuildTimes, POSINT, NULL),
  112. V(CircuitBuildAbandonedCount, POSINT, "0"),
  113. VAR("CircuitBuildTimeBin", LINELIST_S, BuildtimeHistogram, NULL),
  114. VAR("BuildtimeHistogram", LINELIST_V, BuildtimeHistogram, NULL),
  115. V(MinutesSinceUserActivity, POSINT, NULL),
  116. V(Dormant, AUTOBOOL, "auto"),
  117. END_OF_CONFIG_VARS
  118. };
  119. #undef VAR
  120. #undef V
  121. static int or_state_validate(or_state_t *state, char **msg);
  122. static int or_state_validate_cb(void *old_options, void *options,
  123. void *default_options,
  124. int from_setconf, char **msg);
  125. static void or_state_free_cb(const config_mgr_t *mgr, void *state);
  126. /** Magic value for or_state_t. */
  127. #define OR_STATE_MAGIC 0x57A73f57
  128. /** "Extra" variable in the state that receives lines we can't parse. This
  129. * lets us preserve options from versions of Tor newer than us. */
  130. static struct_member_t state_extra_var = {
  131. .name = "__extra",
  132. .type = CONFIG_TYPE_LINELIST,
  133. .offset = offsetof(or_state_t, ExtraLines),
  134. };
  135. /** Configuration format for or_state_t. */
  136. static const config_format_t state_format = {
  137. sizeof(or_state_t),
  138. {
  139. "or_state_t",
  140. OR_STATE_MAGIC,
  141. offsetof(or_state_t, magic_),
  142. },
  143. state_abbrevs_,
  144. NULL,
  145. state_vars_,
  146. or_state_validate_cb,
  147. or_state_free_cb,
  148. &state_extra_var,
  149. };
  150. /* A global configuration manager for state-file objects */
  151. static config_mgr_t *state_mgr = NULL;
  152. /** Return the configuration manager for state-file objects. */
  153. static const config_mgr_t *
  154. get_state_mgr(void)
  155. {
  156. if (PREDICT_UNLIKELY(state_mgr == NULL)) {
  157. state_mgr = config_mgr_new(&state_format);
  158. config_mgr_freeze(state_mgr);
  159. }
  160. return state_mgr;
  161. }
  162. /** Persistent serialized state. */
  163. static or_state_t *global_state = NULL;
  164. /** Return the persistent state struct for this Tor. */
  165. MOCK_IMPL(or_state_t *,
  166. get_or_state, (void))
  167. {
  168. tor_assert(global_state);
  169. return global_state;
  170. }
  171. /** Return true iff we have loaded the global state for this Tor */
  172. int
  173. or_state_loaded(void)
  174. {
  175. return global_state != NULL;
  176. }
  177. /** Return true if <b>line</b> is a valid state TransportProxy line.
  178. * Return false otherwise. */
  179. static int
  180. state_transport_line_is_valid(const char *line)
  181. {
  182. smartlist_t *items = NULL;
  183. char *addrport=NULL;
  184. tor_addr_t addr;
  185. uint16_t port = 0;
  186. int r;
  187. items = smartlist_new();
  188. smartlist_split_string(items, line, NULL,
  189. SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
  190. if (smartlist_len(items) != 2) {
  191. log_warn(LD_CONFIG, "state: Not enough arguments in TransportProxy line.");
  192. goto err;
  193. }
  194. addrport = smartlist_get(items, 1);
  195. if (tor_addr_port_lookup(addrport, &addr, &port) < 0) {
  196. log_warn(LD_CONFIG, "state: Could not parse addrport.");
  197. goto err;
  198. }
  199. if (!port) {
  200. log_warn(LD_CONFIG, "state: Transport line did not contain port.");
  201. goto err;
  202. }
  203. r = 1;
  204. goto done;
  205. err:
  206. r = 0;
  207. done:
  208. SMARTLIST_FOREACH(items, char*, s, tor_free(s));
  209. smartlist_free(items);
  210. return r;
  211. }
  212. /** Return 0 if all TransportProxy lines in <b>state</b> are well
  213. * formed. Otherwise, return -1. */
  214. static int
  215. validate_transports_in_state(or_state_t *state)
  216. {
  217. int broken = 0;
  218. config_line_t *line;
  219. for (line = state->TransportProxies ; line ; line = line->next) {
  220. tor_assert(!strcmp(line->key, "TransportProxy"));
  221. if (!state_transport_line_is_valid(line->value))
  222. broken = 1;
  223. }
  224. if (broken)
  225. log_warn(LD_CONFIG, "state: State file seems to be broken.");
  226. return 0;
  227. }
  228. static int
  229. or_state_validate_cb(void *old_state, void *state, void *default_state,
  230. int from_setconf, char **msg)
  231. {
  232. /* We don't use these; only options do. Still, we need to match that
  233. * signature. */
  234. (void) from_setconf;
  235. (void) default_state;
  236. (void) old_state;
  237. return or_state_validate(state, msg);
  238. }
  239. static void
  240. or_state_free_cb(const config_mgr_t *mgr, void *state)
  241. {
  242. (void)mgr;
  243. or_state_free_(state);
  244. }
  245. /** Return 0 if every setting in <b>state</b> is reasonable, and a
  246. * permissible transition from <b>old_state</b>. Else warn and return -1.
  247. * Should have no side effects, except for normalizing the contents of
  248. * <b>state</b>.
  249. */
  250. static int
  251. or_state_validate(or_state_t *state, char **msg)
  252. {
  253. if (entry_guards_parse_state(state, 0, msg)<0)
  254. return -1;
  255. if (validate_transports_in_state(state)<0)
  256. return -1;
  257. return 0;
  258. }
  259. /** Replace the current persistent state with <b>new_state</b> */
  260. static int
  261. or_state_set(or_state_t *new_state)
  262. {
  263. char *err = NULL;
  264. int ret = 0;
  265. tor_assert(new_state);
  266. config_free(get_state_mgr(), global_state);
  267. global_state = new_state;
  268. if (entry_guards_parse_state(global_state, 1, &err)<0) {
  269. log_warn(LD_GENERAL,"%s",err);
  270. tor_free(err);
  271. ret = -1;
  272. }
  273. if (rep_hist_load_state(global_state, &err)<0) {
  274. log_warn(LD_GENERAL,"Unparseable bandwidth history state: %s",err);
  275. tor_free(err);
  276. ret = -1;
  277. }
  278. if (circuit_build_times_parse_state(
  279. get_circuit_build_times_mutable(),global_state) < 0) {
  280. ret = -1;
  281. }
  282. netstatus_load_from_state(global_state, time(NULL));
  283. return ret;
  284. }
  285. /**
  286. * Save a broken state file to a backup location.
  287. */
  288. static void
  289. or_state_save_broken(char *fname)
  290. {
  291. int i, res;
  292. file_status_t status;
  293. char *fname2 = NULL;
  294. for (i = 0; i < 100; ++i) {
  295. tor_asprintf(&fname2, "%s.%d", fname, i);
  296. status = file_status(fname2);
  297. if (status == FN_NOENT)
  298. break;
  299. tor_free(fname2);
  300. }
  301. if (i == 100) {
  302. log_warn(LD_BUG, "Unable to parse state in \"%s\"; too many saved bad "
  303. "state files to move aside. Discarding the old state file.",
  304. fname);
  305. res = unlink(fname);
  306. if (res != 0) {
  307. log_warn(LD_FS,
  308. "Also couldn't discard old state file \"%s\" because "
  309. "unlink() failed: %s",
  310. fname, strerror(errno));
  311. }
  312. } else {
  313. log_warn(LD_BUG, "Unable to parse state in \"%s\". Moving it aside "
  314. "to \"%s\". This could be a bug in Tor; please tell "
  315. "the developers.", fname, fname2);
  316. if (tor_rename(fname, fname2) < 0) {//XXXX sandbox prohibits
  317. log_warn(LD_BUG, "Weirdly, I couldn't even move the state aside. The "
  318. "OS gave an error of %s", strerror(errno));
  319. }
  320. }
  321. tor_free(fname2);
  322. }
  323. STATIC or_state_t *
  324. or_state_new(void)
  325. {
  326. or_state_t *new_state = config_new(get_state_mgr());
  327. config_init(get_state_mgr(), new_state);
  328. return new_state;
  329. }
  330. /** Reload the persistent state from disk, generating a new state as needed.
  331. * Return 0 on success, less than 0 on failure.
  332. */
  333. int
  334. or_state_load(void)
  335. {
  336. or_state_t *new_state = NULL;
  337. char *contents = NULL, *fname;
  338. char *errmsg = NULL;
  339. int r = -1, badstate = 0;
  340. fname = get_datadir_fname("state");
  341. switch (file_status(fname)) {
  342. case FN_FILE:
  343. if (!(contents = read_file_to_str(fname, 0, NULL))) {
  344. log_warn(LD_FS, "Unable to read state file \"%s\"", fname);
  345. goto done;
  346. }
  347. break;
  348. /* treat empty state files as if the file doesn't exist, and generate
  349. * a new state file, overwriting the empty file in or_state_save() */
  350. case FN_NOENT:
  351. case FN_EMPTY:
  352. break;
  353. case FN_ERROR:
  354. case FN_DIR:
  355. default:
  356. log_warn(LD_GENERAL,"State file \"%s\" is not a file? Failing.", fname);
  357. goto done;
  358. }
  359. new_state = or_state_new();
  360. if (contents) {
  361. config_line_t *lines=NULL;
  362. int assign_retval;
  363. if (config_get_lines(contents, &lines, 0)<0)
  364. goto done;
  365. assign_retval = config_assign(get_state_mgr(), new_state,
  366. lines, 0, &errmsg);
  367. config_free_lines(lines);
  368. if (assign_retval<0)
  369. badstate = 1;
  370. if (errmsg) {
  371. log_warn(LD_GENERAL, "%s", errmsg);
  372. tor_free(errmsg);
  373. }
  374. }
  375. if (!badstate && or_state_validate(new_state, &errmsg) < 0)
  376. badstate = 1;
  377. if (errmsg) {
  378. log_warn(LD_GENERAL, "%s", errmsg);
  379. tor_free(errmsg);
  380. }
  381. if (badstate && !contents) {
  382. log_warn(LD_BUG, "Uh oh. We couldn't even validate our own default state."
  383. " This is a bug in Tor.");
  384. goto done;
  385. } else if (badstate && contents) {
  386. or_state_save_broken(fname);
  387. tor_free(contents);
  388. config_free(get_state_mgr(), new_state);
  389. new_state = or_state_new();
  390. } else if (contents) {
  391. log_info(LD_GENERAL, "Loaded state from \"%s\"", fname);
  392. /* Warn the user if their clock has been set backwards,
  393. * they could be tricked into using old consensuses */
  394. time_t apparent_skew = time(NULL) - new_state->LastWritten;
  395. if (apparent_skew < 0) {
  396. /* Initialize bootstrap event reporting because we might call
  397. * clock_skew_warning() before the bootstrap state is
  398. * initialized, causing an assertion failure. */
  399. control_event_bootstrap(BOOTSTRAP_STATUS_STARTING, 0);
  400. clock_skew_warning(NULL, (long)apparent_skew, 1, LD_GENERAL,
  401. "local state file", fname);
  402. }
  403. } else {
  404. log_info(LD_GENERAL, "Initialized state");
  405. }
  406. if (or_state_set(new_state) == -1) {
  407. or_state_save_broken(fname);
  408. }
  409. new_state = NULL;
  410. if (!contents) {
  411. global_state->next_write = 0;
  412. or_state_save(time(NULL));
  413. }
  414. r = 0;
  415. done:
  416. tor_free(fname);
  417. tor_free(contents);
  418. if (new_state)
  419. config_free(get_state_mgr(), new_state);
  420. return r;
  421. }
  422. /** Did the last time we tried to write the state file fail? If so, we
  423. * should consider disabling such features as preemptive circuit generation
  424. * to compute circuit-build-time. */
  425. static int last_state_file_write_failed = 0;
  426. /** Return whether the state file failed to write last time we tried. */
  427. int
  428. did_last_state_file_write_fail(void)
  429. {
  430. return last_state_file_write_failed;
  431. }
  432. /** If writing the state to disk fails, try again after this many seconds. */
  433. #define STATE_WRITE_RETRY_INTERVAL 3600
  434. /** If we're a relay, how often should we checkpoint our state file even
  435. * if nothing else dirties it? This will checkpoint ongoing stats like
  436. * bandwidth used, per-country user stats, etc. */
  437. #define STATE_RELAY_CHECKPOINT_INTERVAL (12*60*60)
  438. /** Write the persistent state to disk. Return 0 for success, <0 on failure. */
  439. int
  440. or_state_save(time_t now)
  441. {
  442. char *state, *contents;
  443. char tbuf[ISO_TIME_LEN+1];
  444. char *fname;
  445. tor_assert(global_state);
  446. if (global_state->next_write > now)
  447. return 0;
  448. /* Call everything else that might dirty the state even more, in order
  449. * to avoid redundant writes. */
  450. entry_guards_update_state(global_state);
  451. rep_hist_update_state(global_state);
  452. circuit_build_times_update_state(get_circuit_build_times(), global_state);
  453. netstatus_flush_to_state(global_state, now);
  454. if (accounting_is_enabled(get_options()))
  455. accounting_run_housekeeping(now);
  456. global_state->LastWritten = now;
  457. tor_free(global_state->TorVersion);
  458. tor_asprintf(&global_state->TorVersion, "Tor %s", get_version());
  459. state = config_dump(get_state_mgr(), NULL, global_state, 1, 0);
  460. format_local_iso_time(tbuf, now);
  461. tor_asprintf(&contents,
  462. "# Tor state file last generated on %s local time\n"
  463. "# Other times below are in UTC\n"
  464. "# You *do not* need to edit this file.\n\n%s",
  465. tbuf, state);
  466. tor_free(state);
  467. fname = get_datadir_fname("state");
  468. if (write_str_to_file(fname, contents, 0)<0) {
  469. log_warn(LD_FS, "Unable to write state to file \"%s\"; "
  470. "will try again later", fname);
  471. last_state_file_write_failed = 1;
  472. tor_free(fname);
  473. tor_free(contents);
  474. /* Try again after STATE_WRITE_RETRY_INTERVAL (or sooner, if the state
  475. * changes sooner). */
  476. global_state->next_write = now + STATE_WRITE_RETRY_INTERVAL;
  477. return -1;
  478. }
  479. last_state_file_write_failed = 0;
  480. log_info(LD_GENERAL, "Saved state to \"%s\"", fname);
  481. tor_free(fname);
  482. tor_free(contents);
  483. if (server_mode(get_options()))
  484. global_state->next_write = now + STATE_RELAY_CHECKPOINT_INTERVAL;
  485. else
  486. global_state->next_write = TIME_MAX;
  487. return 0;
  488. }
  489. /** Return the config line for transport <b>transport</b> in the current state.
  490. * Return NULL if there is no config line for <b>transport</b>. */
  491. STATIC config_line_t *
  492. get_transport_in_state_by_name(const char *transport)
  493. {
  494. or_state_t *or_state = get_or_state();
  495. config_line_t *line;
  496. config_line_t *ret = NULL;
  497. smartlist_t *items = NULL;
  498. for (line = or_state->TransportProxies ; line ; line = line->next) {
  499. tor_assert(!strcmp(line->key, "TransportProxy"));
  500. items = smartlist_new();
  501. smartlist_split_string(items, line->value, NULL,
  502. SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
  503. if (smartlist_len(items) != 2) /* broken state */
  504. goto done;
  505. if (!strcmp(smartlist_get(items, 0), transport)) {
  506. ret = line;
  507. goto done;
  508. }
  509. SMARTLIST_FOREACH(items, char*, s, tor_free(s));
  510. smartlist_free(items);
  511. items = NULL;
  512. }
  513. done:
  514. if (items) {
  515. SMARTLIST_FOREACH(items, char*, s, tor_free(s));
  516. smartlist_free(items);
  517. }
  518. return ret;
  519. }
  520. /** Return string containing the address:port part of the
  521. * TransportProxy <b>line</b> for transport <b>transport</b>.
  522. * If the line is corrupted, return NULL. */
  523. static const char *
  524. get_transport_bindaddr(const char *line, const char *transport)
  525. {
  526. char *line_tmp = NULL;
  527. if (strlen(line) < strlen(transport) + 2) {
  528. goto broken_state;
  529. } else {
  530. /* line should start with the name of the transport and a space.
  531. (for example, "obfs2 127.0.0.1:47245") */
  532. tor_asprintf(&line_tmp, "%s ", transport);
  533. if (strcmpstart(line, line_tmp))
  534. goto broken_state;
  535. tor_free(line_tmp);
  536. return (line+strlen(transport)+1);
  537. }
  538. broken_state:
  539. tor_free(line_tmp);
  540. return NULL;
  541. }
  542. /** Return a string containing the address:port that a proxy transport
  543. * should bind on. The string is stored on the heap and must be freed
  544. * by the caller of this function. */
  545. char *
  546. get_stored_bindaddr_for_server_transport(const char *transport)
  547. {
  548. char *default_addrport = NULL;
  549. const char *stored_bindaddr = NULL;
  550. config_line_t *line = NULL;
  551. {
  552. /* See if the user explicitly asked for a specific listening
  553. address for this transport. */
  554. char *conf_bindaddr = get_transport_bindaddr_from_config(transport);
  555. if (conf_bindaddr)
  556. return conf_bindaddr;
  557. }
  558. line = get_transport_in_state_by_name(transport);
  559. if (!line) /* Found no references in state for this transport. */
  560. goto no_bindaddr_found;
  561. stored_bindaddr = get_transport_bindaddr(line->value, transport);
  562. if (stored_bindaddr) /* found stored bindaddr in state file. */
  563. return tor_strdup(stored_bindaddr);
  564. no_bindaddr_found:
  565. /** If we didn't find references for this pluggable transport in the
  566. state file, we should instruct the pluggable transport proxy to
  567. listen on INADDR_ANY on a random ephemeral port. */
  568. tor_asprintf(&default_addrport, "%s:%s", fmt_addr32(INADDR_ANY), "0");
  569. return default_addrport;
  570. }
  571. /** Save <b>transport</b> listening on <b>addr</b>:<b>port</b> to
  572. state */
  573. void
  574. save_transport_to_state(const char *transport,
  575. const tor_addr_t *addr, uint16_t port)
  576. {
  577. or_state_t *state = get_or_state();
  578. char *transport_addrport=NULL;
  579. /** find where to write on the state */
  580. config_line_t **next, *line;
  581. /* see if this transport is already stored in state */
  582. config_line_t *transport_line =
  583. get_transport_in_state_by_name(transport);
  584. if (transport_line) { /* if transport already exists in state... */
  585. const char *prev_bindaddr = /* get its addrport... */
  586. get_transport_bindaddr(transport_line->value, transport);
  587. transport_addrport = tor_strdup(fmt_addrport(addr, port));
  588. /* if transport in state has the same address as this one, life is good */
  589. if (!strcmp(prev_bindaddr, transport_addrport)) {
  590. log_info(LD_CONFIG, "Transport seems to have spawned on its usual "
  591. "address:port.");
  592. goto done;
  593. } else { /* if addrport in state is different than the one we got */
  594. log_info(LD_CONFIG, "Transport seems to have spawned on different "
  595. "address:port. Let's update the state file with the new "
  596. "address:port");
  597. tor_free(transport_line->value); /* free the old line */
  598. /* replace old addrport line with new line */
  599. tor_asprintf(&transport_line->value, "%s %s", transport,
  600. fmt_addrport(addr, port));
  601. }
  602. } else { /* never seen this one before; save it in state for next time */
  603. log_info(LD_CONFIG, "It's the first time we see this transport. "
  604. "Let's save its address:port");
  605. next = &state->TransportProxies;
  606. /* find the last TransportProxy line in the state and point 'next'
  607. right after it */
  608. line = state->TransportProxies;
  609. while (line) {
  610. next = &(line->next);
  611. line = line->next;
  612. }
  613. /* allocate space for the new line and fill it in */
  614. *next = line = tor_malloc_zero(sizeof(config_line_t));
  615. line->key = tor_strdup("TransportProxy");
  616. tor_asprintf(&line->value, "%s %s", transport, fmt_addrport(addr, port));
  617. }
  618. if (!get_options()->AvoidDiskWrites)
  619. or_state_mark_dirty(state, 0);
  620. done:
  621. tor_free(transport_addrport);
  622. }
  623. /** Change the next_write time of <b>state</b> to <b>when</b>, unless the
  624. * state is already scheduled to be written to disk earlier than <b>when</b>.
  625. */
  626. void
  627. or_state_mark_dirty(or_state_t *state, time_t when)
  628. {
  629. if (state->next_write > when) {
  630. state->next_write = when;
  631. reschedule_or_state_save();
  632. }
  633. }
  634. STATIC void
  635. or_state_free_(or_state_t *state)
  636. {
  637. if (!state)
  638. return;
  639. config_free(get_state_mgr(), state);
  640. }
  641. void
  642. or_state_free_all(void)
  643. {
  644. or_state_free(global_state);
  645. global_state = NULL;
  646. config_mgr_free(state_mgr);
  647. }