- if (cli_from(acptr) != cptr) {
- if ((differ && lastnick >= cli_lastnick(acptr)) ||
- (!differ && lastnick <= cli_lastnick(acptr))) {
- if (!IsServer(sptr)) {
- ++ServerStats->is_kill;
- sendcmdto_serv_butone(&me, CMD_KILL, sptr, "%C :%s (%s <- %s (Nick "
- "collision))", sptr, cli_name(&me), cli_name(cli_from(acptr)),
- cli_name(cptr));
- assert(!MyConnect(sptr));
-
- cli_flags(sptr) |= FLAGS_KILLED;
- exit_client(cptr, sptr, &me, "Nick collision (you're a ghost)");
- /*
- * we have killed sptr off, zero out it's pointer so if it's used
- * again we'll know about it --Bleep
- */
- sptr = 0;
- }
- if (lastnick != cli_lastnick(acptr))
- return 0; /* Ignore the NICK */
- }
- send_reply(acptr, ERR_NICKCOLLISION, nick);
- }
-
- ++ServerStats->is_kill;
- cli_flags(acptr) |= FLAGS_KILLED;
- /*
- * This exits the client we had before getting the NICK message
- */
- if (differ) {
- sendcmdto_serv_butone(&me, CMD_KILL, acptr, "%C :%s (%s <- %s (older "
- "nick overruled))", acptr, cli_name(&me),
- cli_name(cli_from(acptr)), cli_name(cptr));
- if (MyConnect(acptr))
- sendcmdto_one(acptr, CMD_QUIT, cptr, ":Local kill by %s (Ghost)",
- cli_name(&me));
- exit_client(cptr, acptr, &me, "Nick collision (older nick overruled)");
- }
- else {
- sendcmdto_serv_butone(&me, CMD_KILL, acptr, "%C :%s (%s <- %s (nick "
- "collision from same user@host))", acptr, cli_name(&me),
- cli_name(cli_from(acptr)), cli_name(cptr));
- if (MyConnect(acptr))
- sendcmdto_one(acptr, CMD_QUIT, cptr, ":Local kill by %s (Ghost: ",
- "switched servers too fast)", cli_name(&me));
- exit_client(cptr, acptr, &me, "Nick collision (You collided yourself)");
- }
- if (lastnick == cli_lastnick(acptr))
- return 0;
-
- assert(0 != sptr);
- return set_nick_name(cptr, sptr, nick, parc, parv);
-}
-
-#if 0
-/*
- * m_nick
- *
- * parv[0] = sender prefix
- * parv[1] = nickname
- *
- * If from server, source is client:
- * parv[2] = timestamp
- *
- * Source is server:
- * parv[2] = hopcount
- * parv[3] = timestamp
- * parv[4] = username
- * parv[5] = hostname
- * parv[6] = umode (optional)
- * parv[parc-3] = IP# <- Only Protocol >= 10
- * parv[parc-2] = YXX, numeric nick <- Only Protocol >= 10
- * parv[parc-1] = info
- * parv[0] = server
- */
-int m_nick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
-{
- struct Client* acptr;
- char nick[NICKLEN + 2];
- char* s;
- time_t lastnick = 0;
- int differ = 1;
-
- if (parc < 2) {
- sendto_one(sptr, err_str(ERR_NONICKNAMEGIVEN), me.name, parv[0]); /* XXX DEAD */
- return 0;
- }
- else if ((IsServer(sptr) && parc < 8) || (IsServer(cptr) && parc < 3))
- {
- need_more_params(sptr, "NICK");
- sendto_ops("bad NICK param count for %s from %s", parv[1], cptr->name); /* XXX DEAD */
- return 0;
- }
- if (MyConnect(sptr) && (s = strchr(parv[1], '~')))
- *s = '\0';
- ircd_strncpy(nick, parv[1], NICKLEN);
- nick[NICKLEN] = '\0';
- if (IsServer(cptr)) {
- if (IsServer(sptr)) {
- lastnick = atoi(parv[3]);
- if (lastnick > OLDEST_TS)
- sptr->serv->lag = TStime() - lastnick;
- } else {
- lastnick = atoi(parv[2]);
- if (lastnick > OLDEST_TS)
- sptr->user->server->serv->lag = TStime() - lastnick;
- }
- }
- /*
- * If do_nick_name() returns a null name OR if the server sent a nick
- * name and do_nick_name() changed it in some way (due to rules of nick
- * creation) then reject it. If from a server and we reject it,
- * and KILL it. -avalon 4/4/92
- */
- if (do_nick_name(nick) == 0 || (IsServer(cptr) && strcmp(nick, parv[1])))