static gboolean _torControlCircuitBuild_initialize(gpointer moduleData) {
    TorCtlCircuitBuild *circuitBuild = moduleData;
    ShadowLogFunc log = circuitBuild->log;

    gint sockd = circuitBuild->sockd;
    gboolean initialized = 0;

    if(circuitBuild->waitingForResponse) {
        return 0;
    }

    switch(circuitBuild->state) {
        case TORCTL_CIRCBUILD_STATE_AUTHENTICATE: {
            /* authenticate with the control */
            if(torControl_authenticate(sockd, "password") > 0) {
                circuitBuild->nextState = TORCTL_CIRCBUILD_STATE_SETCONFS;
                circuitBuild->waitingForResponse = TRUE;
            }
            break;
        }

        case TORCTL_CIRCBUILD_STATE_SETCONFS: {
            /* set configuration variables */
            gchar *confValues[7] = {"__LeaveStreamsUnattached", "1", "ExcludeSingleHopRelays", "0", "AllowSingleHopCircuits", "1", NULL};
            if(torControl_setconf(sockd, confValues) > 0) {
                circuitBuild->nextState = TORCTL_CIRCBUILD_STATE_SETEVENTS;
                circuitBuild->waitingForResponse = TRUE;
            }
            break;
        }

        case TORCTL_CIRCBUILD_STATE_SETEVENTS: {
            /* send list of events to listen on */
            if(torControl_setevents(sockd, "CIRC STREAM STATUS_CLIENT") > 0) {
                circuitBuild->nextState = TORCTL_CIRCBUILD_STATE_CHECKSTATUS;
                circuitBuild->waitingForResponse = TRUE;
            }
            break;
        }

        case TORCTL_CIRCBUILD_STATE_CHECKSTATUS: {
            /* check the bootstrap status of the node */
            if(torControl_getInfoBootstrapStatus(sockd) > 0) {
                circuitBuild->nextState = TORCTL_CIRCBUILD_STATE_CREATE_CIRCUIT;
                circuitBuild->waitingForResponse = TRUE;
                initialized = TRUE;
            }
            break;
        }

        case TORCTL_CIRCBUILD_STATE_CREATE_CIRCUIT:
        case TORCTL_CIRCBUILD_STATE_GET_CIRC_ID:
        case TORCTL_CIRCBUILD_STATE_ATTACH_STREAMS:
        	break;
    }

    return initialized;
}
static gboolean _torcontrollogger_manageState(TorControlLogger* tcl) {

	beginmanage: switch (tcl->currentState) {

	case TCS_SEND_AUTHENTICATE: {
		/* authenticate with the control port */
		if (torControl_authenticate(tcl->targetSockd, "password") > 0) {
			/* idle until we receive the response, then move to next state */
			tcl->currentState = TCS_IDLE;
			tcl->nextState = TCS_RECV_AUTHENTICATE;
		}
		break;
	}

	case TCS_RECV_AUTHENTICATE: {
		tcl->currentState = TCS_SEND_SETEVENTS;
		goto beginmanage;
		break;
	}

	case TCS_SEND_SETEVENTS: {
		/* send list of events to listen on */
		GString* events = g_string_new("CIRC STREAM ORCONN BW STREAM_BW CIRC_MINOR BUILDTIMEOUT_SET CLIENTS_SEEN GUARD");
		if (torControl_setevents(tcl->targetSockd, events->str) > 0) {
			/* idle until we receive the response, then move to next state */
			tcl->currentState = TCS_IDLE;
			tcl->nextState = TCS_RECV_SETEVENTS;
			tcl->log(G_LOG_LEVEL_CRITICAL, __FUNCTION__, "set tor control events '%s'", events->str);
		}
		g_string_free(events, TRUE);
		break;
	}

	case TCS_RECV_SETEVENTS: {
		/* all done */
		tcl->currentState = TCS_IDLE;
		tcl->nextState = TCS_IDLE;
		goto beginmanage;
		break;
	}

	case TCS_IDLE: {
		if (tcl->nextState == TCS_IDLE) {
			return TRUE;
		}
		break;
	}

	default:
		break;
	}

	return FALSE;
}
static gboolean _torcontrollogger_manageState(TorControlLogger* tcl) {

	beginmanage: switch (tcl->currentState) {

	case TCLS_SEND_AUTHENTICATE: {
		/* authenticate with the control port */
		if (torControl_authenticate(tcl->targetSockd, "password") > 0) {
			/* idle until we receive the response, then move to next state */
			tcl->currentState = TCLS_IDLE;
			tcl->nextState = TCLS_RECV_AUTHENTICATE;
		}
		break;
	}

	case TCLS_RECV_AUTHENTICATE: {
		tcl->currentState = TCLS_SEND_SETEVENTS;
		goto beginmanage;
		break;
	}

	case TCLS_SEND_SETEVENTS: {
		/* send list of events to listen on */
		if (torControl_setevents(tcl->targetSockd, tcl->torctlEvents) > 0) {
			/* idle until we receive the response, then move to next state */
			tcl->currentState = TCLS_IDLE;
			tcl->nextState = TCLS_RECV_SETEVENTS;
			tcl->log(SHADOW_LOG_LEVEL_MESSAGE, __FUNCTION__, "set tor control events '%s'", tcl->torctlEvents);
		}
		break;
	}

	case TCLS_RECV_SETEVENTS: {
		/* all done */
		tcl->currentState = TCLS_IDLE;
		tcl->nextState = TCLS_IDLE;
		goto beginmanage;
		break;
	}

	case TCLS_IDLE: {
		if (tcl->nextState == TCLS_IDLE) {
			return TRUE;
		}
		break;
	}

	default:
		break;
	}

	return FALSE;
}