532 lines
15 KiB
C++
532 lines
15 KiB
C++
#include <uhub.h>
|
|
static struct user* g_user = 0;
|
|
static const char* test_string1 = "IINF AAfoo BBbar CCwhat\n";
|
|
static const char* test_string2 = "BMSG AAAB Hello\\sWorld!\n";
|
|
static const char* test_string3 = "BINF AAAB IDAN7ZMSLIEBL53OPTM7WXGSTXUS3XOY6KQS5LBGX NIFriend DEstuff SL3 SS0 SF0 VEQuickDC/0.4.17 US6430 SUADC0,TCP4,UDP4 I4127.0.0.1 HO5 HN1 AW\n";
|
|
static const char* test_string4 = "BMSG AAAB\n";
|
|
static const char* test_string5 = "BMSG AAAB \n";
|
|
|
|
static void create_test_user()
|
|
{
|
|
if (g_user)
|
|
return;
|
|
|
|
g_user = (struct user*) malloc(sizeof(struct user));
|
|
memset(g_user, 0, sizeof(struct user));
|
|
memcpy(g_user->id.nick, "exotic-tester", 13);
|
|
g_user->id.sid = 1;
|
|
}
|
|
|
|
EXO_TEST(adc_message_parse_1, {
|
|
struct adc_message* msg = adc_msg_create("IMSG Hello\\sWorld!");
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string2);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_3, {
|
|
create_test_user();
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "BMSG AAAB Hello\\sWorld!", 23);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_4, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "BMSG AAAC Hello\\sWorld!", 23);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_5, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "BMSG AAAB Hello\\sWorld!\n", 24);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_6, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB +TCP4 Hello\\sWorld!\n", 30);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_7, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB -TCP4 Hello\\sWorld!\n", 30);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_8, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB +TCP4+UDP4 Hello\\sWorld!\n", 35);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_9, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB +TCP4-UDP4 Hello\\sWorld!\n", 35);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_10, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB -TCP4-UDP4 Hello\\sWorld!\n", 35);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_11, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB Hello\\sWorld!\n", 24);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_12, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB Hello\\sWorld!\n", 25);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_13, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB +jalla Hello\\sWorld!\n", 31);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_14, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB +jall Hello\\sWorld!\n", 30);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_15, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "FMSG AAAB +TCP4 Hello\\sWorld!\n", 30);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_16, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "BMSG AAAB Hello\\sWorld!\n", 24);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_17, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "BMSG aaab Hello\\sWorld!\n", 24);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_18, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "DMSG AAAB AAAC Hello\\sthere!\n", 29);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_19, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "DMSG AAAC AAAB Hello\\sthere!\n", 29);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_20, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "EMSG AAAB AAAC Hello\\sthere!\n", 29);
|
|
int ok = msg != NULL;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_21, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "EMSG AAAC AAAB Hello\\sthere!\n", 29);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_22, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "\n", 0);
|
|
return msg == NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_parse_23, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, "\r\n", 1);
|
|
return msg == NULL;
|
|
});
|
|
|
|
|
|
EXO_TEST(adc_message_add_arg_1, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_add_argument(msg, "XXwtf?");
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat XXwtf?\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_add_arg_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_add_named_argument(msg, "XX", "wtf?");
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat XXwtf?\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_remove_arg_1, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_remove_named_argument(msg, "AA");
|
|
int ok = strcmp(msg->cache, "IINF BBbar CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_remove_arg_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_remove_named_argument(msg, "BB");
|
|
int ok = strcmp(msg->cache, "IINF AAfoo CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_remove_arg_3, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_remove_named_argument(msg, "CC");
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_remove_arg_4, {
|
|
/* this ensures we can remove the last element also */
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, test_string3, strlen(test_string3));
|
|
adc_msg_remove_named_argument(msg, "AW");
|
|
int ok = strcmp(msg->cache, "BINF AAAB IDAN7ZMSLIEBL53OPTM7WXGSTXUS3XOY6KQS5LBGX NIFriend DEstuff SL3 SS0 SF0 VEQuickDC/0.4.17 US6430 SUADC0,TCP4,UDP4 I4127.0.0.1 HO5 HN1\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_replace_arg_1, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_remove_named_argument(msg, "AA");
|
|
int ok = strcmp(msg->cache, "IINF BBbar CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_replace_arg_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_remove_named_argument(msg, "BB");
|
|
int ok = strcmp(msg->cache, "IINF AAfoo CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_replace_arg_3, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_remove_named_argument(msg, "CC");
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_arg_1, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_argument(msg, 0);
|
|
int ok = strcmp(c, "AAfoo") == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_arg_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_argument(msg, 1);
|
|
int ok = strcmp(c, "BBbar") == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_arg_3, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_argument(msg, 2);
|
|
int ok = strcmp(c, "CCwhat") == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_arg_4, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_argument(msg, 3);
|
|
int ok = c == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_named_arg_1, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_named_argument(msg, "AA");
|
|
int ok = strcmp(c, "foo") == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_named_arg_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_named_argument(msg, "BB");
|
|
int ok = strcmp(c, "bar") == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_named_arg_3, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_named_argument(msg, "CC");
|
|
int ok = strcmp(c, "what") == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_get_named_arg_4, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
char* c = adc_msg_get_named_argument(msg, "XX");
|
|
int ok = c == 0;
|
|
adc_msg_free(msg);
|
|
hub_free(c);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_1, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
int n = adc_msg_has_named_argument(msg, "XX");
|
|
adc_msg_free(msg);
|
|
return n == 0;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
int n = adc_msg_has_named_argument(msg, "BB");
|
|
adc_msg_free(msg);
|
|
return n == 1;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_3, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
int n = adc_msg_has_named_argument(msg, "CC");
|
|
adc_msg_free(msg);
|
|
return n == 1;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_4, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_add_argument(msg, "XXwtf?");
|
|
int n = adc_msg_has_named_argument(msg, "XX");
|
|
adc_msg_free(msg);
|
|
return n == 1;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_5, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_add_argument(msg, "XXone");
|
|
adc_msg_add_argument(msg, "XXtwo");
|
|
int n = adc_msg_has_named_argument(msg, "XX");
|
|
adc_msg_free(msg);
|
|
return n == 2;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_6, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_add_argument(msg, "XXone");
|
|
adc_msg_add_argument(msg, "XXtwo");
|
|
adc_msg_add_argument(msg, "XXthree");
|
|
int n = adc_msg_has_named_argument(msg, "XX");
|
|
adc_msg_free(msg);
|
|
return n == 3;
|
|
});
|
|
|
|
EXO_TEST(adc_message_has_named_arg_7, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
int n = adc_msg_has_named_argument(msg, "AA");
|
|
adc_msg_free(msg);
|
|
return n == 1;
|
|
});
|
|
|
|
EXO_TEST(adc_message_terminate_1, {
|
|
struct adc_message* msg = adc_msg_create("IINF AAfoo BBbar CCwhat");
|
|
adc_msg_unterminate(msg);
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_terminate_2, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_unterminate(msg);
|
|
adc_msg_terminate(msg);
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_terminate_3, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_unterminate(msg);
|
|
adc_msg_terminate(msg);
|
|
adc_msg_unterminate(msg);
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_terminate_4, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_unterminate(msg);
|
|
adc_msg_terminate(msg);
|
|
adc_msg_terminate(msg);
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_terminate_5, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_terminate(msg);
|
|
adc_msg_terminate(msg);
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat\n") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_terminate_6, {
|
|
struct adc_message* msg = adc_msg_create(test_string1);
|
|
adc_msg_unterminate(msg);
|
|
adc_msg_unterminate(msg);
|
|
int ok = strcmp(msg->cache, "IINF AAfoo BBbar CCwhat") == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_escape_1, {
|
|
char* s = adc_msg_escape(test_string1);
|
|
int ok = strcmp(s, "IINF\\sAAfoo\\sBBbar\\sCCwhat\\n") == 0;
|
|
hub_free(s);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_escape_2, {
|
|
char* s = adc_msg_escape(test_string1);
|
|
char* s2 = adc_msg_unescape(s);
|
|
int ok = strcmp(s2, test_string1) == 0;
|
|
hub_free(s);
|
|
hub_free(s2);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_escape_3, {
|
|
char* s = adc_msg_unescape(test_string1);
|
|
int ok = strcmp(s, test_string1) == 0;
|
|
hub_free(s);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_copy_1, {
|
|
struct adc_message* msg1 = adc_msg_create(test_string1);
|
|
struct adc_message* msg2 = adc_msg_copy(msg1);
|
|
int ok = strncmp(msg1->cache, msg2->cache, msg1->length) == 0;
|
|
adc_msg_free(msg1);
|
|
adc_msg_free(msg2);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_copy_2, {
|
|
struct adc_message* msg1 = adc_msg_parse_verify(g_user, test_string2, strlen(test_string2));
|
|
struct adc_message* msg2 = adc_msg_copy(msg1);
|
|
int ok = msg1->source == msg2->source;
|
|
adc_msg_free(msg1);
|
|
adc_msg_free(msg2);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_copy_3, {
|
|
struct adc_message* msg1 = adc_msg_parse_verify(g_user, test_string2, strlen(test_string2));
|
|
struct adc_message* msg2 = adc_msg_copy(msg1);
|
|
int ok = ( msg1->cmd == msg2->cmd &&
|
|
msg1->source == msg2->source &&
|
|
msg1->target == msg2->target &&
|
|
msg1->length == msg2->length &&
|
|
msg1->priority == msg2->priority &&
|
|
msg1->capacity == msg2->capacity && /* might not be true! */
|
|
strcmp(msg1->cache, msg2->cache) == 0);
|
|
adc_msg_free(msg1);
|
|
adc_msg_free(msg2);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_copy_4, {
|
|
struct adc_message* msg1 = adc_msg_parse_verify(g_user, test_string2, strlen(test_string2));
|
|
struct adc_message* msg2 = adc_msg_copy(msg1);
|
|
int ok = msg2->target == 0;
|
|
adc_msg_free(msg1);
|
|
adc_msg_free(msg2);
|
|
return ok;
|
|
});
|
|
|
|
|
|
static struct adc_message* updater1 = NULL;
|
|
static struct adc_message* updater2 = NULL;
|
|
static const char* update_info1 = "BINF AAAB IDABCDEFGHIJKLMNOPQRSTUVWXYZ1234567ABCDEF NItester SL10 SS12817126127 SF4125 HN3 HR0 HO0 VE++\\s0.698 US104857600 DS81911808 SUTCP4,UDP4 I4127.0.0.1\n";
|
|
static const char* update_info2 = "BINF AAAB HN34 SF4126 SS12817526127\n";
|
|
|
|
EXO_TEST(adc_message_update_1, {
|
|
updater1 = adc_msg_parse_verify(g_user, update_info1, strlen(update_info1));
|
|
return updater1 != NULL;
|
|
});
|
|
|
|
EXO_TEST(adc_message_update_2, {
|
|
user_set_info(g_user, updater1);
|
|
return strcmp(g_user->info->cache, updater1->cache) == 0 && g_user->info == updater1;
|
|
});
|
|
|
|
EXO_TEST(adc_message_update_3, {
|
|
updater2 = adc_msg_parse_verify(g_user, update_info2, strlen(update_info2));
|
|
return updater2 != NULL;
|
|
});
|
|
|
|
extern void update_user_info(struct user* u, struct adc_message* cmd);
|
|
|
|
EXO_TEST(adc_message_update_4, {
|
|
update_user_info(g_user, updater2);
|
|
return strlen(g_user->info->cache) == 159;
|
|
});
|
|
|
|
EXO_TEST(adc_message_empty_1, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, test_string2, strlen(test_string2));
|
|
int ok = adc_msg_is_empty(msg) == 0;
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_empty_2, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, test_string4, strlen(test_string4));
|
|
int ok = adc_msg_is_empty(msg);
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|
|
EXO_TEST(adc_message_empty_3, {
|
|
struct adc_message* msg = adc_msg_parse_verify(g_user, test_string5, strlen(test_string5));
|
|
int ok = adc_msg_is_empty(msg) == 0; /* arguably not empty, contains a space */
|
|
adc_msg_free(msg);
|
|
return ok;
|
|
});
|
|
|