10#define CONTROL_EVENTS_PRIVATE
11#define CONTROL_MODULE_PRIVATE
12#define CONTROL_GETINFO_PRIVATE
30#include "feature/control/control_getinfo.h"
85 char **answer,
const char **errmsg)
88 if (!strcmp(question,
"version")) {
90 }
else if (!strcmp(question,
"bw-event-cache")) {
91 *answer = get_bw_samples();
92 }
else if (!strcmp(question,
"config-file")) {
95 *answer = tor_strdup(a);
96 }
else if (!strcmp(question,
"config-defaults-file")) {
99 *answer = tor_strdup(a);
100 }
else if (!strcmp(question,
"config-text")) {
102 }
else if (!strcmp(question,
"config-can-saveconf")) {
103 *answer = tor_strdup(
get_options()->IncludeUsed ?
"0" :
"1");
104 }
else if (!strcmp(question,
"info/names")) {
106 }
else if (!strcmp(question,
"dormant")) {
108 *answer = tor_strdup(dormant ?
"1" :
"0");
109 }
else if (!strcmp(question,
"events/names")) {
119 smartlist_free(event_names);
120 }
else if (!strcmp(question,
"signal/names")) {
123 for (j = 0; signal_table[j].signal_name != NULL; ++j) {
124 smartlist_add(signal_names, (
char*)signal_table[j].signal_name);
129 smartlist_free(signal_names);
130 }
else if (!strcmp(question,
"features/names")) {
131 *answer = tor_strdup(
"VERBOSE_NAMES EXTENDED_EVENTS");
132 }
else if (!strcmp(question,
"address") || !strcmp(question,
"address/v4")) {
135 RELAY_FIND_ADDR_CACHE_ONLY, &addr)) {
136 *errmsg =
"Address unknown";
140 tor_assert_nonfatal(*answer);
141 }
else if (!strcmp(question,
"address/v6")) {
144 RELAY_FIND_ADDR_CACHE_ONLY, &addr)) {
145 *errmsg =
"Address unknown";
149 tor_assert_nonfatal(*answer);
150 }
else if (!strcmp(question,
"traffic/read")) {
152 }
else if (!strcmp(question,
"traffic/written")) {
154 }
else if (!strcmp(question,
"uptime")) {
157 }
else if (!strcmp(question,
"process/pid")) {
167 }
else if (!strcmp(question,
"process/uid")) {
169 *answer = tor_strdup(
"-1");
171 int myUid = geteuid();
174 }
else if (!strcmp(question,
"process/user")) {
176 *answer = tor_strdup(
"");
178 int myUid = geteuid();
182 *answer = tor_strdup(myPwEntry->pw_name);
184 *answer = tor_strdup(
"");
187 }
else if (!strcmp(question,
"process/descriptor-limit")) {
190 }
else if (!strcmp(question,
"limits/max-mem-in-queues")) {
193 }
else if (!strcmp(question,
"fingerprint")) {
196 *errmsg =
"Not running in server mode";
199 server_key = get_server_identity_key();
220 char *out = NULL, *outp;
222 const char *router_sig;
229 outp = out = tor_malloc(ri_len+ei_len+1);
230 if (!(router_sig = tor_memstr(ri_body, ri_len,
"\nrouter-signature")))
233 memcpy(out, ri_body, router_sig-ri_body);
234 outp += router_sig-ri_body;
236 for (i=0; i < 2; ++i) {
237 const char *kwd = i ?
"\nwrite-history " :
"\nread-history ";
238 const char *cp, *eol;
239 if (!(cp = tor_memstr(ei_body, ei_len, kwd)))
242 if (!(eol = memchr(cp,
'\n', ei_len - (cp-ei_body))))
244 memcpy(outp, cp, eol-cp+1);
247 memcpy(outp, router_sig, ri_len - (router_sig-ri_body));
249 tor_assert(outp-out < (
int)(ri_len+ei_len+1));
261 const char *question,
262 char **answer,
const char **errmsg)
270 if (!strcmp(question,
"net/listeners/or"))
272 else if (!strcmp(question,
"net/listeners/extor"))
274 else if (!strcmp(question,
"net/listeners/dir"))
276 else if (!strcmp(question,
"net/listeners/socks"))
278 else if (!strcmp(question,
"net/listeners/trans"))
280 else if (!strcmp(question,
"net/listeners/natd"))
282 else if (!strcmp(question,
"net/listeners/httptunnel"))
284 else if (!strcmp(question,
"net/listeners/dns"))
286 else if (!strcmp(question,
"net/listeners/control"))
288 else if (!strcmp(question,
"net/listeners/metrics"))
295 struct sockaddr_storage ss;
296 socklen_t ss_len =
sizeof(ss);
298 if (conn->type != type || conn->marked_for_close || !
SOCKET_OK(conn->s))
301 if (getsockname(conn->s, (
struct sockaddr *)&ss, &ss_len) < 0) {
309 } SMARTLIST_FOREACH_END(conn);
322 const char *question,
323 char **answer,
const char **errmsg)
330 char timebuf[ISO_TIME_LEN+1];
332 if (!strcmp(question,
"current-time/local"))
334 else if (!strcmp(question,
"current-time/utc"))
339 *answer = tor_strdup(timebuf);
351 if (BUG(!strcmp(flavor_name,
"??"))) {
352 *errmsg =
"Internal error: unrecognized flavor name.";
357 *answer = tor_memdup_nulterm(mapped->
data, mapped->
size);
358 tor_munmap_file(mapped);
364 *answer = tor_strdup(consensus->
dir);
369 *errmsg =
"Could not open cached consensus. "
370 "Make sure FetchUselessDescriptors is set to 1.";
399 if (!strcmp(key,
"/tor/server/all")) {
403 }
else if (!strcmp(key,
"/tor/server/authority")) {
409 key += strlen(
"/tor/server/d/");
411 DSR_HEX|DSR_SORT_UNIQ);
419 smartlist_free(digests);
423 key += strlen(
"/tor/server/fp/");
425 DSR_HEX|DSR_SORT_UNIQ);
441 } SMARTLIST_FOREACH_END(d);
443 smartlist_free(digests);
445 *msg =
"Key not recognized";
449 if (!smartlist_len(descs_out)) {
450 *msg =
"Servers unavailable";
460 const char *question,
char **answer,
475 *errmsg =
"We fetch microdescriptors, not router "
476 "descriptors. You'll need to use md/id/* "
477 "instead of desc/id/*.";
494 *errmsg =
"We fetch microdescriptors, not router "
495 "descriptors. You'll need to use md/name/* "
496 "instead of desc/name/*.";
499 }
else if (!strcmp(question,
"desc/download-enabled")) {
502 }
else if (!strcmp(question,
"desc/all-recent")) {
508 const char *body = signed_descriptor_get_body(&ri->cache_info);
511 tor_strndup(body, ri->cache_info.signed_descriptor_len));
517 }
else if (!strcmp(question,
"desc/all-recent-extrainfo-hack")) {
525 ri->cache_info.extra_info_digest);
528 &ri->cache_info, ei));
531 tor_strndup(body, ri->cache_info.signed_descriptor_len));
533 } SMARTLIST_FOREACH_END(ri);
538 }
else if (!
strcmpstart(question,
"hs/client/desc/id/")) {
541 question += strlen(
"hs/client/desc/id/");
543 addr_type = ONION_V3_HOSTNAME;
545 *errmsg =
"Invalid address";
549 if (addr_type == ONION_V3_HOSTNAME) {
557 *errmsg =
"Invalid v3 address";
563 *answer = tor_strdup(desc);
565 *errmsg =
"Not found in cache";
569 }
else if (!
strcmpstart(question,
"hs/service/desc/id/")) {
572 question += strlen(
"hs/service/desc/id/");
574 addr_type = ONION_V3_HOSTNAME;
576 *errmsg =
"Invalid address";
580 if (addr_type == ONION_V3_HOSTNAME) {
588 *errmsg =
"Invalid v3 address";
597 *errmsg =
"Not found in cache";
601 }
else if (!strcmp(question,
"md/all")) {
605 if (smartlist_len(nodes) == 0) {
606 *answer = tor_strdup(
"");
613 if (n->md && n->md->body) {
614 char *copy = tor_strndup(n->md->body, n->md->bodylen);
617 } SMARTLIST_FOREACH_END(n);
621 smartlist_free(microdescs);
625 if (node) md = node->md;
626 if (md && md->
body) {
635 if (node) md = node->md;
636 if (md && md->
body) {
639 }
else if (!strcmp(question,
"md/download-enabled")) {
642 }
else if (!
strcmpstart(question,
"desc-annotations/id/")) {
649 const char *annotations =
652 *answer = tor_strndup(annotations,
655 }
else if (!
strcmpstart(question,
"dir/server/")) {
656 size_t answer_len = 0;
665 log_warn(
LD_CONTROL,
"getinfo '%s': %s", question, msg);
666 smartlist_free(descs);
673 cp = *answer = tor_malloc(answer_len+1);
677 sd->signed_descriptor_len);
678 cp += sd->signed_descriptor_len;
682 smartlist_free(descs);
683 }
else if (!
strcmpstart(question,
"dir/status/")) {
684 *answer = tor_strdup(
"");
685 }
else if (!strcmp(question,
"dir/status-vote/current/consensus")) {
688 if (consensus_result < 0) {
691 }
else if (!strcmp(question,
692 "dir/status-vote/current/consensus-microdesc")) {
695 if (consensus_result < 0) {
698 }
else if (!
strcmpstart(question,
"extra-info/digest/")) {
699 question += strlen(
"extra-info/digest/");
737 result = tor_malloc_zero(len);
744 } SMARTLIST_FOREACH_END(digest);
757 char tbuf[ISO_TIME_LEN+1];
758 const char *schedule_str, *want_authority_str;
759 const char *increment_on_str, *backoff_str;
766 case DL_SCHED_GENERIC:
767 schedule_str =
"DL_SCHED_GENERIC";
769 case DL_SCHED_CONSENSUS:
770 schedule_str =
"DL_SCHED_CONSENSUS";
772 case DL_SCHED_BRIDGE:
773 schedule_str =
"DL_SCHED_BRIDGE";
776 schedule_str =
"unknown";
781 case DL_WANT_ANY_DIRSERVER:
782 want_authority_str =
"DL_WANT_ANY_DIRSERVER";
784 case DL_WANT_AUTHORITY:
785 want_authority_str =
"DL_WANT_AUTHORITY";
788 want_authority_str =
"unknown";
793 case DL_SCHED_INCREMENT_FAILURE:
794 increment_on_str =
"DL_SCHED_INCREMENT_FAILURE";
796 case DL_SCHED_INCREMENT_ATTEMPT:
797 increment_on_str =
"DL_SCHED_INCREMENT_ATTEMPT";
800 increment_on_str =
"unknown";
804 backoff_str =
"DL_SCHED_RANDOM_EXPONENTIAL";
808 "next-attempt-at %s\n"
809 "n-download-failures %u\n"
810 "n-download-attempts %u\n"
812 "want-authority %s\n"
815 "last-backoff-position %u\n"
816 "last-delay-used %d\n",
841 if (strcmp(flavor,
"ns") == 0) {
843 }
else if (strcmp(flavor,
"ns/bootstrap") == 0) {
845 }
else if (strcmp(flavor,
"ns/running") == 0 ) {
847 }
else if (strcmp(flavor,
"microdesc") == 0) {
849 }
else if (strcmp(flavor,
"microdesc/bootstrap") == 0) {
852 }
else if (strcmp(flavor,
"microdesc/running") == 0) {
856 *errmsg =
"Unknown flavor";
899 if (strcmp(fp_sk_req,
"fps") == 0) {
901 if (!(*digest_list)) {
902 *errmsg =
"Failed to get list of authority identity digests (!)";
905 fp_sk_req += strlen(
"fp/");
907 sk_req = strchr(fp_sk_req,
'/');
911 fp_sk_req, sk_req - fp_sk_req) ==
DIGEST_LEN) {
914 if (strcmp(sk_req,
"sks") == 0) {
917 if (!(*digest_list)) {
918 *errmsg =
"Failed to get list of signing key digests for this "
919 "authority identity digest";
927 if (!(*dl_to_emit)) {
928 *errmsg =
"Failed to get download status for this identity/"
929 "signing key digest pair";
932 *errmsg =
"That didn't look like a signing key digest";
936 *errmsg =
"That didn't look like an identity digest";
942 fp_sk_req, strlen(fp_sk_req)) ==
DIGEST_LEN) {
944 if (!(*dl_to_emit)) {
945 *errmsg =
"Failed to get download status for this authority "
949 *errmsg =
"That didn't look like a digest";
952 *errmsg =
"That didn't look like a digest";
956 *errmsg =
"Unknown certificate download status query";
981 if (strcmp(desc_req,
"descs") == 0) {
983 if (!(*digest_list)) {
984 *errmsg =
"We don't seem to have a networkstatus-flavored consensus";
995 if (!(*dl_to_emit)) {
996 *errmsg =
"No such descriptor digest found";
999 *errmsg =
"That didn't look like a digest";
1002 *errmsg =
"Unknown router descriptor download status query";
1011 const char **errmsg)
1027 if (strcmp(bridge_req,
"bridges") == 0) {
1029 if (!(*digest_list)) {
1030 *errmsg =
"We don't seem to be using bridges";
1034 bridge_req, strlen(bridge_req)) ==
DIGEST_LEN) {
1037 if (!(*dl_to_emit)) {
1038 *errmsg =
"No such bridge identity digest found";
1041 *errmsg =
"That didn't look like a digest";
1044 *errmsg =
"Unknown bridge descriptor download status query";
1052 const char *question,
char **answer,
1053 const char **errmsg)
1068 if (!
strcmpstart(question,
"downloads/networkstatus/")) {
1070 question + strlen(
"downloads/networkstatus/"),
1071 &dl_to_emit, errmsg);
1073 }
else if (!
strcmpstart(question,
"downloads/cert/")) {
1075 question + strlen(
"downloads/cert/"),
1076 &dl_to_emit, &digest_list, errmsg);
1078 }
else if (!
strcmpstart(question,
"downloads/desc/")) {
1080 question + strlen(
"downloads/desc/"),
1081 &dl_to_emit, &digest_list, errmsg);
1083 }
else if (!
strcmpstart(question,
"downloads/bridge/")) {
1085 question + strlen(
"downloads/bridge/"),
1086 &dl_to_emit, &digest_list, errmsg);
1088 *errmsg =
"Unknown download status query";
1095 }
else if (digest_list) {
1098 smartlist_free(digest_list);
1103 *errmsg =
"Unknown error";
1114 const char *question,
char **answer,
1115 const char **errmsg)
1118 (void) control_conn;
1119 if (!strcmp(question,
"circuit-status")) {
1132 state =
"GUARD_WAIT";
1133 else if (circ->
cpath)
1142 state, *circdesc ?
" " :
"", circdesc);
1145 SMARTLIST_FOREACH_END(circ_);
1148 smartlist_free(status);
1149 }
else if (!strcmp(question,
"stream-status")) {
1159 base_conn->marked_for_close ||
1164 switch (base_conn->state)
1170 state =
"NEWRESOLVE";
1176 state =
"SENTCONNECT";
break;
1178 state =
"SENTRESOLVE";
break;
1180 state =
"SUCCEEDED";
break;
1182 log_warn(
LD_BUG,
"Asked for stream in unknown state %d",
1191 (
unsigned long) base_conn->global_identifier,state,
1195 } SMARTLIST_FOREACH_END(base_conn);
1198 smartlist_free(status);
1199 }
else if (!strcmp(question,
"orconn-status")) {
1206 if (base_conn->type !=
CONN_TYPE_OR || base_conn->marked_for_close)
1210 state =
"CONNECTED";
1217 } SMARTLIST_FOREACH_END(base_conn);
1220 smartlist_free(status);
1221 }
else if (!
strcmpstart(question,
"address-mappings/")) {
1222 time_t min_e, max_e;
1224 question += strlen(
"address-mappings/");
1225 if (!strcmp(question,
"all")) {
1226 min_e = 0; max_e = TIME_MAX;
1227 }
else if (!strcmp(question,
"cache")) {
1228 min_e = 2; max_e = TIME_MAX;
1229 }
else if (!strcmp(question,
"config")) {
1230 min_e = 0; max_e = 0;
1231 }
else if (!strcmp(question,
"control")) {
1232 min_e = 1; max_e = 1;
1240 smartlist_free(mappings);
1244 if (!strcmp(question,
"status/circuit-established")) {
1246 }
else if (!strcmp(question,
"status/enough-dir-info")) {
1248 }
else if (!strcmp(question,
"status/good-server-descriptor") ||
1249 !strcmp(question,
"status/accepted-server-descriptor")) {
1255 }
else if (!strcmp(question,
"status/reachability-succeeded/or")) {
1256 *answer = tor_strdup(
1257 router_all_orports_seem_reachable(options) ?
1259 }
else if (!strcmp(question,
"status/reachability-succeeded/dir")) {
1260 *answer = tor_strdup(
1263 }
else if (!strcmp(question,
"status/reachability-succeeded")) {
1265 answer,
"OR=%d DIR=%d",
1266 router_all_orports_seem_reachable(options) ? 1 : 0,
1268 }
else if (!strcmp(question,
"status/bootstrap-phase")) {
1270 }
else if (!
strcmpstart(question,
"status/version/")) {
1274 const char *recommended;
1283 if (!strcmp(question,
"status/version/recommended")) {
1284 *answer = tor_strdup(recommended);
1287 if (!strcmp(question,
"status/version/current")) {
1291 case VS_OLD: *answer = tor_strdup(
"obsolete");
break;
1292 case VS_NEW: *answer = tor_strdup(
"new");
break;
1295 case VS_EMPTY: *answer = tor_strdup(
"none recommended");
break;
1296 case VS_UNKNOWN: *answer = tor_strdup(
"unknown");
break;
1300 }
else if (!strcmp(question,
"status/clients-seen")) {
1302 if (!bridge_stats) {
1303 *errmsg =
"No bridge-client stats available";
1306 *answer = bridge_stats;
1307 }
else if (!strcmp(question,
"status/fresh-relay-descs")) {
1309 *errmsg =
"Only relays have descriptors";
1317 case TOR_ROUTERINFO_ERROR_NO_EXT_ADDR:
1318 *errmsg =
"Cannot get relay address while generating descriptor";
1320 case TOR_ROUTERINFO_ERROR_DIGEST_FAILED:
1321 *errmsg =
"Key digest failed";
1323 case TOR_ROUTERINFO_ERROR_CANNOT_GENERATE:
1324 *errmsg =
"Cannot generate router descriptor";
1327 *errmsg =
"Error generating descriptor";
1337 char *descs = tor_malloc(size);
1343 if (cp[0] ==
'\0') {
1345 }
else if (cp[0] !=
'\n') {
1353 if (cp[0] ==
'\n') {
1355 }
else if (cp[0] !=
'\0') {
1372 const char *question,
char **answer,
1373 const char **errmsg)
1378 if (control_conn && !strcmp(question,
"onions/current")) {
1380 }
else if (!strcmp(question,
"onions/detached")) {
1385 if (!onion_list || smartlist_len(onion_list) == 0) {
1387 *answer = tor_strdup(
"");
1402 const char *question,
char **answer,
1403 const char **errmsg)
1407 if (strcmp(question,
"network-liveness") == 0) {
1408 if (get_cached_network_liveness()) {
1409 *answer = tor_strdup(
"up");
1411 *answer = tor_strdup(
"down");
1422 const char *question,
char **answer,
1423 const char **errmsg)
1425 (void) control_conn;
1429 if (!strcmp(question,
"stats/ntor/assigned")) {
1432 }
else if (!strcmp(question,
"stats/ntor/requested")) {
1435 }
else if (!strcmp(question,
"stats/tap/assigned")) {
1438 }
else if (!strcmp(question,
"stats/tap/requested")) {
1442 *errmsg =
"Unrecognized handshake type";
1455 const char *question,
char **answer,
1456 const char **errmsg)
1458 (void) control_conn;
1461 if (!strcmp(question,
"sr/current")) {
1463 }
else if (!strcmp(question,
"sr/previous")) {
1480 const char *q,
char **a,
1481 const char **error_out);
1492#define ITEM(name, fn, desc) { name, getinfo_helper_##fn, desc, 0 }
1493#define PREFIX(name, fn, desc) { name, getinfo_helper_##fn, desc, 1 }
1494#define DOC(name, desc) { name, NULL, desc, 0 }
1499 ITEM(
"version", misc,
"The current version of Tor."),
1500 ITEM(
"bw-event-cache", misc,
"Cached BW events for a short interval."),
1501 ITEM(
"config-file", misc,
"Current location of the \"torrc\" file."),
1502 ITEM(
"config-defaults-file", misc,
"Current location of the defaults file."),
1503 ITEM(
"config-text", misc,
1504 "Return the string that would be written by a saveconf command."),
1505 ITEM(
"config-can-saveconf", misc,
1506 "Is it possible to save the configuration to the \"torrc\" file?"),
1507 ITEM(
"accounting/bytes", accounting,
1508 "Number of bytes read/written so far in the accounting interval."),
1509 ITEM(
"accounting/bytes-left", accounting,
1510 "Number of bytes left to write/read so far in the accounting interval."),
1511 ITEM(
"accounting/enabled", accounting,
"Is accounting currently enabled?"),
1512 ITEM(
"accounting/hibernating", accounting,
"Are we hibernating or awake?"),
1513 ITEM(
"accounting/interval-start", accounting,
1514 "Time when the accounting period starts."),
1515 ITEM(
"accounting/interval-end", accounting,
1516 "Time when the accounting period ends."),
1517 ITEM(
"accounting/interval-wake", accounting,
1518 "Time to wake up in this accounting period."),
1519 ITEM(
"helper-nodes", entry_guards, NULL),
1520 ITEM(
"entry-guards", entry_guards,
1521 "Which nodes are we using as entry guards?"),
1522 ITEM(
"fingerprint", misc, NULL),
1523 PREFIX(
"config/", config,
"Current configuration values."),
1525 "List of configuration options, types, and documentation."),
1526 DOC(
"config/defaults",
1527 "List of default values for configuration options. "
1528 "See also config/names"),
1529 PREFIX(
"current-time/", current_time,
"Current time."),
1530 DOC(
"current-time/local",
"Current time on the local system."),
1531 DOC(
"current-time/utc",
"Current UTC time."),
1532 PREFIX(
"downloads/networkstatus/", downloads,
1533 "Download statuses for networkstatus objects"),
1534 DOC(
"downloads/networkstatus/ns",
1535 "Download status for current-mode networkstatus download"),
1536 DOC(
"downloads/networkstatus/ns/bootstrap",
1537 "Download status for bootstrap-time networkstatus download"),
1538 DOC(
"downloads/networkstatus/ns/running",
1539 "Download status for run-time networkstatus download"),
1540 DOC(
"downloads/networkstatus/microdesc",
1541 "Download status for current-mode microdesc download"),
1542 DOC(
"downloads/networkstatus/microdesc/bootstrap",
1543 "Download status for bootstrap-time microdesc download"),
1544 DOC(
"downloads/networkstatus/microdesc/running",
1545 "Download status for run-time microdesc download"),
1546 PREFIX(
"downloads/cert/", downloads,
1547 "Download statuses for certificates, by id fingerprint and "
1549 DOC(
"downloads/cert/fps",
1550 "List of authority fingerprints for which any download statuses "
1552 DOC(
"downloads/cert/fp/<fp>",
1553 "Download status for <fp> with the default signing key; corresponds "
1554 "to /fp/ URLs on directory server."),
1555 DOC(
"downloads/cert/fp/<fp>/sks",
1556 "List of signing keys for which specific download statuses are "
1557 "available for this id fingerprint"),
1558 DOC(
"downloads/cert/fp/<fp>/<sk>",
1559 "Download status for <fp> with signing key <sk>; corresponds "
1560 "to /fp-sk/ URLs on directory server."),
1561 PREFIX(
"downloads/desc/", downloads,
1562 "Download statuses for router descriptors, by descriptor digest"),
1563 DOC(
"downloads/desc/descs",
1564 "Return a list of known router descriptor digests"),
1565 DOC(
"downloads/desc/<desc>",
1566 "Return a download status for a given descriptor digest"),
1567 PREFIX(
"downloads/bridge/", downloads,
1568 "Download statuses for bridge descriptors, by bridge identity "
1570 DOC(
"downloads/bridge/bridges",
1571 "Return a list of configured bridge identity digests with download "
1573 DOC(
"downloads/bridge/<desc>",
1574 "Return a download status for a given bridge identity digest"),
1575 ITEM(
"info/names", misc,
1576 "List of GETINFO options, types, and documentation."),
1577 ITEM(
"events/names", misc,
1578 "Events that the controller can ask for with SETEVENTS."),
1579 ITEM(
"signal/names", misc,
"Signal names recognized by the SIGNAL command"),
1580 ITEM(
"features/names", misc,
"What arguments can USEFEATURE take?"),
1581 PREFIX(
"desc/id/", dir,
"Router descriptors by ID."),
1582 PREFIX(
"desc/name/", dir,
"Router descriptors by nickname."),
1583 ITEM(
"desc/all-recent", dir,
1584 "All non-expired, non-superseded router descriptors."),
1585 ITEM(
"desc/download-enabled", dir,
1586 "Do we try to download router descriptors?"),
1587 ITEM(
"desc/all-recent-extrainfo-hack", dir, NULL),
1588 ITEM(
"md/all", dir,
"All known microdescriptors."),
1589 PREFIX(
"md/id/", dir,
"Microdescriptors by ID"),
1590 PREFIX(
"md/name/", dir,
"Microdescriptors by name"),
1591 ITEM(
"md/download-enabled", dir,
1592 "Do we try to download microdescriptors?"),
1593 PREFIX(
"extra-info/digest/", dir,
"Extra-info documents by digest."),
1594 PREFIX(
"hs/client/desc/id", dir,
1595 "Hidden Service descriptor in client's cache by onion."),
1596 PREFIX(
"hs/service/desc/id/", dir,
1597 "Hidden Service descriptor in services's cache by onion."),
1598 PREFIX(
"net/listeners/", listeners,
"Bound addresses by type"),
1599 ITEM(
"ns/all", networkstatus,
1600 "Brief summary of router status (v2 directory format)"),
1601 PREFIX(
"ns/id/", networkstatus,
1602 "Brief summary of router status by ID (v2 directory format)."),
1603 PREFIX(
"ns/name/", networkstatus,
1604 "Brief summary of router status by nickname (v2 directory format)."),
1605 PREFIX(
"ns/purpose/", networkstatus,
1606 "Brief summary of router status by purpose (v2 directory format)."),
1607 PREFIX(
"consensus/", networkstatus,
1608 "Information about and from the ns consensus."),
1609 ITEM(
"network-status", dir,
1610 "Brief summary of router status (v1 directory format)"),
1611 ITEM(
"network-liveness", liveness,
1612 "Current opinion on whether the network is live"),
1613 ITEM(
"circuit-status", events,
"List of current circuits originating here."),
1614 ITEM(
"stream-status", events,
"List of current streams."),
1615 ITEM(
"orconn-status", events,
"A list of current OR connections."),
1616 ITEM(
"dormant", misc,
1617 "Is Tor dormant (not building circuits because it's idle)?"),
1618 PREFIX(
"address-mappings/", events, NULL),
1619 DOC(
"address-mappings/all",
"Current address mappings."),
1620 DOC(
"address-mappings/cache",
"Current cached DNS replies."),
1621 DOC(
"address-mappings/config",
1622 "Current address mappings from configuration."),
1623 DOC(
"address-mappings/control",
"Current address mappings from controller."),
1624 PREFIX(
"status/", events, NULL),
1625 DOC(
"status/circuit-established",
1626 "Whether we think client functionality is working."),
1627 DOC(
"status/enough-dir-info",
1628 "Whether we have enough up-to-date directory information to build "
1630 DOC(
"status/bootstrap-phase",
1631 "The last bootstrap phase status event that Tor sent."),
1632 DOC(
"status/clients-seen",
1633 "Breakdown of client countries seen by a bridge."),
1634 DOC(
"status/fresh-relay-descs",
1635 "A fresh relay/ei descriptor pair for Tor's current state. Not stored."),
1636 DOC(
"status/version/recommended",
"List of currently recommended versions."),
1637 DOC(
"status/version/current",
"Status of the current version."),
1638 ITEM(
"address", misc,
"IP address of this Tor host, if we can guess it."),
1639 ITEM(
"address/v4", misc,
1640 "IPv4 address of this Tor host, if we can guess it."),
1641 ITEM(
"address/v6", misc,
1642 "IPv6 address of this Tor host, if we can guess it."),
1643 ITEM(
"traffic/read", misc,
"Bytes read since the process was started."),
1644 ITEM(
"traffic/written", misc,
1645 "Bytes written since the process was started."),
1646 ITEM(
"uptime", misc,
"Uptime of the Tor daemon in seconds."),
1647 ITEM(
"process/pid", misc,
"Process id belonging to the main tor process."),
1648 ITEM(
"process/uid", misc,
"User id running the tor process."),
1649 ITEM(
"process/user", misc,
1650 "Username under which the tor process is running."),
1651 ITEM(
"process/descriptor-limit", misc,
"File descriptor limit."),
1652 ITEM(
"limits/max-mem-in-queues", misc,
"Actual limit on memory in queues"),
1653 PREFIX(
"desc-annotations/id/", dir,
"Router annotations by hexdigest."),
1654 PREFIX(
"dir/server/", dir,
"Router descriptors as retrieved from a DirPort."),
1655 PREFIX(
"dir/status/", dir,
1656 "v2 networkstatus docs as retrieved from a DirPort."),
1657 ITEM(
"dir/status-vote/current/consensus", dir,
1658 "v3 Networkstatus consensus as retrieved from a DirPort."),
1659 ITEM(
"dir/status-vote/current/consensus-microdesc", dir,
1660 "v3 Microdescriptor consensus as retrieved from a DirPort."),
1661 ITEM(
"exit-policy/default", policies,
1662 "The default value appended to the configured exit policy."),
1663 ITEM(
"exit-policy/reject-private/default", policies,
1664 "The default rules appended to the configured exit policy by"
1665 " ExitPolicyRejectPrivate."),
1666 ITEM(
"exit-policy/reject-private/relay", policies,
1667 "The relay-specific rules appended to the configured exit policy by"
1668 " ExitPolicyRejectPrivate and/or ExitPolicyRejectLocalInterfaces."),
1669 ITEM(
"exit-policy/full", policies,
"The entire exit policy of onion router"),
1670 ITEM(
"exit-policy/ipv4", policies,
"IPv4 parts of exit policy"),
1671 ITEM(
"exit-policy/ipv6", policies,
"IPv6 parts of exit policy"),
1672 PREFIX(
"ip-to-country/", geoip,
"Perform a GEOIP lookup"),
1673 ITEM(
"onions/current", onions,
1674 "Onion services owned by the current control connection."),
1675 ITEM(
"onions/detached", onions,
1676 "Onion services detached from the control connection."),
1677 ITEM(
"sr/current", sr,
"Get current shared random value."),
1678 ITEM(
"sr/previous", sr,
"Get previous shared random value."),
1679 PREFIX(
"stats/ntor/", rephist,
"NTor circuit handshake stats."),
1680 ITEM(
"stats/ntor/assigned", rephist,
1681 "Assigned NTor circuit handshake stats."),
1682 ITEM(
"stats/ntor/requested", rephist,
1683 "Requested NTor circuit handshake stats."),
1684 PREFIX(
"stats/tap/", rephist,
"TAP circuit handshake stats."),
1685 ITEM(
"stats/tap/assigned", rephist,
1686 "Assigned TAP circuit handshake stats."),
1687 ITEM(
"stats/tap/requested", rephist,
1688 "Requested TAP circuit handshake stats."),
1689 { NULL, NULL, NULL, 0 }
1712 smartlist_free(lines);
1723 const char *question,
char **answer,
1724 const char **err_out)
1760 const char *errmsg = NULL;
1764 errmsg =
"Internal error";
1775 "Unrecognized key \"%s\"", q);
1781 } SMARTLIST_FOREACH_END(q);
1785 if (smartlist_len(unrecognized)) {
char * tor_sockaddr_to_str(const struct sockaddr *sa)
char * tor_addr_to_str_dup(const tor_addr_t *addr)
void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, time_t max_expires, int want_expiry)
smartlist_t * list_authority_ids_with_downloads(void)
download_status_t * download_status_for_authority_id_and_sk(const char *id_digest, const char *sk_digest)
download_status_t * id_only_download_status_for_authority_id(const char *digest)
smartlist_t * list_sk_digests_for_authority_id(const char *digest)
Header file for authcert.c.
int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen)
void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
download_status_t * get_bridge_dl_status_by_id(const char *digest)
smartlist_t * list_bridge_identities(void)
Header file for circuitbuild.c.
Cached large directory object structure.
circuit_t * circuit_get_by_edge_conn(edge_connection_t *conn)
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *x)
smartlist_t * circuit_get_global_list(void)
Header file for circuitlist.c.
#define CIRCUIT_STATE_OPEN
#define CIRCUIT_IS_ORIGIN(c)
#define CIRCUIT_STATE_GUARD_WAIT
const char * get_torrc_fname(int defaults_fname)
char * options_dump(const or_options_t *options, int how_to_dump)
const or_options_t * get_options(void)
Header file for config.c.
Header file for connection.c.
#define CONN_TYPE_AP_HTTP_CONNECT_LISTENER
#define CONN_TYPE_DIR_LISTENER
#define CONN_TYPE_OR_LISTENER
#define CONN_TYPE_METRICS_LISTENER
#define CONN_TYPE_CONTROL_LISTENER
#define CONN_TYPE_EXT_OR_LISTENER
#define CONN_TYPE_AP_NATD_LISTENER
#define CONN_TYPE_AP_LISTENER
#define CONN_TYPE_AP_DNS_LISTENER
#define CONN_TYPE_AP_TRANS_LISTENER
entry_connection_t * TO_ENTRY_CONN(connection_t *c)
Header file for connection_edge.c.
#define AP_CONN_STATE_CONTROLLER_WAIT
#define AP_CONN_STATE_SOCKS_WAIT
#define AP_CONN_STATE_CONNECT_WAIT
#define AP_CONN_STATE_OPEN
#define AP_CONN_STATE_RESOLVE_WAIT
#define AP_CONN_STATE_CIRCUIT_WAIT
#define AP_CONN_STATE_NATD_WAIT
#define AP_CONN_STATE_RENDDESC_WAIT
or_connection_t * TO_OR_CONN(connection_t *c)
Header file for connection_or.c.
Header file for control.c.
char * control_event_boot_last_msg(void)
smartlist_t * get_detached_onion_services(void)
Header file for control_cmd.c.
Definition for control_cmd_args_t.
Controller connection structure.
const struct control_event_t control_event_table[]
Header file for control_events.c.
char * circuit_describe_status_for_controller(origin_circuit_t *circ)
void orconn_target_get_name(char *name, size_t len, or_connection_t *conn)
int write_stream_target_to_buf(entry_connection_t *conn, char *buf, size_t len)
Header file for control_fmt.c.
static int getinfo_helper_misc(control_connection_t *conn, const char *question, char **answer, const char **errmsg)
STATIC int getinfo_helper_rephist(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
STATIC void getinfo_helper_downloads_desc(const char *desc_req, download_status_t **dl_to_emit, smartlist_t **digest_list, const char **errmsg)
static const getinfo_item_t getinfo_items[]
static int getinfo_helper_listeners(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
static int getinfo_helper_liveness(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
static int getinfo_helper_sr(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
STATIC int getinfo_helper_downloads(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
static char * digest_list_to_string(const smartlist_t *sl)
int handle_control_getinfo(control_connection_t *conn, const control_cmd_args_t *args)
static int getinfo_helper_events(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
STATIC int getinfo_helper_current_time(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
STATIC void getinfo_helper_downloads_networkstatus(const char *flavor, download_status_t **dl_to_emit, const char **errmsg)
STATIC int getinfo_helper_dir(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
static int controller_get_routerdescs(smartlist_t *descs_out, const char *key, const char **msg)
static char * munge_extrainfo_into_routerinfo(const char *ri_body, const signed_descriptor_t *ri, const signed_descriptor_t *ei)
static int handle_getinfo_helper(control_connection_t *control_conn, const char *question, char **answer, const char **err_out)
static char * download_status_to_string(const download_status_t *dl)
STATIC void getinfo_helper_downloads_bridge(const char *bridge_req, download_status_t **dl_to_emit, smartlist_t **digest_list, const char **errmsg)
int(* getinfo_helper_t)(control_connection_t *, const char *q, char **a, const char **error_out)
STATIC int getinfo_helper_onions(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg)
STATIC int getinfo_helper_current_consensus(consensus_flavor_t flavor, char **answer, const char **errmsg)
static char * list_getinfo_options(void)
STATIC void getinfo_helper_downloads_cert(const char *fp_sk_req, download_status_t **dl_to_emit, smartlist_t **digest_list, const char **errmsg)
void control_write_endreply(control_connection_t *conn, int code, const char *s)
Header file for control_proto.c.
int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out, int add_space)
int directories_have_accepted_server_descriptor(void)
Header file for dirclient.c.
int dir_split_resource_into_fingerprints(const char *resource, smartlist_t *fp_out, int *compressed_out, int flags)
Header file for directory.c.
cached_dir_t * dirserv_get_consensus(const char *flavor_name)
Header file for dirserv.c.
time_t download_status_get_next_attempt_at(const download_status_t *dls)
Header file for dlstatus.c.
Entry connection structure.
#define ENTRY_TO_EDGE_CONN(c)
Header file for circuitbuild.c.
char * esc_for_log(const char *s)
Header file for geoip_stats.c.
char * geoip_get_bridge_stats_controller(time_t)
Header for getinfo_geoip.c.
void control_write_reply_lines(control_connection_t *conn, smartlist_t *lines)
void control_reply_add_printf(smartlist_t *reply, int code, const char *fmt,...)
#define control_reply_free(r)
Free and null a smartlist of control_reply_line_t.
void control_reply_add_one_kv(smartlist_t *reply, int code, int flags, const char *key, const char *val)
void control_reply_add_str(smartlist_t *reply, int code, const char *s)
void control_reply_add_done(smartlist_t *reply)
Header file for hibernate.c.
const char * hs_cache_lookup_encoded_as_client(const ed25519_public_key_t *key)
Header file for hs_cache.c.
int hs_parse_address(const char *address, ed25519_public_key_t *key_out, uint8_t *checksum_out, uint8_t *version_out)
int hs_address_is_valid(const char *address)
char * hs_service_lookup_current_desc(const ed25519_public_key_t *pk)
int have_completed_a_circuit(void)
uint64_t get_bytes_read(void)
smartlist_t * get_connection_array(void)
uint64_t get_bytes_written(void)
Header file for mainloop.c.
int we_fetch_router_descriptors(const or_options_t *options)
int we_fetch_microdescriptors(const or_options_t *options)
Header file for microdesc.c.
Microdescriptor structure.
download_status_t * networkstatus_get_dl_status_by_flavor_bootstrap(consensus_flavor_t flavor)
const char * networkstatus_get_flavor_name(consensus_flavor_t flav)
download_status_t * networkstatus_get_dl_status_by_flavor_running(consensus_flavor_t flavor)
int we_want_to_fetch_flavor(const or_options_t *options, int flavor)
download_status_t * router_get_dl_status_by_descriptor_digest(const char *d)
networkstatus_t * networkstatus_get_latest_consensus(void)
download_status_t * networkstatus_get_dl_status_by_flavor(consensus_flavor_t flavor)
tor_mmap_t * networkstatus_map_cached_consensus(const char *flavorname)
smartlist_t * router_get_descriptor_digests(void)
Header file for networkstatus.c.
Networkstatus consensus/vote structure.
Node information structure.
const smartlist_t * nodelist_get_list(void)
const node_t * node_get_by_nickname(const char *nickname, unsigned flags)
const node_t * node_get_by_hex_id(const char *hex_id, unsigned flags)
int router_have_minimum_dir_info(void)
Header file for nodelist.c.
Master header file for Tor-specific functionality.
#define ROUTER_MAX_AGE_TO_PUBLISH
#define OR_CONN_STATE_OPEN
Origin circuit structure.
Header file for policies.c.
int rep_hist_circbuilding_dormant(time_t now)
Header file for predict_ports.c.
int tor_asprintf(char **strp, const char *fmt,...)
bool relay_find_addr_to_publish(const or_options_t *options, int family, int flags, tor_addr_t *addr_out)
Header file for relay_find_addr.c.
int rep_hist_get_circuit_handshake_assigned(uint16_t type)
int rep_hist_get_circuit_handshake_requested(uint16_t type)
Header file for rephist.c.
extrainfo_t * router_get_my_extrainfo(void)
int router_extrainfo_digest_is_me(const char *digest)
int router_digest_is_me(const char *digest)
int router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e)
const routerinfo_t * router_get_my_routerinfo(void)
Header file for router.c.
Header file for routerinfo.c.
Router descriptor structure.
const char * signed_descriptor_get_body(const signed_descriptor_t *desc)
routerlist_t * router_get_routerlist(void)
signed_descriptor_t * router_get_by_descriptor_digest(const char *digest)
const routerinfo_t * router_get_by_id_digest(const char *digest)
const char * signed_descriptor_get_annotations(const signed_descriptor_t *desc)
static routerlist_t * routerlist
signed_descriptor_t * extrainfo_get_by_descriptor_digest(const char *digest)
Header file for routerlist.c.
Router descriptor list structure.
int server_mode(const or_options_t *options)
Header file for routermode.c.
int router_dirport_seems_reachable(const or_options_t *options)
Header file for selftest.c.
char * sr_get_previous_for_control(void)
char * sr_get_current_for_control(void)
Header file for shared_random_client.c.
void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern,...)
void smartlist_sort_strings(smartlist_t *sl)
char * smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, size_t *len_out)
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
int get_max_sockets(void)
Client request structure.
struct smartlist_t * args
smartlist_t * ephemeral_onion_services
download_want_authority_bitfield_t want_authority
download_schedule_increment_bitfield_t increment_on
uint8_t last_backoff_position
uint8_t n_download_attempts
uint8_t n_download_failures
download_schedule_bitfield_t schedule
socks_request_t * socks_request
uint32_t global_identifier
size_t signed_descriptor_len
void format_iso_time_nospace(char *buf, time_t t)
void format_iso_time(char *buf, time_t t)
void format_local_iso_time_nospace(char *buf, time_t t)
void tor_gettimeofday(struct timeval *timeval)
const char * get_version(void)
const struct passwd * tor_getpwuid(uid_t uid)
#define tor_fragile_assert()
int strcmpstart(const char *s1, const char *s2)
version_status_t tor_version_is_obsolete(const char *myversion, const char *versionlist)
Header file for versions.c.