X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FIRCParser.c;h=eed9380f8e0dddb242bee17782200f36ab36d987;hb=2b9e305af713f0960ac0cd7645af3e0ef85a8515;hp=750ac7b783c871643de7fe85ecb1b04cf7a491ee;hpb=66f0dc137cea9a925a0b35d148aa3fb3011443cd;p=NeonServV5.git diff --git a/src/IRCParser.c b/src/IRCParser.c index 750ac7b..eed9380 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -57,7 +57,11 @@ int parse_lines(struct ClientSocket *client, char *lines, int len) { static void parse_line(struct ClientSocket *client, char *line) { int argc = 0; char *argv[MAXNUMPARAMS]; + #ifdef HAVE_THREADS + printf("[%d recv %lu] %s\n", getCurrentThreadID(), (unsigned long) strlen(line), line); + #else printf("[recv %lu] %s\n", (unsigned long) strlen(line), line); + #endif if(line[0] == ':') line++; else @@ -169,10 +173,17 @@ static int is_onlyBotSeeUser(struct ClientSocket *client, struct UserNode *user) static IRC_CMD(raw_join) { if(from == NULL || argc < 1) return 0; + SYNCHRONIZE(cache_sync); struct UserNode *user = getUserByMask(from); struct ChanNode *chan = getChanByName(argv[0]); - if(!chan && (!user || !(user->flags & USERFLAG_ISBOT))) return 0; - if(chan && (((!user || !isBot(user)) && chan->chanbot != client->user) || ((user && isBot(user)) && client->user != user))) return 1; //we ignore it - but it's not a parse error + if(!chan && (!user || !(user->flags & USERFLAG_ISBOT))) { + DESYNCHRONIZE(cache_sync); + return 0; + } + if(chan && (((!user || !isBot(user)) && chan->chanbot != client->user) || ((user && isBot(user)) && client->user != user))) { + DESYNCHRONIZE(cache_sync); + return 1; //we ignore it - but it's not a parse error + } //let Bots always add themselves! (maybe they join invisible) if(user == NULL) { user = addUserMask(from); @@ -233,6 +244,7 @@ static IRC_CMD(raw_join) { chanuser->flags &= ~CHANUSERFLAG_VOICED; chanuser->flags |= CHANUSERFLAG_OPPED; } + DESYNCHRONIZE(cache_sync); return 1; } @@ -271,11 +283,21 @@ static void check_full_rejoin(struct ChanNode *chan) { static IRC_CMD(raw_part) { if(from == NULL || argc < 1) return 0; + SYNCHRONIZE(cache_sync); struct UserNode *user = getUserByMask(from); - if(user == NULL) return 0; + if(user == NULL) { + DESYNCHRONIZE(cache_sync); + return 0; + } struct ChanNode *chan = getChanByName(argv[0]); - if(chan == NULL) return 0; - if((!isBot(user) && chan->chanbot != client->user) || (isBot(user) && client->user != user)) return 1; //we ignore it - but it's not a parse error + if(chan == NULL) { + DESYNCHRONIZE(cache_sync); + return 0; + } + if((!isBot(user) && chan->chanbot != client->user) || (isBot(user) && client->user != user)) { + DESYNCHRONIZE(cache_sync); + return 1; //we ignore it - but it's not a parse error + } int keep_channel = 1; if(chan->chanbot == user && (chan->flags & CHANFLAG_REJOINING)) { struct ClientSocket **clients = chan->rejoin_array; @@ -285,6 +307,7 @@ static IRC_CMD(raw_part) { } free(chan->rejoin_array); chan->flags &= ~CHANFLAG_REJOINING; + DESYNCHRONIZE(cache_sync); return 0; } else if(isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { struct ChanUser *chanuser = getChanUser(user, chan); @@ -308,16 +331,27 @@ static IRC_CMD(raw_part) { putsock(client, "PART %s :magic hop", chan->name); putsock(client, "JOIN %s", chan->name); } + DESYNCHRONIZE(cache_sync); return 1; } static IRC_CMD(raw_quit) { if(from == NULL || argc < 1) return 0; + SYNCHRONIZE(cache_sync); struct UserNode *user = getUserByMask(from); - if(user == NULL) return 0; - if(!is_firstBotSeeUser(client, user)) return 1; //we ignore it - but it's not a parse error + if(user == NULL) { + DESYNCHRONIZE(cache_sync); + return 0; + } + if(!is_firstBotSeeUser(client, user)) { + DESYNCHRONIZE(cache_sync); + return 1; //we ignore it - but it's not a parse error + } int registering = !stricmp(argv[0], "Registered"); - if((registering && (user->flags & USERFLAG_ISBOT))) return 1; //bot is registering - just ignore it + if((registering && (user->flags & USERFLAG_ISBOT))) { + DESYNCHRONIZE(cache_sync); + return 1; //bot is registering - just ignore it + } delUser(user, 0); //a little bit crazy, but we want to delete the user on the channel's userlists - but not the users channel list event_quit(user, argv[0]); if(user->flags & USERFLAG_ISBOT) { @@ -352,6 +386,7 @@ static IRC_CMD(raw_quit) { registering_users = user; } else delUser(user, 1); //now we fully free the user + DESYNCHRONIZE(cache_sync); return 1; } @@ -387,16 +422,26 @@ void bot_disconnect(struct ClientSocket *client) { static IRC_CMD(raw_kick) { if(from == NULL || argc < 3) return 0; + SYNCHRONIZE(cache_sync); struct UserNode *user = getUserByMask(from); struct UserNode *target = getUserByNick(argv[1]); struct ChanNode *chan = getChanByName(argv[0]); - if(chan == NULL || target == NULL) return 0; - if(((!isBot(target) && chan->chanbot != client->user) || (isBot(target) && client->user != target))) return 1; //we ignore it - but it's not a parse error + if(chan == NULL || target == NULL) { + DESYNCHRONIZE(cache_sync); + return 0; + } + if(((!isBot(target) && chan->chanbot != client->user) || (isBot(target) && client->user != target))) { + DESYNCHRONIZE(cache_sync); + return 1; //we ignore it - but it's not a parse error + } int keep_channel = 1; if(isUserOnChan(target, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { if(user == NULL) { user = createTempUserMask(from); - if(!user) return 0; + if(!user) { + DESYNCHRONIZE(cache_sync); + return 0; + } user->flags |= USERFLAG_ISTMPUSER; } struct ChanUser *chanuser = getChanUser(target, chan); @@ -415,6 +460,7 @@ static IRC_CMD(raw_kick) { if(keep_channel && (chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chan->flags & CHANFLAG_REJOINING)) { check_full_rejoin(chan); } + DESYNCHRONIZE(cache_sync); return 1; } @@ -596,7 +642,7 @@ static IRC_CMD(raw_251) { if(argc < 2) return 0; char *total_user_str = argv[1]; char total_visible[20], total_invisible[20]; - int i, total_visible_pos = 0, total_invisible_pos = 0; + int i = 0, total_visible_pos = 0, total_invisible_pos = 0; while(*total_user_str) { if(*total_user_str == ' ') { i++;