diff --git a/include/h.h b/include/h.h index d6db89ede..c4ebffb84 100644 --- a/include/h.h +++ b/include/h.h @@ -571,8 +571,8 @@ extern u_int16_t getrandom16(); extern u_int32_t getrandom32(); extern MODVAR char trouble_info[1024]; #define EVENT_DRUGS BASE_VERSION -extern void rejoin_doparts(aClient *sptr, char did_parts[]); -extern void rejoin_dojoinandmode(aClient *sptr, char did_parts[]); +extern void rejoin_doquits(aClient *sptr); +extern void rejoin_dojoinandmode(aClient *sptr); extern void ident_failed(aClient *cptr); extern MODVAR char extchmstr[4][64]; diff --git a/src/channel.c b/src/channel.c index d00af5541..e71646727 100644 --- a/src/channel.c +++ b/src/channel.c @@ -1497,44 +1497,24 @@ void send_user_joins(aClient *cptr, aClient *user) } /* - * rejoin_doparts: - * sends a PART to all channels (to local users only) + * rejoin_doquits: + * sends a QUIT to all common channels (to local users only) */ -void rejoin_doparts(aClient *sptr, char did_parts[]) +void rejoin_doquits(aClient *sptr) { Membership *tmp; aChannel *chptr; - char *comment = "Rejoining because of user@host change"; + char *comment = "Changing host"; int i = 0; - for (tmp = sptr->user->channel; tmp; tmp = tmp->next) - { - chptr = tmp->chptr; - if (!chptr) - continue; /* Possible? */ - - /* If the user is banned, don't do it */ - if (is_banned(sptr, chptr, BANCHK_JOIN)) - { - did_parts[i++] = 0; - continue; - } - did_parts[i++] = 1; - - if ((chptr->mode.mode & MODE_AUDITORIUM) && - !(tmp->flags & (CHFL_CHANOWNER|CHFL_CHANPROT|CHFL_CHANOP))) - { - sendto_chanops_butone(sptr, chptr, ":%s!%s@%s PART %s :%s", sptr->name, sptr->user->username, GetHost(sptr), chptr->chname, comment); - } else - sendto_channel_butserv_butone(chptr, sptr, sptr, ":%s PART %s :%s", sptr->name, chptr->chname, comment); - } + sendto_common_channels(sptr, ":%s!%s@%s QUIT :%s", comment); } /* * rejoin_dojoinandmode: * sends a JOIN and a MODE (if needed) to restore qaohv modes (to local users only) */ -void rejoin_dojoinandmode(aClient *sptr, char did_parts[]) +void rejoin_dojoinandmode(aClient *sptr) { Membership *tmp; aChannel *chptr; @@ -1548,10 +1528,6 @@ void rejoin_dojoinandmode(aClient *sptr, char did_parts[]) if (!chptr) continue; /* Is it possible? */ - /* If the user is banned, don't do it */ - if (!did_parts[j++]) - continue; - if ((chptr->mode.mode & MODE_AUDITORIUM) && !(flags & (CHFL_CHANOWNER|CHFL_CHANPROT|CHFL_CHANOP))) { @@ -1584,8 +1560,6 @@ void rejoin_dojoinandmode(aClient *sptr, char did_parts[]) if (i < n - 1) strcat(parabuf, " "); } - sendto_channel_butserv_butone(chptr, &me, sptr, ":%s MODE %s +%s %s", - me.name, chptr->chname, flagbuf, parabuf); } } } diff --git a/src/modules/m_chghost.c b/src/modules/m_chghost.c index 4f3690ba6..53b219112 100644 --- a/src/modules/m_chghost.c +++ b/src/modules/m_chghost.c @@ -137,19 +137,16 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if ((acptr = find_person(parv[1], NULL))) { - DYN_LOCAL(char, did_parts, acptr->user->joined); if (MyClient(sptr) && (IsLocOp(sptr) && !MyClient(acptr))) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); - DYN_FREE(did_parts); return 0; } - + if (!strcmp(GetHost(acptr), parv[2])) { sendnotice(sptr, "*** /ChgHost Error: requested host is same as current host."); - DYN_FREE(did_parts); return 0; } switch (UHOST_ALLOWED) @@ -159,7 +156,6 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[]) { sendto_one(sptr, err_str(ERR_DISABLED), me.name, sptr->name, "CHGHOST", "This command is disabled on this server"); - DYN_FREE(did_parts); return 0; } break; @@ -169,12 +165,11 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (IsPerson(acptr) && MyClient(sptr) && acptr->user->joined) { sendnotice(sptr, "*** /ChgHost can not be used while %s is on a channel", acptr->name); - DYN_FREE(did_parts); return 0; } break; case UHALLOW_REJOIN: - rejoin_doparts(acptr, did_parts); + rejoin_doquits(acptr); /* join sent later when the host has been changed */ break; } @@ -203,8 +198,7 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[]) } acptr->user->virthost = strdup(parv[2]); if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_dojoinandmode(acptr, did_parts); - DYN_FREE(did_parts); + rejoin_dojoinandmode(acptr); return 0; } else diff --git a/src/modules/m_chgident.c b/src/modules/m_chgident.c index 7fb93c076..5aa68c706 100644 --- a/src/modules/m_chgident.c +++ b/src/modules/m_chgident.c @@ -150,12 +150,10 @@ int legalident = 1; if ((acptr = find_person(parv[1], NULL))) { - DYN_LOCAL(char, did_parts, acptr->user->joined); if (MyClient(sptr) && (IsLocOp(sptr) && !MyClient(acptr))) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); - DYN_FREE(did_parts); return 0; } @@ -166,7 +164,6 @@ int legalident = 1; { sendto_one(sptr, err_str(ERR_DISABLED), me.name, sptr->name, "CHGIDENT", "This command is disabled on this server"); - DYN_FREE(did_parts); return 0; } break; @@ -176,12 +173,11 @@ int legalident = 1; if (IsPerson(acptr) && MyClient(sptr) && acptr->user->joined) { sendnotice(sptr, "*** /ChgIdent can not be used while %s is on a channel", acptr->name); - DYN_FREE(did_parts); return 0; } break; case UHALLOW_REJOIN: - rejoin_doparts(acptr, did_parts); + rejoin_doquits(acptr); /* join sent later when the ident has been changed */ break; } @@ -205,8 +201,7 @@ int legalident = 1; TOK_CHGIDENT, "%s %s", acptr->name, parv[2]); ircsprintf(acptr->user->username, "%s", parv[2]); if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_dojoinandmode(acptr, did_parts); - DYN_FREE(did_parts); + rejoin_dojoinandmode(acptr); return 0; } else diff --git a/src/modules/m_mode.c b/src/modules/m_mode.c index e953f2708..b92837930 100644 --- a/src/modules/m_mode.c +++ b/src/modules/m_mode.c @@ -2271,15 +2271,13 @@ DLLFUNC CMD_FUNC(_m_umode) MSG_SETHOST, TOK_SETHOST, "%s", sptr->user->virthost); if (UHOST_ALLOWED == UHALLOW_REJOIN) { - DYN_LOCAL(char, did_parts, sptr->user->joined); /* LOL, this is ugly ;) */ sptr->umodes &= ~UMODE_HIDE; - rejoin_doparts(sptr, did_parts); + rejoin_doquits(sptr); sptr->umodes |= UMODE_HIDE; - rejoin_dojoinandmode(sptr, did_parts); + rejoin_dojoinandmode(sptr); if (MyClient(sptr)) sptr->since += 7; /* Add fake lag */ - DYN_FREE(did_parts); } } @@ -2287,15 +2285,13 @@ DLLFUNC CMD_FUNC(_m_umode) { if (UHOST_ALLOWED == UHALLOW_REJOIN) { - DYN_LOCAL(char, did_parts, sptr->user->joined); /* LOL, this is ugly ;) */ sptr->umodes |= UMODE_HIDE; - rejoin_doparts(sptr, did_parts); + rejoin_doquits(sptr); sptr->umodes &= ~UMODE_HIDE; - rejoin_dojoinandmode(sptr, did_parts); + rejoin_dojoinandmode(sptr); if (MyClient(sptr)) sptr->since += 7; /* Add fake lag */ - DYN_FREE(did_parts); } if (sptr->user->virthost) { diff --git a/src/modules/m_sethost.c b/src/modules/m_sethost.c index be68c7022..92636bf22 100644 --- a/src/modules/m_sethost.c +++ b/src/modules/m_sethost.c @@ -187,14 +187,12 @@ DLLFUNC int m_sethost(aClient *cptr, aClient *sptr, int parc, char *parv[]) } { - DYN_LOCAL(char, did_parts, sptr->user->joined); switch (UHOST_ALLOWED) { case UHALLOW_NEVER: if (MyClient(sptr)) { sendto_one(sptr, ":%s NOTICE %s :*** /SetHost is disabled", me.name, sptr->name); - DYN_FREE(did_parts); return 0; } break; @@ -204,12 +202,11 @@ DLLFUNC int m_sethost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (MyClient(sptr) && sptr->user->joined) { sendto_one(sptr, ":%s NOTICE %s :*** /SetHost can not be used while you are on a channel", me.name, sptr->name); - DYN_FREE(did_parts); return 0; } break; case UHALLOW_REJOIN: - rejoin_doparts(sptr, did_parts); + rejoin_doquits(sptr); /* join sent later when the host has been changed */ break; } @@ -229,8 +226,7 @@ DLLFUNC int m_sethost(aClient *cptr, aClient *sptr, int parc, char *parv[]) "%s", parv[1]); if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_dojoinandmode(sptr, did_parts); - DYN_FREE(did_parts); + rejoin_dojoinandmode(sptr); } if (MyConnect(sptr)) diff --git a/src/modules/m_setident.c b/src/modules/m_setident.c index 80f51a782..0b9ddfb4e 100644 --- a/src/modules/m_setident.c +++ b/src/modules/m_setident.c @@ -188,7 +188,6 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[]) } { - DYN_LOCAL(char, did_parts, sptr->user->joined); switch (UHOST_ALLOWED) { case UHALLOW_ALWAYS: @@ -197,7 +196,6 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (MyClient(sptr)) { sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent is disabled", me.name, sptr->name); - DYN_FREE(did_parts); return 0; } break; @@ -205,12 +203,11 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (MyClient(sptr) && sptr->user->joined) { sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent can not be used while you are on a channel", me.name, sptr->name); - DYN_FREE(did_parts); return 0; } break; case UHALLOW_REJOIN: - rejoin_doparts(sptr, did_parts); + rejoin_doquits(sptr); break; } @@ -221,8 +218,7 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[]) MSG_SETIDENT, TOK_SETIDENT, "%s", parv[1]); if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_dojoinandmode(sptr, did_parts); - DYN_FREE(did_parts); + rejoin_dojoinandmode(sptr); } if (MyConnect(sptr)) diff --git a/src/modules/m_vhost.c b/src/modules/m_vhost.c index 7e41b618b..30e1d5ea2 100644 --- a/src/modules/m_vhost.c +++ b/src/modules/m_vhost.c @@ -132,7 +132,6 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (i > 0) { char olduser[USERLEN+1]; - DYN_LOCAL(char, did_parts, sptr->user->joined); switch (UHOST_ALLOWED) { @@ -140,7 +139,6 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (MyClient(sptr)) { sendto_one(sptr, ":%s NOTICE %s :*** /vhost is disabled", me.name, sptr->name); - DYN_FREE(did_parts); return 0; } break; @@ -150,12 +148,11 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (MyClient(sptr) && sptr->user->joined) { sendto_one(sptr, ":%s NOTICE %s :*** /vhost can not be used while you are on a channel", me.name, sptr->name); - DYN_FREE(did_parts); return 0; } break; case UHALLOW_REJOIN: - rejoin_doparts(sptr, did_parts); + rejoin_doquits(sptr); /* join sent later when the host has been changed */ break; } @@ -200,8 +197,7 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) sptr->user->realhost, vhost->virtuser ? vhost->virtuser : "", vhost->virtuser ? "@" : "", vhost->virthost); if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_dojoinandmode(sptr, did_parts); - DYN_FREE(did_parts); + rejoin_dojoinandmode(sptr); return 0; } if (i == -1) diff --git a/src/s_user.c b/src/s_user.c index 503442505..1e0bb1da9 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -68,15 +68,11 @@ static char buf[BUFSIZE]; void iNAH_host(aClient *sptr, char *host) { - DYN_LOCAL(char, did_parts, sptr->user->joined); if (!sptr->user) - { - DYN_FREE(did_parts); return; - } if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_doparts(sptr, did_parts); + rejoin_doquits(sptr); if (sptr->user->virthost) { MyFree(sptr->user->virthost); @@ -87,10 +83,9 @@ void iNAH_host(aClient *sptr, char *host) sendto_serv_butone_token(&me, sptr->name, MSG_SETHOST, TOK_SETHOST, "%s", sptr->user->virthost); sptr->umodes |= UMODE_SETHOST; - + if (UHOST_ALLOWED == UHALLOW_REJOIN) - rejoin_dojoinandmode(sptr, did_parts); - DYN_FREE(did_parts); + rejoin_dojoinandmode(sptr); } long set_usermode(char *umode)