- if (acptr->from != cptr) {
- if ((differ && lastnick >= acptr->lastnick) || (!differ && lastnick <= acptr->lastnick)) {
- if (!IsServer(sptr)) {
- ++ServerStats->is_kill;
- sendcmdto_serv_butone(&me, CMD_KILL, sptr, "%C :%s (%s <- %s (Nick "
- "collision))", sptr, me.name, acptr->from->name,
- cptr->name);
- assert(!MyConnect(sptr));
-#if 0
- /*
- * XXX - impossible
- */
- if (MyConnect(sptr))
- sendto_one(cptr, "%s " TOK_KILL " %s%s :%s (Ghost 2)", /* XXX DEAD */
- NumServ(&me), NumNick(sptr), me.name);
-#endif
- sptr->flags |= 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 != acptr->lastnick)
- return 0; /* Ignore the NICK */
- }
- send_reply(acptr, ERR_NICKCOLLISION, nick);
- }
-
- ++ServerStats->is_kill;
- acptr->flags |= 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, me.name,
- acptr->from->name, cptr->name);
- if (MyConnect(acptr))
- sendcmdto_one(acptr, CMD_QUIT, cptr, ":Local kill by %s (Ghost)",
- me.name);
- 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, me.name,
- acptr->from->name, cptr->name);
- if (MyConnect(acptr))
- sendcmdto_one(acptr, CMD_QUIT, cptr, ":Local kill by %s (Ghost: ",
- "switched servers too fast)", me.name);
- exit_client(cptr, acptr, &me, "Nick collision (You collided yourself)");
- }
- if (lastnick == acptr->lastnick)
- 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])))