diff --git a/lib/include/chiaki/ctrl.h b/lib/include/chiaki/ctrl.h index a60fd02..2f740d0 100644 --- a/lib/include/chiaki/ctrl.h +++ b/lib/include/chiaki/ctrl.h @@ -22,6 +22,7 @@ #include "thread.h" #include +#include #ifdef __cplusplus extern "C" { diff --git a/lib/include/chiaki/session.h b/lib/include/chiaki/session.h index 47980c5..bd7ca76 100644 --- a/lib/include/chiaki/session.h +++ b/lib/include/chiaki/session.h @@ -102,7 +102,11 @@ typedef struct chiaki_session_t void *event_cb_user; ChiakiThread session_thread; + ChiakiCtrl ctrl; + ChiakiCond ctrl_cond; + ChiakiMutex ctrl_cond_mutex; + bool ctrl_session_id_received; ChiakiLog log; } ChiakiSession; diff --git a/lib/src/ctrl.c b/lib/src/ctrl.c index bb0b1f1..a9d49e0 100644 --- a/lib/src/ctrl.c +++ b/lib/src/ctrl.c @@ -59,6 +59,9 @@ static void *ctrl_thread_func(void *user) if(err != CHIAKI_ERR_SUCCESS) { chiaki_session_set_quit_reason(ctrl->session, CHIAKI_QUIT_REASON_CTRL_UNKNOWN); + chiaki_mutex_lock(&ctrl->session->ctrl_cond_mutex); + chiaki_cond_signal(&ctrl->session->ctrl_cond); + chiaki_mutex_unlock(&ctrl->session->ctrl_cond_mutex); return NULL; } @@ -140,6 +143,12 @@ static void ctrl_message_received(ChiakiCtrl *ctrl, uint16_t msg_type, uint8_t * static void ctrl_message_received_session_id(ChiakiCtrl *ctrl, uint8_t *payload, size_t payload_size) { + if(ctrl->session->ctrl_session_id_received) + { + CHIAKI_LOGW(&ctrl->session->log, "Received another Session Id Message\n"); + return; + } + if(payload_size < 2 || (char)payload[0] != 'J') { CHIAKI_LOGE(&ctrl->session->log, "Invalid Session Id received\n"); @@ -171,6 +180,10 @@ static void ctrl_message_received_session_id(ChiakiCtrl *ctrl, uint8_t *payload, memcpy(ctrl->session->session_id, payload, payload_size); ctrl->session->session_id[payload_size] = '\0'; + ctrl->session->ctrl_session_id_received = true; + chiaki_mutex_lock(&ctrl->session->ctrl_cond_mutex); + chiaki_cond_signal(&ctrl->session->ctrl_cond); + chiaki_mutex_unlock(&ctrl->session->ctrl_cond_mutex); CHIAKI_LOGI(&ctrl->session->log, "Received valid Session Id: %s\n", ctrl->session->session_id); } diff --git a/lib/src/session.c b/lib/src/session.c index bd15058..12cc95d 100644 --- a/lib/src/session.c +++ b/lib/src/session.c @@ -45,6 +45,17 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_session_init(ChiakiSession *session, Chiaki session->quit_reason = CHIAKI_QUIT_REASON_NONE; + if(chiaki_cond_init(&session->ctrl_cond) != CHIAKI_ERR_SUCCESS) + { + return CHIAKI_ERR_UNKNOWN; + } + + if(chiaki_mutex_init(&session->ctrl_cond_mutex) != CHIAKI_ERR_SUCCESS) + { + chiaki_cond_fini(&session->ctrl_cond); + return CHIAKI_ERR_UNKNOWN; + } + int r = getaddrinfo(connect_info->host, NULL, NULL, &session->connect_info.host_addrinfos); if(r != 0) { @@ -77,6 +88,8 @@ CHIAKI_EXPORT void chiaki_session_fini(ChiakiSession *session) { if(!session) return; + chiaki_cond_fini(&session->ctrl_cond); + chiaki_mutex_fini(&session->ctrl_cond_mutex); free(session->connect_info.regist_key); free(session->connect_info.ostype); freeaddrinfo(session->connect_info.host_addrinfos); @@ -121,12 +134,29 @@ static void *session_thread_func(void *arg) CHIAKI_LOGI(&session->log, "Starting ctrl\n"); + chiaki_mutex_lock(&session->ctrl_cond_mutex); + session->ctrl_session_id_received = false; + ChiakiErrorCode err = chiaki_ctrl_start(&session->ctrl, session); if(err != CHIAKI_ERR_SUCCESS) goto quit; - chiaki_ctrl_join(&session->ctrl); + chiaki_cond_wait(&session->ctrl_cond, &session->ctrl_cond_mutex); + chiaki_mutex_unlock(&session->ctrl_cond_mutex); + if(!session->ctrl_session_id_received) + { + CHIAKI_LOGE(&session->log, "Ctrl has failed, shutting down\n"); + chiaki_ctrl_join(&session->ctrl); + goto quit_ctrl; + } + + CHIAKI_LOGI(&session->log, "Looking good, we should now start the Senkusha\n"); + + + +quit_ctrl: + chiaki_ctrl_join(&session->ctrl); CHIAKI_LOGI(&session->log, "Ctrl stopped\n"); ChiakiEvent quit_event;