const char **summary)
{
switch (s) {
+ case BOOTSTRAP_STATUS_UNDEF:
+ *tag = "undef";
+ *summary = "Undefined";
+ break;
case BOOTSTRAP_STATUS_STARTING:
*tag = "starting";
*summary = "Starting";
/** What percentage through the bootstrap process are we? We remember
* this so we can avoid sending redundant bootstrap status events, and
* so we can guess context for the bootstrap messages which are
- * ambiguous. */
-static int bootstrap_percent = 0;
+ * ambiguous. It starts at 'undef', but gets set to 'starting' while
+ * Tor initializes. */
+static int bootstrap_percent = BOOTSTRAP_STATUS_UNDEF;
/** How many problems have we had getting to the next bootstrapping phase?
* These include failure to establish a connection to a Tor relay,
const char *tag, *summary;
char buf[BOOTSTRAP_MSG_LEN];
- if (bootstrap_percent == 100)
+ if (bootstrap_percent == BOOTSTRAP_STATUS_DONE)
return; /* already bootstrapped; nothing to be done here. */
/* special case for handshaking status, since our TLS handshaking code
if (++bootstrap_problems != BOOTSTRAP_PROBLEM_THRESHOLD)
return; /* no worries yet */
- while (bootstrap_status_to_string(status, &tag, &summary) < 0)
+ while (status>=0 && bootstrap_status_to_string(status, &tag, &summary) < 0)
status--; /* find a recognized status string based on current progress */
log_warn(LD_CONTROL, "Problem bootstrapping. Stuck at %d%%: %s. (%s; %s)",
/** Enum describing various stages of bootstrapping, for use with controller
* bootstrap status events. The values range from 0 to 100. */
typedef enum {
- BOOTSTRAP_STATUS_STARTING=1,
+ BOOTSTRAP_STATUS_UNDEF=-1,
+ BOOTSTRAP_STATUS_STARTING=0,
BOOTSTRAP_STATUS_CONN_DIR=5,
- BOOTSTRAP_STATUS_HANDSHAKE=-1,
+ BOOTSTRAP_STATUS_HANDSHAKE=-2,
BOOTSTRAP_STATUS_HANDSHAKE_DIR=10,
BOOTSTRAP_STATUS_ONEHOP_CREATE=15,
BOOTSTRAP_STATUS_REQUESTING_STATUS=20,