From: Pekka Riikonen Date: Wed, 30 Jan 2002 17:52:44 +0000 (+0000) Subject: updates. X-Git-Tag: silc.toolkit.0.7.3~3 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=3b7e91692359215ef5e701b2c2ee50f4ff440944 updates. --- diff --git a/CHANGES b/CHANGES index fd930fb9..410909db 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +Wed Jan 30 19:14:31 EET 2002 Pekka Riikonen + + * Fixed founder regaining problem with JOIN command on normal + server. The notify for mode change must be sent always and + not only if !cmd->pending. Affected file silcd/command.c. + Wed Jan 30 11:11:47 CET 2002 Pekka Riikonen * When sending JOIN command to router for processing the diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 9ceb7caa..51855573 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -1083,36 +1083,53 @@ silc_server_command_whowas_send_reply(SilcServerCommandContext cmd, { SilcServer server = cmd->server; char *tmp; - int i, count = 0, len; + int i, k, count = 0, len; SilcBuffer packet, idp; SilcClientEntry entry = NULL; SilcCommandStatus status; uint16 ident = silc_command_get_ident(cmd->payload); - char found = FALSE; char nh[256], uh[256]; + int valid_count; status = SILC_STATUS_OK; - if (clients_count > 1) - status = SILC_STATUS_LIST_START; + /* Process only entries that are not registered anymore. */ + valid_count = 0; for (i = 0; i < clients_count; i++) { - entry = clients[i]; + if (clients[i]->data.status & SILC_IDLIST_STATUS_REGISTERED) + clients[i] = NULL; + else + valid_count++; + } - /* We will take only clients that are not valid anymore. They are the - ones that are not registered anymore but still have a ID. They - have disconnected us, and thus valid for WHOWAS. */ - if (entry->data.status & SILC_IDLIST_STATUS_REGISTERED || !entry->id) - continue; + if (!valid_count) { + /* No valid entries found at all, just send error */ + unsigned char *tmp; + + tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); + if (tmp) + silc_server_command_send_status_data(cmd, SILC_COMMAND_WHOWAS, + SILC_STATUS_ERR_NO_SUCH_NICK, + 3, tmp, strlen(tmp)); + return; + } - if (count && i - 1 == count) - break; + if (valid_count > 1) + status = SILC_STATUS_LIST_START; - found = TRUE; + for (i = 0, k = 0; i < clients_count; i++) { + entry = clients[i]; + if (!entry) + continue; - if (clients_count > 2) + if (k >= 1) status = SILC_STATUS_LIST_ITEM; - if (clients_count > 1 && i == clients_count - 1) + if (valid_count > 1 && k == valid_count - 1) + status = SILC_STATUS_LIST_END; + if (count && k - 1 == count) status = SILC_STATUS_LIST_END; + if (count && k - 1 > count) + break; /* Send WHOWAS reply */ idp = silc_id_payload_encode(entry->id, SILC_ID_CLIENT); @@ -1153,13 +1170,9 @@ silc_server_command_whowas_send_reply(SilcServerCommandContext cmd, silc_buffer_free(packet); silc_buffer_free(idp); - } - if (found == FALSE && entry) - silc_server_command_send_status_data(cmd, SILC_COMMAND_WHOWAS, - SILC_STATUS_ERR_NO_SUCH_NICK, - 3, entry->nickname, - strlen(entry->nickname)); + k++; + } } static int @@ -3252,24 +3265,24 @@ static void silc_server_command_join_channel(SilcServer server, /* Distribute the channel key to all backup routers. */ silc_server_backup_send(server, NULL, SILC_PACKET_CHANNEL_KEY, 0, keyp->data, keyp->len, FALSE, TRUE); + } - /* If client became founder by providing correct founder auth data - notify the mode change to the channel. */ - if (founder) { - SILC_PUT32_MSB(chl->mode, mode); - silc_server_send_notify_to_channel(server, NULL, channel, FALSE, - SILC_NOTIFY_TYPE_CUMODE_CHANGE, 3, - clidp->data, clidp->len, - mode, 4, clidp->data, clidp->len); + /* If client became founder by providing correct founder auth data + notify the mode change to the channel. */ + if (founder) { + SILC_PUT32_MSB(chl->mode, mode); + silc_server_send_notify_to_channel(server, NULL, channel, FALSE, + SILC_NOTIFY_TYPE_CUMODE_CHANGE, 3, + clidp->data, clidp->len, + mode, 4, clidp->data, clidp->len); - /* Set CUMODE notify type to network */ - if (!server->standalone) - silc_server_send_notify_cumode(server, server->router->connection, - server->server_type == SILC_ROUTER ? - TRUE : FALSE, channel, - chl->mode, client->id, SILC_ID_CLIENT, - client->id); - } + /* Set CUMODE notify type to network */ + if (!server->standalone) + silc_server_send_notify_cumode(server, server->router->connection, + server->server_type == SILC_ROUTER ? + TRUE : FALSE, channel, + chl->mode, client->id, SILC_ID_CLIENT, + client->id); } silc_buffer_free(reply); @@ -3397,6 +3410,7 @@ SILC_SERVER_CMD_FUNC(join) silc_server_command_dup(cmd)); cmd->pending = TRUE; silc_command_set_ident(cmd->payload, old_ident); + silc_buffer_free(tmpbuf); goto out; } @@ -3460,8 +3474,8 @@ SILC_SERVER_CMD_FUNC(join) if (silc_command_get(reply->payload) == SILC_COMMAND_JOIN) { tmp = silc_argument_get_arg_type(reply->args, 6, NULL); SILC_GET32_MSB(created, tmp); - if (silc_argument_get_arg_type(reply->args, 7, NULL) - create_key = FALSE; /* Router returned the key already */ + if (silc_argument_get_arg_type(reply->args, 7, NULL)) + create_key = FALSE; /* Router returned the key already */ } if (silc_command_get(reply->payload) == SILC_COMMAND_WHOIS && diff --git a/apps/silcd/command_reply.c b/apps/silcd/command_reply.c index d9fbe6a8..68e61433 100644 --- a/apps/silcd/command_reply.c +++ b/apps/silcd/command_reply.c @@ -895,8 +895,8 @@ SILC_SERVER_CMD_REPLY_FUNC(join) /* The entry exists. */ /* If ID has changed, then update it to the cache too. */ - if (!SILC_ID_CHANNEL_COMPARE(channel->id, id)) - silc_idlist_replace_channel_id(server->local_list, channel->id, id); + if (!SILC_ID_CHANNEL_COMPARE(entry->id, id)) + silc_idlist_replace_channel_id(server->local_list, entry->id, id); entry->disabled = FALSE; @@ -917,8 +917,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join) /* Get the ban list */ tmp = silc_argument_get_arg_type(cmd->args, 8, &len); if (tmp) { - if (entry->ban_list) - silc_free(entry->ban_list); + silc_free(entry->ban_list); entry->ban_list = silc_calloc(len, sizeof(*entry->ban_list)); memcpy(entry->ban_list, tmp, len); } @@ -926,8 +925,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join) /* Get the invite list */ tmp = silc_argument_get_arg_type(cmd->args, 9, &len); if (tmp) { - if (entry->invite_list) - silc_free(entry->invite_list); + silc_free(entry->invite_list); entry->invite_list = silc_calloc(len, sizeof(*entry->invite_list)); memcpy(entry->invite_list, tmp, len); } @@ -935,8 +933,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join) /* Get the topic */ tmp = silc_argument_get_arg_type(cmd->args, 10, &len); if (tmp) { - if (entry->topic) - silc_free(entry->topic); + silc_free(entry->topic); entry->topic = strdup(tmp); } diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index 964df180..d5867f13 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -1376,9 +1376,8 @@ void silc_client_close_connection(SilcClient client, if (conn->server_cache) silc_idcache_free(conn->server_cache); - /* Free data (my ID is freed in above silc_client_del_client) */ - if (conn->nickname) - silc_free(conn->nickname); + /* Free data (my ID is freed in above silc_client_del_client). + conn->nickname is freed when freeing the local_entry->nickname. */ if (conn->remote_host) silc_free(conn->remote_host); if (conn->local_id_data) @@ -1509,7 +1508,7 @@ void silc_client_receive_new_id(SilcClient client, if (!conn->local_entry) conn->local_entry = silc_calloc(1, sizeof(*conn->local_entry)); - conn->local_entry->nickname = strdup(conn->nickname); + conn->local_entry->nickname = conn->nickname; if (!conn->local_entry->username) conn->local_entry->username = strdup(client->username); if (!conn->local_entry->hostname) diff --git a/prepare b/prepare index c3ab1ef9..191a915d 100755 --- a/prepare +++ b/prepare @@ -37,7 +37,7 @@ # SILC Distribution versions. Set here or give the version on the command # line as argument. # -SILC_VERSION=0.7.2 # Base version +SILC_VERSION=0.7.3 # Base version #############################################################################