X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_register.c;h=f029c480079c3fcabb022d257229329e7fc90bce;hb=49bd4f6cd6a28a9bcb8081eaef48567538ba486f;hp=c5f4cfc95dbe5a61ce4912ab631beb7e53d0c4e5;hpb=22df1889422ee8031d08d1d6f08117c79dbade96;p=silc.git diff --git a/lib/silcclient/client_register.c b/lib/silcclient/client_register.c index c5f4cfc9..f029c480 100644 --- a/lib/silcclient/client_register.c +++ b/lib/silcclient/client_register.c @@ -144,7 +144,7 @@ SILC_FSM_STATE(silc_client_new_id) out: /** Packet processed */ silc_packet_free(packet); - return SILC_FSM_FINISH; + SILC_FSM_FINISH; } @@ -170,14 +170,14 @@ SILC_FSM_STATE(silc_client_st_register) SILC_STR_END)) { /** Error sending packet */ silc_fsm_next(fsm, silc_client_st_register_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } /** Wait for new ID */ conn->internal->registering = TRUE; silc_fsm_next_later(fsm, silc_client_st_register_complete, conn->internal->retry_timer, 0); - return SILC_FSM_WAIT; + SILC_FSM_WAIT; } /* Wait for NEW_ID packet to arrive */ @@ -190,7 +190,7 @@ SILC_FSM_STATE(silc_client_st_register_complete) if (conn->internal->disconnected) { /** Disconnected */ silc_fsm_next(fsm, silc_client_st_register_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } if (!conn->local_id) { @@ -200,7 +200,7 @@ SILC_FSM_STATE(silc_client_st_register_complete) conn->internal->retry_count = 0; conn->internal->retry_timer = SILC_CLIENT_RETRY_MIN; silc_fsm_next(fsm, silc_client_st_register_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } /** Resend registering packet */ @@ -209,7 +209,7 @@ SILC_FSM_STATE(silc_client_st_register_complete) SILC_CLIENT_RETRY_MUL) + (silc_rng_get_rn16(client->rng) % SILC_CLIENT_RETRY_RAND)); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } SILC_LOG_DEBUG(("Registered to network")); @@ -243,7 +243,7 @@ SILC_FSM_STATE(silc_client_st_register_complete) silc_schedule_task_del_by_all(conn->internal->schedule, 0, silc_client_connect_timeout, conn); - return SILC_FSM_FINISH; + SILC_FSM_FINISH; } /* Error registering to network */ @@ -258,7 +258,7 @@ SILC_FSM_STATE(silc_client_st_register_error) /* Signal to close connection */ if (!conn->internal->disconnected) { conn->internal->disconnected = TRUE; - SILC_FSM_SEMA_POST(&conn->internal->wait_event); + SILC_FSM_EVENT_SIGNAL(&conn->internal->wait_event); } /* Call connect callback */ @@ -270,7 +270,7 @@ SILC_FSM_STATE(silc_client_st_register_error) silc_schedule_task_del_by_all(conn->internal->schedule, 0, silc_client_connect_timeout, conn); - return SILC_FSM_FINISH; + SILC_FSM_FINISH; } /************************* Resume detached session **************************/ @@ -294,7 +294,7 @@ SILC_FSM_STATE(silc_client_st_resume) if (!resume) { /** Out of memory */ silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } silc_fsm_set_state_context(fsm, resume); @@ -316,7 +316,7 @@ SILC_FSM_STATE(silc_client_st_resume) /** Malformed detach data */ SILC_LOG_DEBUG(("Malformed detachment data")); silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } if (!silc_id_str2id(id, id_len, SILC_ID_CLIENT, &client_id, @@ -324,7 +324,7 @@ SILC_FSM_STATE(silc_client_st_resume) /** Malformed ID */ SILC_LOG_DEBUG(("Malformed ID")); silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } /* Generate authentication data that server will verify */ @@ -336,7 +336,7 @@ SILC_FSM_STATE(silc_client_st_resume) if (!auth) { /** Out of memory */ silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } /* Send RESUME_CLIENT packet to resume to network */ @@ -349,13 +349,13 @@ SILC_FSM_STATE(silc_client_st_resume) /** Error sending packet */ SILC_LOG_DEBUG(("Error sending packet")); silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } /** Wait for new ID */ conn->internal->registering = TRUE; silc_fsm_next_later(fsm, silc_client_st_resume_resolve_channels, 15, 0); - return SILC_FSM_WAIT; + SILC_FSM_WAIT; } /* Resolve the old session information, user mode and joined channels. */ @@ -372,16 +372,19 @@ SILC_FSM_STATE(silc_client_st_resume_resolve_channels) if (conn->internal->disconnected) { /** Disconnected */ silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } if (!conn->local_id) { /** Timeout, ID not received */ conn->internal->registering = FALSE; silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } + /** Wait for channels */ + silc_fsm_next(fsm, silc_client_st_resume_resolve_cmodes); + /* Change our nickname */ silc_client_change_nickname(client, conn, conn->local_entry, resume->nickname, NULL, NULL, 0); @@ -393,6 +396,9 @@ SILC_FSM_STATE(silc_client_st_resume_resolve_channels) 1, 1, silc_buffer_data(conn->internal->local_idp), silc_buffer_len(conn->internal->local_idp)); + if (!resume->channel_count) + SILC_FSM_YIELD; + /* Send IDENTIFY command for all channels we know about. These are the channels we've joined to according our detachment data. */ for (i = 0; i < resume->channel_count; i++) { @@ -447,9 +453,7 @@ SILC_FSM_STATE(silc_client_st_resume_resolve_channels) silc_free(res_argv_lens); silc_free(res_argv_types); - /** Wait for channels */ - silc_fsm_next(fsm, silc_client_st_resume_resolve_cmodes); - return SILC_FSM_WAIT; + SILC_FSM_WAIT; } /* Resolve joined channel modes, users and topics. */ @@ -467,7 +471,7 @@ SILC_FSM_STATE(silc_client_st_resume_resolve_cmodes) if (conn->internal->disconnected) { /** Disconnected */ silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } SILC_LOG_DEBUG(("Resolving channel details")); @@ -476,7 +480,7 @@ SILC_FSM_STATE(silc_client_st_resume_resolve_cmodes) silc_fsm_next(fsm, silc_client_st_resume_completed); if (!silc_idcache_get_all(conn->internal->channel_cache, &channels)) - return SILC_FSM_CONTINUE; + SILC_FSM_YIELD; /* Resolve channels' mode, users and topic */ resume->channel_count = silc_list_count(channels) * 3; @@ -502,7 +506,7 @@ SILC_FSM_STATE(silc_client_st_resume_resolve_cmodes) silc_buffer_free(idp); } - return SILC_FSM_WAIT; + SILC_FSM_WAIT; } /* Resuming completed */ @@ -519,13 +523,13 @@ SILC_FSM_STATE(silc_client_st_resume_completed) if (conn->internal->disconnected) { /** Disconnected */ silc_fsm_next(fsm, silc_client_st_resume_error); - return SILC_FSM_CONTINUE; + SILC_FSM_CONTINUE; } if (resume->channel_count > 0) { resume->channel_count--; if (resume->channel_count) - return SILC_FSM_WAIT; + SILC_FSM_WAIT; } SILC_LOG_DEBUG(("Resuming completed")); @@ -548,6 +552,11 @@ SILC_FSM_STATE(silc_client_st_resume_completed) conn->callback(client, conn, SILC_CLIENT_CONN_SUCCESS_RESUME, 0, NULL, conn->callback_context); + /* Call UMODE command reply. */ + if (conn->local_entry->mode) + silc_client_resume_command_callback(client, conn, SILC_COMMAND_UMODE, + conn->local_entry->mode); + /* Call NICK command reply. */ silc_client_resume_command_callback(client, conn, SILC_COMMAND_NICK, conn->local_entry, @@ -582,7 +591,7 @@ SILC_FSM_STATE(silc_client_st_resume_completed) silc_free(resume->nickname); silc_free(resume); - return SILC_FSM_FINISH; + SILC_FSM_FINISH; } /* Error resuming to network */ @@ -598,7 +607,7 @@ SILC_FSM_STATE(silc_client_st_resume_error) silc_free(resume->nickname); silc_free(resume); } - return SILC_FSM_FINISH; + SILC_FSM_FINISH; } SILC_LOG_DEBUG(("Error resuming to network")); @@ -606,7 +615,7 @@ SILC_FSM_STATE(silc_client_st_resume_error) /* Signal to close connection */ if (!conn->internal->disconnected) { conn->internal->disconnected = TRUE; - SILC_FSM_SEMA_POST(&conn->internal->wait_event); + SILC_FSM_EVENT_SIGNAL(&conn->internal->wait_event); } /* Call connect callback */ @@ -623,7 +632,7 @@ SILC_FSM_STATE(silc_client_st_resume_error) silc_free(resume); } - return SILC_FSM_FINISH; + SILC_FSM_FINISH; } /* Generates the session detachment data. This data can be used later