Set user mode correctly to local entry in OPER/SILCOPER reply.
[crypto.git] / lib / silcclient / command_reply.c
index 73e45893ef9f4011f0eb460b2b0b74453ba9c2f0..dd68d9ced409c98d23b3a67a913ea0b13d559237 100644 (file)
@@ -514,7 +514,7 @@ SILC_FSM_STATE(silc_client_command_reply_whois)
 
   silc_client_unref_client(client, conn, client_entry);
   if (has_channels) {
-    silc_dlist_uninit(channel_list);
+    silc_channel_payload_list_free(channel_list);
     silc_free(umodes);
   }
 
@@ -1252,8 +1252,8 @@ SILC_FSM_STATE(silc_client_command_reply_join)
   }
 
   /* Get channel mode */
-  tmp = silc_argument_get_arg_type(args, 5, NULL);
-  if (tmp)
+  tmp = silc_argument_get_arg_type(args, 5, &len);
+  if (tmp && len == 4)
     SILC_GET32_MSB(mode, tmp);
   channel->mode = mode;
 
@@ -1440,6 +1440,11 @@ SILC_FSM_STATE(silc_client_command_reply_cmode)
     goto out;
   }
 
+  /* Get founder public key */
+  tmp = silc_argument_get_arg_type(args, 4, &len);
+  if (tmp)
+    silc_public_key_payload_decode(tmp, len, &public_key);
+
   /* Get channel mode */
   tmp = silc_argument_get_arg_type(args, 3, &len);
   if (!tmp || len != 4) {
@@ -1447,11 +1452,6 @@ SILC_FSM_STATE(silc_client_command_reply_cmode)
     goto out;
   }
 
-  /* Get founder public key */
-  tmp = silc_argument_get_arg_type(args, 4, &len);
-  if (tmp)
-    silc_public_key_payload_decode(tmp, len, &public_key);
-
   silc_rwlock_wrlock(channel->internal.lock);
 
   /* Save the mode */
@@ -1623,6 +1623,9 @@ SILC_FSM_STATE(silc_client_command_reply_silcoper)
   CHECK_STATUS("Cannot change mode: ");
   CHECK_ARGS(1, 1);
 
+  /* Set user mode */
+  cmd->conn->local_entry->mode |= SILC_UMODE_ROUTER_OPERATOR;
+
   /* Notify application */
   silc_client_command_callback(cmd);
 
@@ -1642,6 +1645,9 @@ SILC_FSM_STATE(silc_client_command_reply_oper)
   CHECK_STATUS("Cannot change mode: ");
   CHECK_ARGS(1, 1);
 
+  /* Set user mode */
+  cmd->conn->local_entry->mode |= SILC_UMODE_SERVER_OPERATOR;
+
   /* Notify application */
   silc_client_command_callback(cmd);