Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2006 Pekka Riikonen
+ Copyright (C) 1997 - 2007 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Continue after last command reply received */
if (SILC_STATUS_IS_ERROR(status) || status == SILC_STATUS_OK ||
status == SILC_STATUS_LIST_END)
- SILC_FSM_CALL_CONTINUE(notify->fsm);
+ SILC_FSM_CALL_CONTINUE_SYNC(notify->fsm);
return TRUE;
}
if (!payload) {
SILC_LOG_DEBUG(("Malformed notify payload"));
silc_packet_free(packet);
- SILC_FSM_FINISH;
+ return SILC_FSM_FINISH;
}
if (!silc_notify_get_args(payload)) {
SILC_LOG_DEBUG(("Malformed notify %d", silc_notify_get_type(payload)));
silc_notify_payload_free(payload);
silc_packet_free(packet);
- SILC_FSM_FINISH;
+ return SILC_FSM_FINISH;
}
notify = silc_calloc(1, sizeof(*notify));
if (!notify) {
silc_notify_payload_free(payload);
silc_packet_free(packet);
- SILC_FSM_FINISH;
+ return SILC_FSM_FINISH;
}
- /* Save notify payload to packet context during processing */
notify->packet = packet;
notify->payload = payload;
notify->fsm = fsm;
silc_notify_payload_free(payload);
silc_packet_free(packet);
silc_free(notify);
- SILC_FSM_FINISH;
+ return SILC_FSM_FINISH;
break;
}
- SILC_FSM_YIELD;
+ return SILC_FSM_YIELD;
}
/* Notify processed, finish the packet processing thread */
silc_notify_payload_free(payload);
silc_packet_free(packet);
silc_free(notify);
- SILC_FSM_FINISH;
+ return SILC_FSM_FINISH;
}
/********************************** NONE ************************************/
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/********************************* INVITE ***********************************/
/** Notify processed */
silc_client_unref_channel(client, conn, channel);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/********************************** JOIN ************************************/
/** Notify processed */
silc_client_unref_channel(client, conn, channel);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/********************************** LEAVE ***********************************/
/** Notify processed */
silc_client_unref_channel(client, conn, channel);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/********************************* SIGNOFF **********************************/
SilcClient client = conn->client;
SilcClientNotify notify = state_context;
SilcNotifyPayload payload = notify->payload;
+ SilcPacket packet = notify->packet;
SilcNotifyType type = silc_notify_get_type(payload);
SilcArgumentPayload args = silc_notify_get_args(payload);
SilcClientEntry client_entry;
- unsigned char *tmp;
+ SilcChannelEntry channel;
+ unsigned char *tmp;
SilcUInt32 tmp_len;
SilcID id;
/* Notify application */
NOTIFY(client, conn, type, client_entry, tmp);
+ /* Remove from channel */
+ if (packet->dst_id_type == SILC_ID_CHANNEL) {
+ if (silc_id_str2id(packet->dst_id, packet->dst_id_len, SILC_ID_CHANNEL,
+ &id.u.channel_id, sizeof(id.u.channel_id))) {
+ channel = silc_client_get_channel_by_id(client, conn, &id.u.channel_id);
+ if (channel) {
+ silc_client_remove_from_channel(client, conn, channel, client_entry);
+ silc_client_unref_channel(client, conn, channel);
+ }
+ }
+ }
+
/* Delete client */
- silc_client_remove_from_channels(client, conn, client_entry);
silc_client_del_client(client, conn, client_entry);
silc_client_unref_client(client, conn, client_entry);
out:
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/******************************** TOPIC_SET *********************************/
/** Notify processed */
silc_client_unref_channel(client, conn, channel);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/****************************** NICK_CHANGE *********************************/
/** Notify processed */
silc_client_unref_client(client, conn, client_entry);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/****************************** CMODE_CHANGE ********************************/
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/***************************** CUMODE_CHANGE ********************************/
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/********************************* MOTD *************************************/
out:
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/**************************** CHANNEL CHANGE ********************************/
/** Notify processed */
silc_client_unref_channel(client, conn, channel);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/******************************** KICKED ************************************/
/** Notify processed */
silc_client_unref_channel(client, conn, channel);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/******************************** KILLED ************************************/
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/**************************** SERVER SIGNOFF ********************************/
/** Notify processed */
silc_client_list_free(client, conn, clients);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/******************************** ERROR *************************************/
out:
/** Notify processed */
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}
/******************************** WATCH *************************************/
/** Notify processed */
silc_client_unref_client(client, conn, client_entry);
silc_fsm_next(fsm, silc_client_notify_processed);
- SILC_FSM_CONTINUE;
+ return SILC_FSM_CONTINUE;
}