void foo() { if (( #if 1 /* * REMOVE THIS after all servers upgraded to 2.10.01 and * Uworld uses a numeric too */ (strlen(parv[1]) != 1 && !(acptr = FindClient(parv[1])))) || (strlen(parv[1]) == 1 && #endif 1)) { } if ((!IsServer(cptr)) && isNickJuped(nick)) { sendto_one(sptr, err_str(ERR_NICKNAMEINUSE), me.name, /* parv[0] is empty when connecting */ BadPtr(parv[0]) ? "*" : parv[0], nick); return 0; /* NICK message ignored */ } }
/* * m_nick - message handler for local clients * parv[0] = sender prefix * parv[1] = nickname */ int m_nick(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { struct Client* acptr; char nick[NICKLEN + 2]; char* arg; char* s; const char* client_name; assert(0 != cptr); assert(cptr == sptr); if (IsServerPort(cptr)) return exit_client(cptr, cptr, &me, "Use a different port"); /* * parv[0] will be empty for clients connecting for the first time */ client_name = (*(cli_name(sptr))) ? cli_name(sptr) : "*"; if (parc < 2) { send_reply(sptr, ERR_NONICKNAMEGIVEN); return 0; } /* * Don't let them send make us send back a really long string of * garbage */ arg = parv[1]; if (strlen(arg) > IRCD_MIN(NICKLEN, feature_int(FEAT_NICKLEN))) arg[IRCD_MIN(NICKLEN, feature_int(FEAT_NICKLEN))] = '\0'; if ((s = strchr(arg, '~'))) *s = '\0'; strcpy(nick, arg); /* * If do_nick_name() returns a null name then reject it. */ if (0 == do_nick_name(nick)) { send_reply(sptr, ERR_ERRONEUSNICKNAME, arg); return 0; } /* * Check if this is a LOCAL user trying to use a reserved (Juped) * nick, if so tell him that it's a nick in use... */ if (isNickJuped(nick)) { send_reply(sptr, ERR_NICKNAMEINUSE, nick); return 0; /* NICK message ignored */ } if (!(acptr = FindClient(nick))) { /* * No collisions, all clear... */ return set_nick_name(cptr, sptr, nick, parc, parv); } if (IsServer(acptr)) { send_reply(sptr, ERR_NICKNAMEINUSE, nick); return 0; /* NICK message ignored */ } /* * If acptr == sptr, then we have a client doing a nick * change between *equivalent* nicknames as far as server * is concerned (user is changing the case of his/her * nickname or somesuch) */ if (acptr == sptr) { /* * If acptr == sptr, then we have a client doing a nick * change between *equivalent* nicknames as far as server * is concerned (user is changing the case of his/her * nickname or somesuch) */ if (0 != strcmp(cli_name(acptr), nick)) { /* * Allows change of case in his/her nick */ return set_nick_name(cptr, sptr, nick, parc, parv); } /* * This is just ':old NICK old' type thing. * Just forget the whole thing here. There is * no point forwarding it to anywhere, * especially since servers prior to this * version would treat it as nick collision. */ return 0; } /* * Note: From this point forward it can be assumed that * acptr != sptr (point to different client structures). */ assert(acptr != sptr); /* * If the older one is "non-person", the new entry is just * allowed to overwrite it. Just silently drop non-person, * and proceed with the nick. This should take care of the * "dormant nick" way of generating collisions... * * XXX - hmmm can this happen after one is registered? * * Yes, client 1 connects to IRC and registers, client 2 connects and * sends "NICK foo" but doesn't send anything more. client 1 now does * /nick foo, they should succeed and client 2 gets disconnected with * the message below. */ if (IsUnknown(acptr) && MyConnect(acptr)) { ServerStats->is_ref++; IPcheck_connect_fail(acptr); exit_client(cptr, acptr, &me, "Overridden by other sign on"); return set_nick_name(cptr, sptr, nick, parc, parv); } /* * NICK is coming from local client connection. Just * send error reply and ignore the command. */ send_reply(sptr, ERR_NICKNAMEINUSE, nick); return 0; /* NICK message ignored */ }
/* * ms_svsnick - server message handler * parv[0] = sender prefix * parv[1] = Target numeric * parv[2] = New nickname */ int ms_svsnick(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { struct Client* acptr = NULL; struct Client* acptr2 = NULL; char nick[NICKLEN + 2]; char* arg; if (parc < 3) return need_more_params(sptr, "SVSNICK"); if (!(acptr = findNUser(parv[1]))) return 0; /* Ignore SVSNICK for a user that has quit */ if (ircd_strcmp(cli_name(acptr), parv[2]) == 0) return 0; /* Nick already set to what SVSNICK wants, ignoring... */ /* * Basic sanity checks */ /* * Don't let them make us send back a really long string of * garbage */ arg = parv[2]; if (strlen(arg) > IRCD_MIN(NICKLEN, feature_int(FEAT_NICKLEN))) arg[IRCD_MIN(NICKLEN, feature_int(FEAT_NICKLEN))] = '\0'; strcpy(nick, arg); /* * If do_nick_name() returns a null name then reject it. */ if (0 == do_nick_name(nick)) return 0; /* * Check if this is a LOCAL user trying to use a reserved (Juped) * nick, if so tell him that it's a nick in use... */ if (isNickJuped(nick)) return 0; /* NICK message ignored */ if (feature_bool(FEAT_OPER_SINGLELETTERNICK) && !IsAnOper(acptr) && nick[1] == '\0') return 0; /* * Set acptr2 to the client pointer of any user with nick's name. * If the user is the same as the person being svsnick'ed, let it * through as it is probably a change in the nickname's case. */ if ((acptr2 = FindClient(nick))) { /* * If acptr == acptr2, then we have a client doing a nick * change between *equivalent* nicknames as far as server * is concerned (user is changing the case of his/her * nickname or somesuch), so we let it through :) */ if (acptr != acptr2) { /* Nick collision occured, kill user with specific reason */ ++ServerStats->is_kill; /* ??? - Why do we use cptr here? */ SetFlag(cptr, FLAG_KILLED); exit_client(cptr, acptr2, &me, "Killed (Nickname Enforcement)"); } } set_nick_name(acptr, acptr, nick, parc, parv, 1); sendcmdto_serv_butone(sptr, CMD_SVSNICK, cptr, "%s %s", parv[1], nick); return 0; }