static void _torControlCircuitBuild_circEvent(gpointer moduleData, gint code, gchar* line, gint circID, GString* path, gint status, gint buildFlags, gint purpose, gint reason, GDateTime* createTime) { TorCtlCircuitBuild *circuitBuild = moduleData; ShadowLogFunc log = circuitBuild->log; log(G_LOG_LEVEL_DEBUG, __FUNCTION__, "[%d] CIRC: circID=%d status=%d buildFlags=%d purpose=%d reason=%d", code, circID, status, buildFlags, purpose, reason); /* if our circuit was closed, build new one */ if(status == TORCTL_CIRC_STATUS_CLOSED) { TorCtlCircuitBuild_Circuit *circuit = NULL; for(GList *iter = g_list_first(circuitBuild->circuits); iter && !circuit; iter = g_list_next(iter)) { TorCtlCircuitBuild_Circuit *tmp = iter->data; if(tmp->circID == circID) { circuit = tmp; } } if(circuit) { log(G_LOG_LEVEL_MESSAGE, __FUNCTION__, "circuit %d closed, rebuilding", circuit->circID); g_queue_push_tail(circuitBuild->circuitsToBuild, circuit); if(g_queue_get_length(circuitBuild->circuitsToBuild) == 1) { torControl_buildCircuit(circuitBuild->sockd, circuit->relays); } circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID; } } }
static void _torControlCircuitBuild_circEvent(gpointer moduleData, gint code, gchar* line, gint circID, GString* path, gint status, gint buildFlags, gint purpose, gint reason, GDateTime* createTime) { TorCtlCircuitBuild *circuitBuild = moduleData; ShadowLogFunc log = circuitBuild->log; log(G_LOG_LEVEL_DEBUG, __FUNCTION__, "[%d] CIRC: circID=%d status=%d buildFlags=%d purpose=%d reason=%d", code, circID, status, buildFlags, purpose, reason); /* if our circuit was closed, build new one */ if(circID == circuitBuild->circID && status == TORCTL_CIRC_STATUS_CLOSED) { torControl_buildCircuit(circuitBuild->sockd, circuitBuild->circuit); circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID; } }
static void _torControlCircuitBuild_statusEvent(gpointer moduleData, gint code, gchar* line, gint type, gint severity, gchar *action, GHashTable *arguments) { TorCtlCircuitBuild *circuitBuild = moduleData; ShadowLogFunc log = circuitBuild->log; if(type == TORCTL_STATUS_TYPE_CLIENT && !g_ascii_strcasecmp(action, "BOOTSTRAP")) { gchar *progress = g_hash_table_lookup(arguments, "PROGRESS"); if(!progress) { log(G_LOG_LEVEL_WARNING, __FUNCTION__, "Could not find argument PROGRESS in bootstrap status"); } else if(!g_ascii_strcasecmp(progress, "100")) { circuitBuild->bootstrapped = TRUE; torControl_buildCircuit(circuitBuild->sockd, circuitBuild->circuit); circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID; } } }
static void _torControlCircuitBuild_responseEvent(gpointer moduleData, GList *reply, gpointer userData) { TorCtlCircuitBuild *circuitBuild = moduleData; ShadowLogFunc log = circuitBuild->log; TorControl_ReplyLine *replyLine = g_list_first(reply)->data; switch(TORCTL_CODE_TYPE(replyLine->code)) { case TORCTL_REPLY_ERROR: { log(G_LOG_LEVEL_WARNING, __FUNCTION__, "[%d] ERROR: %s", replyLine->code, replyLine->body); break; } case TORCTL_REPLY_SUCCESS: { log(G_LOG_LEVEL_MESSAGE, __FUNCTION__, "[%d] SUCCESS: %s", replyLine->code, replyLine->body); switch(circuitBuild->state) { case TORCTL_CIRCBUILD_STATE_AUTHENTICATE: case TORCTL_CIRCBUILD_STATE_SETCONFS: case TORCTL_CIRCBUILD_STATE_SETEVENTS: circuitBuild->state = circuitBuild->nextState; circuitBuild->waitingForResponse = FALSE; break; case TORCTL_CIRCBUILD_STATE_CHECKSTATUS: { if(userData) { TorControl_BootstrapPhase *phase = userData; if(phase->progress == 100) { circuitBuild->bootstrapped = TRUE; torControl_buildCircuit(circuitBuild->sockd, circuitBuild->circuit); circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID; } else { circuitBuild->state = TORCTL_CIRCBUILD_STATE_CREATE_CIRCUIT; } } break; } case TORCTL_CIRCBUILD_STATE_GET_CIRC_ID: { if(userData) { TorControl_ReplyExtended *extended = userData; circuitBuild->circID = extended->circID; circuitBuild->state = TORCTL_CIRCBUILD_STATE_ATTACH_STREAMS; /* go through and reattach streams to this circuit */ for(GList *iter = circuitBuild->streamsToAttach; iter; iter = g_list_next(iter)) { gint streamID = (gint)iter->data; torControl_attachStream(circuitBuild->sockd, streamID, circuitBuild->circID); } g_list_free(circuitBuild->streamsToAttach); circuitBuild->streamsToAttach = NULL; } break; } case TORCTL_CIRCBUILD_STATE_CREATE_CIRCUIT: case TORCTL_CIRCBUILD_STATE_ATTACH_STREAMS: break; } } /* make sure we proceed with the next state */ _torControlCircuitBuild_initialize(moduleData); break; } }