- if (acptr->from != cptr) {
- if ((differ && lastnick >= acptr->lastnick) || (!differ && lastnick <= acptr->lastnick)) {
- if (!IsServer(sptr)) {
- ++ServerStats->is_kill;
- sendto_highprot_butone(cptr, 10, /* Kill old from outgoing servers */
- "%s " TOK_KILL " %s%s :%s (%s <- %s (Nick collision))",
- NumServ(&me), NumNick(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)",
- 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 */
- }
- sendto_one(acptr, err_str(ERR_NICKCOLLISION), me.name, acptr->name, nick);
- }
-
- ++ServerStats->is_kill;
- acptr->flags |= FLAGS_KILLED;
- /*
- * This exits the client we had before getting the NICK message
- */
- if (differ) {
- sendto_highprot_butone(cptr, 10, /* Kill our old from outgoing servers */
- "%s " TOK_KILL " %s%s :%s (%s <- %s (older nick overruled))",
- NumServ(&me), NumNick(acptr), me.name, acptr->from->name,
- cptr->name);
- if (MyConnect(acptr))
- sendto_one(cptr, "%s%s " TOK_QUIT " :Local kill by %s (Ghost)",
- NumNick(acptr), me.name);
- exit_client(cptr, acptr, &me, "Nick collision (older nick overruled)");
- }
- else {
- sendto_highprot_butone(cptr, 10, /* Kill our old from outgoing servers */
- "%s " TOK_KILL " %s%s :%s (%s <- %s (nick collision from same user@host))",
- NumServ(&me), NumNick(acptr), me.name, acptr->from->name,
- cptr->name);
- if (MyConnect(acptr))
- sendto_one(cptr,
- "%s%s " TOK_QUIT " :Local kill by %s (Ghost: switched servers too fast)",
- NumNick(acptr), 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]);
- return 0;
- }
- else if ((IsServer(sptr) && parc < 8) || (IsServer(cptr) && parc < 3))