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
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);
chanuser->flags &= ~CHANUSERFLAG_VOICED;
chanuser->flags |= CHANUSERFLAG_OPPED;
}
+ DESYNCHRONIZE(cache_sync);
return 1;
}
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;
}
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);
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) {
registering_users = user;
} else
delUser(user, 1); //now we fully free the user
+ DESYNCHRONIZE(cache_sync);
return 1;
}
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 = createTempUser(from);
+ user = createTempUserMask(from);
+ if(!user) {
+ DESYNCHRONIZE(cache_sync);
+ return 0;
+ }
user->flags |= USERFLAG_ISTMPUSER;
}
struct ChanUser *chanuser = getChanUser(target, chan);
if(keep_channel && (chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chan->flags & CHANFLAG_REJOINING)) {
check_full_rejoin(chan);
}
+ DESYNCHRONIZE(cache_sync);
return 1;
}
if(chan == NULL) return 0;
if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates
if(user == NULL) {
- user = createTempUser(from);
+ user = createTempUserMask(from);
+ if(!user) return 0;
user->flags |= USERFLAG_ISTMPUSER;
}
event_topic(user, chan, argv[1]);
if(from == NULL || argc < 2) return 0;
struct UserNode *user = getUserByMask(from);
if(user == NULL) {
- user = createTempUser(from);
+ user = createTempUserMask(from);
+ if(!user) return 0;
user->flags |= USERFLAG_ISTMPUSER;
}
if(!stricmp(user->nick, "*status") && !match("Disconnected from IRC.*", argv[1])) {
if(from == NULL || argc < 2) return 0;
struct UserNode *user = getUserByMask(from);
if(user == NULL) {
- user = createTempUser(from);
+ user = createTempUserMask(from);
+ if(!user) return 0;
user->flags |= USERFLAG_ISTMPUSER;
}
if(argv[0][0] == '#') { //Channel notice
if(from == NULL || argc < 2) return 0;
struct UserNode *user = getUserByMask(from);
if(user == NULL) {
- user = createTempUser(from);
+ user = createTempUserMask(from);
+ if(!user) return 0;
user->flags |= USERFLAG_ISTMPUSER;
}
event_invite(client, user, argv[1]);
if(from == NULL || argc < 2) return 0;
struct UserNode *user = getUserByMask(from);
if(user == NULL) {
- user = createTempUser(from);
+ user = createTempUserMask(from);
+ if(!user) return 0;
user->flags |= USERFLAG_ISTMPUSER;
}
if(argv[0][0] == '#') {
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++;