X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FChanUser.c;h=e18ce4dd57590d7a718f13cebfda8edfadd02243;hp=c31e202340ee9099d5560c3169b8c76a4abbd1f6;hb=HEAD;hpb=0f1dc61921eef1db8e404a5a82372e2d1cd55daa diff --git a/src/ChanUser.c b/src/ChanUser.c index c31e202..e18ce4d 100644 --- a/src/ChanUser.c +++ b/src/ChanUser.c @@ -1,20 +1,42 @@ +/* ChanUser.c - NeonServ v5.6 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "ChanUser.h" #include "ChanNode.h" +#include "ModeNode.h" #include "UserNode.h" +#include "log.h" struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) { - struct ChanUser *chanuser = malloc(sizeof(*chan)); + struct ChanUser *chanuser = malloc(sizeof(*chanuser)); if (!chanuser) { - perror("malloc() failed"); + printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__); return NULL; } chanuser->flags = 0; chanuser->user = user; chanuser->chan = chan; + chanuser->visCount = 0; chanuser->changeTime = 0; + chanuser->spamnode = NULL; + + SYNCHRONIZE(cache_sync); chanuser->next_user = chan->user; chan->user = chanuser; @@ -23,24 +45,30 @@ struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) { chanuser->next_chan = user->channel; user->channel = chanuser; + DESYNCHRONIZE(cache_sync); + return chanuser; } struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) { - struct ChanUser *chanuser = malloc(sizeof(*chan)); + struct ChanUser *chanuser = malloc(sizeof(*chanuser)); if (!chanuser) { - perror("malloc() failed"); + printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__); return NULL; } chanuser->flags = CHANUSERFLAG_INVISIBLE; chanuser->user = user; chanuser->chan = chan; + chanuser->visCount = 0; chanuser->changeTime = 0; + chanuser->spamnode = NULL; + SYNCHRONIZE(cache_sync); chanuser->next_user = chan->user; chan->user = chanuser; + DESYNCHRONIZE(cache_sync); chan->usercount++; return chanuser; @@ -48,18 +76,32 @@ struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *us int isUserOnChan(struct UserNode *user, struct ChanNode *chan) { struct ChanUser *chanuser; - for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { - if(chanuser->chan == chan) - return 1; + if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) { + for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) { + if(chanuser->user == user) + return 1; + } + } else { + for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { + if(chanuser->chan == chan) + return 1; + } } return 0; } struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) { struct ChanUser *chanuser; - for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { - if(chanuser->chan == chan) - return chanuser; + if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) { + for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) { + if(chanuser->user == user) + return chanuser; + } + } else { + for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { + if(chanuser->chan == chan) + return chanuser; + } } return NULL; } @@ -78,21 +120,20 @@ struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) { return last->next_chan; } -void delChanUser(struct ChanUser *chanuser, int freeChanUser) { +void delChanUser(struct ChanUser *chanuser, int do_freeChanUser) { + SYNCHRONIZE(cache_sync); struct ChanUser *cchanuser, *last; //remove it from the user's channel-list - if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) { - last = NULL; - for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) { - if(cchanuser == chanuser) { - if(last) - last->next_chan = chanuser->next_chan; - else - chanuser->user->channel = chanuser->next_chan; - break; - } else - last = cchanuser; - } + last = NULL; + for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) { + if(cchanuser == chanuser) { + if(last) + last->next_chan = chanuser->next_chan; + else + chanuser->user->channel = chanuser->next_chan; + break; + } else + last = cchanuser; } //remove it from the channel's user-list @@ -109,15 +150,17 @@ void delChanUser(struct ChanUser *chanuser, int freeChanUser) { last = cchanuser; } - if(freeChanUser) - free(chanuser); - else { + if(do_freeChanUser) { + freeChanUser(chanuser); + } else { chanuser->next_chan = NULL; chanuser->next_user = NULL; } + DESYNCHRONIZE(cache_sync); } -void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser) { +void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int do_freeChanUser) { + SYNCHRONIZE(cache_sync); struct ChanUser *cchanuser, *last; if(remove_from_userlist) { //remove it from the channel's user-list @@ -151,7 +194,15 @@ void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist chanuser->next_chan = NULL; } - if(freeChanUser) - free(chanuser); + if(do_freeChanUser) { + freeChanUser(chanuser); + } + DESYNCHRONIZE(cache_sync); +} + +void freeChanUser(struct ChanUser *chanuser) { + if(chanuser->spamnode) + free(chanuser->spamnode); + free(chanuser); }