ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/server.c
(Generate patch)

Comparing:
ircd-hybrid-8/src/s_serv.c (file contents), Revision 1490 by michael, Sat Jul 28 19:33:23 2012 UTC vs.
ircd-hybrid/trunk/src/s_serv.c (file contents), Revision 2282 by michael, Tue Jun 18 18:02:14 2013 UTC

# Line 36 | Line 36
36   #include "fdlist.h"
37   #include "hash.h"
38   #include "irc_string.h"
39 #include "sprintf_irc.h"
39   #include "ircd.h"
40   #include "ircd_defs.h"
41   #include "s_bsd.h"
# Line 55 | Line 54
54  
55   #define MIN_CONN_FREQ 300
56  
57 + dlink_list flatten_links;
58   static dlink_list cap_list = { NULL, NULL, 0 };
59   static void server_burst(struct Client *);
60   static void burst_all(struct Client *);
# Line 73 | Line 73 | static void burst_members(struct Client
73   *                but in no particular order.
74   */
75   void
76 < write_links_file(void* notused)
76 > write_links_file(void *notused)
77   {
78 <  MessageFileLine *next_mptr = 0;
79 <  MessageFileLine *mptr = 0;
80 <  MessageFileLine *currentMessageLine = 0;
81 <  MessageFileLine *newMessageLine = 0;
82 <  MessageFile *MessageFileptr;
83 <  const char *p;
84 <  FILE *file;
85 <  char buff[512];
86 <  dlink_node *ptr;
87 <
88 <  MessageFileptr = &ConfigFileEntry.linksfile;
78 >  FILE *file = NULL;
79 >  dlink_node *ptr = NULL, *ptr_next = NULL;
80 >  char buff[IRCD_BUFSIZE] = { '\0' };
81  
82 <  if ((file = fopen(MessageFileptr->fileName, "w")) == NULL)
82 >  if ((file = fopen(LIPATH, "w")) == NULL)
83      return;
84  
85 <  for (mptr = MessageFileptr->contentsOfFile; mptr; mptr = next_mptr)
85 >  DLINK_FOREACH_SAFE(ptr, ptr_next, flatten_links.head)
86    {
87 <    next_mptr = mptr->next;
88 <    MyFree(mptr);
87 >    dlinkDelete(ptr, &flatten_links);
88 >    MyFree(ptr->data);
89 >    free_dlink_node(ptr);
90    }
91  
99  MessageFileptr->contentsOfFile = NULL;
100  currentMessageLine             = NULL;
101
92    DLINK_FOREACH(ptr, global_serv_list.head)
93    {
94      const struct Client *target_p = ptr->data;
95  
96 <    /* skip ourselves, we send ourselves in /links */
97 <    if (IsMe(target_p))
96 >    /*
97 >     * Skip hidden servers, aswell as ourselves, since we already send
98 >     * ourselves in /links
99 >     */
100 >    if (IsHidden(target_p) || IsMe(target_p))
101        continue;
102  
103 <    /* skip hidden servers */
111 <    if (IsHidden(target_p))
103 >    if (HasFlag(target_p, FLAGS_SERVICE) && ConfigServerHide.hide_services)
104        continue;
105  
106 <    if (target_p->info[0])
107 <      p = target_p->info;
116 <    else
117 <      p = "(Unknown Location)";
118 <
119 <    newMessageLine = MyMalloc(sizeof(MessageFileLine));
120 <
121 <    /* Attempt to format the file in such a way it follows the usual links output
106 >    /*
107 >     * Attempt to format the file in such a way it follows the usual links output
108       * ie  "servername uplink :hops info"
109       * Mostly for aesthetic reasons - makes it look pretty in mIRC ;)
110       * - madmax
111       */
112 +    snprintf(buff, sizeof(buff), "%s %s :1 %s",   target_p->name,
113 +             me.name, target_p->info);
114 +    dlinkAddTail(xstrdup(buff), make_dlink_node(), &flatten_links);
115 +    snprintf(buff, sizeof(buff), "%s %s :1 %s\n", target_p->name,
116 +             me.name, target_p->info);
117  
118 <    /*
119 <     * For now, check this ircsprintf wont overflow - it shouldnt on a
129 <     * default config but it is configurable..
130 <     * This should be changed to an snprintf at some point, but I'm wanting to
131 <     * know if this is a cause of a bug - cryogen
132 <     */
133 <    assert(strlen(target_p->name) + strlen(me.name) + 6 + strlen(p) <=
134 <            MESSAGELINELEN);
135 <    snprintf(newMessageLine->line, sizeof(newMessageLine->line), "%s %s :1 %s",
136 <             target_p->name, me.name, p);
137 <    newMessageLine->next = NULL;
118 >    fputs(buff, file);
119 >  }
120  
121 <    if (MessageFileptr->contentsOfFile)
122 <    {
141 <      if (currentMessageLine)
142 <        currentMessageLine->next = newMessageLine;
143 <      currentMessageLine = newMessageLine;
144 <    }
145 <    else
146 <    {
147 <      MessageFileptr->contentsOfFile = newMessageLine;
148 <      currentMessageLine = newMessageLine;
149 <    }
121 >  fclose(file);
122 > }
123  
124 <    snprintf(buff, sizeof(buff), "%s %s :1 %s\n", target_p->name, me.name, p);
125 <    fputs(buff, file);
124 > void
125 > read_links_file(void)
126 > {
127 >  FILE *file = NULL;
128 >  char *p = NULL;
129 >  char buff[IRCD_BUFSIZE] = { '\0' };
130 >
131 >  if ((file = fopen(LIPATH, "r")) == NULL)
132 >    return;
133 >
134 >  while (fgets(buff, sizeof(buff), file))
135 >  {
136 >    if ((p = strchr(buff, '\n')) != NULL)
137 >      *p = '\0';
138 >
139 >    dlinkAddTail(xstrdup(buff), make_dlink_node(), &flatten_links);
140    }
141  
142    fclose(file);
# Line 176 | Line 163 | write_links_file(void* notused)
163   */
164   int
165   hunt_server(struct Client *client_p, struct Client *source_p, const char *command,
166 <            int server, int parc, char *parv[])
166 >            const int server, const int parc, char *parv[])
167   {
168    struct Client *target_p = NULL;
169    struct Client *target_tmp = NULL;
# Line 187 | Line 174 | hunt_server(struct Client *client_p, str
174    if (parc <= server || EmptyString(parv[server]))
175      return HUNTED_ISME;
176  
177 <  if (!strcmp(parv[server], me.id) || match(parv[server], me.name))
177 >  if (!strcmp(parv[server], me.id) || !match(parv[server], me.name))
178      return HUNTED_ISME;
179  
180    /* These are to pickup matches that would cause the following
# Line 207 | Line 194 | hunt_server(struct Client *client_p, str
194      if (target_p->from == source_p->from && !MyConnect(target_p))
195        target_p = NULL;
196  
210  collapse(parv[server]);
197    wilds = has_wildcards(parv[server]);
198  
199    /* Again, if there are no wild cards involved in the server
# Line 221 | Line 207 | hunt_server(struct Client *client_p, str
207        {
208          sendto_one(source_p, form_str(ERR_NOSUCHSERVER),
209                     me.name, source_p->name, parv[server]);
210 <        return(HUNTED_NOSUCH);
210 >        return HUNTED_NOSUCH;
211        }
212      }
213      else
# Line 230 | Line 216 | hunt_server(struct Client *client_p, str
216        {
217          target_tmp = ptr->data;
218  
219 <        if (match(parv[server], target_tmp->name))
219 >        if (!match(parv[server], target_tmp->name))
220          {
221            if (target_tmp->from == source_p->from && !MyConnect(target_tmp))
222              continue;
# Line 255 | Line 241 | hunt_server(struct Client *client_p, str
241      if (IsMe(target_p) || MyClient(target_p))
242        return HUNTED_ISME;
243  
244 <    if (!match(target_p->name, parv[server]))
244 >    if (match(target_p->name, parv[server]))
245        parv[server] = target_p->name;
246  
247      /* This is a little kludgy but should work... */
# Line 267 | Line 253 | hunt_server(struct Client *client_p, str
253      sendto_one(target_p, command, parv[0],
254                 parv[1], parv[2], parv[3], parv[4],
255                 parv[5], parv[6], parv[7], parv[8]);
256 <    return(HUNTED_PASS);
256 >    return HUNTED_PASS;
257    }
258  
259    sendto_one(source_p, form_str(ERR_NOSUCHSERVER),
260               me.name, source_p->name, parv[server]);
261 <  return(HUNTED_NOSUCH);
261 >  return HUNTED_NOSUCH;
262   }
263  
264   /* try_connections()
# Line 288 | Line 274 | hunt_server(struct Client *client_p, str
274   void
275   try_connections(void *unused)
276   {
277 <  dlink_node *ptr;
278 <  struct ConfItem *conf;
293 <  struct AccessItem *aconf;
294 <  struct ClassItem *cltmp;
277 >  dlink_node *ptr = NULL;
278 >  struct MaskItem *conf;
279    int confrq;
280  
281    /* TODO: change this to set active flag to 0 when added to event! --Habeeb */
# Line 301 | Line 285 | try_connections(void *unused)
285    DLINK_FOREACH(ptr, server_items.head)
286    {
287      conf = ptr->data;
288 <    aconf = map_to_conf(conf);
288 >
289 >    assert(conf->type == CONF_SERVER);
290  
291      /* Also when already connecting! (update holdtimes) --SRB
292       */
293 <    if (!(aconf->status & CONF_SERVER) || !aconf->port ||
309 <        !(IsConfAllowAutoConn(aconf)))
293 >    if (!conf->port ||!IsConfAllowAutoConn(conf))
294        continue;
295  
312    cltmp = map_to_conf(aconf->class_ptr);
296  
297      /* Skip this entry if the use of it is still on hold until
298       * future. Otherwise handle this entry (and set it on hold
# Line 317 | Line 300 | try_connections(void *unused)
300       * made one successfull connection... [this algorithm is
301       * a bit fuzzy... -- msa >;) ]
302       */
303 <    if (aconf->hold > CurrentTime)
303 >    if (conf->until > CurrentTime)
304        continue;
305  
306 <    if (cltmp == NULL)
306 >    if (conf->class == NULL)
307        confrq = DEFAULT_CONNECTFREQUENCY;
308      else
309      {
310 <      confrq = cltmp->con_freq;
310 >      confrq = conf->class->con_freq;
311        if (confrq < MIN_CONN_FREQ)
312 <        confrq = MIN_CONN_FREQ;
312 >        confrq = MIN_CONN_FREQ;
313      }
314  
315 <    aconf->hold = CurrentTime + confrq;
315 >    conf->until = CurrentTime + confrq;
316  
317      /* Found a CONNECT config with port specified, scan clients
318       * and see if this server is already connected?
# Line 337 | Line 320 | try_connections(void *unused)
320      if (hash_find_server(conf->name) != NULL)
321        continue;
322  
323 <    if (cltmp->curr_user_count < cltmp->max_total)
323 >    if (conf->class->ref_count < conf->class->max_total)
324      {
325        /* Go to the end of the list, if not already last */
326        if (ptr->next != NULL)
# Line 358 | Line 341 | try_connections(void *unused)
341         *   -- adrian
342         */
343        if (ConfigServerHide.hide_server_ips)
344 <        sendto_realops_flags(UMODE_ALL, L_ALL, "Connection to %s activated.",
344 >        sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
345 >                             "Connection to %s activated.",
346                               conf->name);
347        else
348 <        sendto_realops_flags(UMODE_ALL, L_ALL, "Connection to %s[%s] activated.",
349 <                             conf->name, aconf->host);
348 >        sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
349 >                             "Connection to %s[%s] activated.",
350 >                             conf->name, conf->host);
351  
352 <      serv_connect(aconf, NULL);
352 >      serv_connect(conf, NULL);
353        /* We connect only one at time... */
354        return;
355      }
# Line 396 | Line 381 | int
381   check_server(const char *name, struct Client *client_p)
382   {
383    dlink_node *ptr;
384 <  struct ConfItem *conf           = NULL;
385 <  struct ConfItem *server_conf    = NULL;
401 <  struct AccessItem *server_aconf = NULL;
402 <  struct AccessItem *aconf        = NULL;
384 >  struct MaskItem *conf        = NULL;
385 >  struct MaskItem *server_conf = NULL;
386    int error = -1;
387  
388    assert(client_p != NULL);
# Line 408 | Line 391 | check_server(const char *name, struct Cl
391    DLINK_FOREACH(ptr, server_items.head)
392    {
393      conf = ptr->data;
411    aconf = map_to_conf(conf);
394  
395 <    if (!match(name, conf->name))
395 >    if (match(name, conf->name))
396        continue;
397  
398      error = -3;
399  
400      /* XXX: Fix me for IPv6                    */
401      /* XXX sockhost is the IPv4 ip as a string */
402 <    if (match(aconf->host, client_p->host) ||
403 <        match(aconf->host, client_p->sockhost))
402 >    if (!match(conf->host, client_p->host) ||
403 >        !match(conf->host, client_p->sockhost))
404      {
405        error = -2;
406  
407 <      if (!match_conf_password(client_p->localClient->passwd, aconf))
407 >      if (!match_conf_password(client_p->localClient->passwd, conf))
408          return -2;
409  
410 +      if (!EmptyString(conf->certfp))
411 +        if (EmptyString(client_p->certfp) || strcasecmp(client_p->certfp, conf->certfp))
412 +          return -4;
413 +
414        server_conf = conf;
415      }
416    }
417  
418    if (server_conf == NULL)
419 <    return(error);
419 >    return error;
420  
421    attach_conf(client_p, server_conf);
422  
437  server_aconf = map_to_conf(server_conf);
438
439  if (!IsConfTopicBurst(server_aconf))
440    ClearCap(client_p, CAP_TBURST);
423  
424 <  if (aconf != NULL)
424 >  if (server_conf != NULL)
425    {
426      struct sockaddr_in *v4;
427   #ifdef IPV6
428      struct sockaddr_in6 *v6;
429   #endif
430 <    switch (aconf->aftype)
430 >    switch (server_conf->aftype)
431      {
432   #ifdef IPV6
433        case AF_INET6:
434 <        v6 = (struct sockaddr_in6 *)&aconf->addr;
434 >        v6 = (struct sockaddr_in6 *)&server_conf->addr;
435  
436          if (IN6_IS_ADDR_UNSPECIFIED(&v6->sin6_addr))
437 <          memcpy(&aconf->addr, &client_p->localClient->ip, sizeof(struct irc_ssaddr));
437 >          memcpy(&server_conf->addr, &client_p->localClient->ip, sizeof(struct irc_ssaddr));
438          break;
439   #endif
440        case AF_INET:
441 <        v4 = (struct sockaddr_in *)&aconf->addr;
441 >        v4 = (struct sockaddr_in *)&server_conf->addr;
442  
443          if (v4->sin_addr.s_addr == INADDR_NONE)
444 <          memcpy(&aconf->addr, &client_p->localClient->ip, sizeof(struct irc_ssaddr));
444 >          memcpy(&server_conf->addr, &client_p->localClient->ip, sizeof(struct irc_ssaddr));
445          break;
446      }
447    }
448  
449 <  return(0);
449 >  return 0;
450   }
451  
452   /* add_capability()
# Line 481 | Line 463 | add_capability(const char *capab_name, i
463   {
464    struct Capability *cap = MyMalloc(sizeof(*cap));
465  
466 <  DupString(cap->name, capab_name);
466 >  cap->name = xstrdup(capab_name);
467    cap->cap = cap_flag;
468    dlinkAdd(cap, &cap->node, &cap_list);
469  
# Line 510 | Line 492 | delete_capability(const char *capab_name
492      {
493        if (irccmp(cap->name, capab_name) == 0)
494        {
495 <        default_server_capabs &= ~(cap->cap);
496 <        dlinkDelete(ptr, &cap_list);
497 <        MyFree(cap->name);
498 <        cap->name = NULL;
517 <        MyFree(cap);
495 >        default_server_capabs &= ~(cap->cap);
496 >        dlinkDelete(ptr, &cap_list);
497 >        MyFree(cap->name);
498 >        MyFree(cap);
499        }
500      }
501    }
# Line 529 | Line 510 | delete_capability(const char *capab_name
510   * output       - 0 if not found CAPAB otherwise
511   * side effects - none
512   */
513 < int
513 > unsigned int
514   find_capability(const char *capab)
515   {
516    const dlink_node *ptr = NULL;
# Line 548 | Line 529 | find_capability(const char *capab)
529   /* send_capabilities()
530   *
531   * inputs       - Client pointer to send to
551 *              - Pointer to AccessItem (for crypt)
532   *              - int flag of capabilities that this server can send
533   * output       - NONE
534   * side effects - send the CAPAB line to a server  -orabidoo
535   *
536   */
537   void
538 < send_capabilities(struct Client *client_p, struct AccessItem *aconf,
559 <                  int cap_can_send)
538 > send_capabilities(struct Client *client_p, int cap_can_send)
539   {
540    struct Capability *cap=NULL;
541    char msgbuf[IRCD_BUFSIZE];
# Line 572 | Line 551 | send_capabilities(struct Client *client_
551  
552      if (cap->cap & (cap_can_send|default_server_capabs))
553      {
554 <      tl = ircsprintf(t, "%s ", cap->name);
554 >      tl = sprintf(t, "%s ", cap->name);
555        t += tl;
556      }
557    }
# Line 604 | Line 583 | sendnick_TS(struct Client *client_p, str
583      ubuf[1] = '\0';
584    }
585  
607  /* XXX Both of these need to have a :me.name or :mySID!?!?! */
586    if (IsCapable(client_p, CAP_SVS))
587    {
588      if (HasID(target_p) && IsCapable(client_p, CAP_TS6))
589 <      sendto_one(client_p, ":%s UID %s %d %lu %s %s %s %s %s %lu :%s",
589 >      sendto_one(client_p, ":%s UID %s %d %lu %s %s %s %s %s %s :%s",
590                   target_p->servptr->id,
591                   target_p->name, target_p->hopcount + 1,
592                   (unsigned long) target_p->tsinfo,
593                   ubuf, target_p->username, target_p->host,
594                   (MyClient(target_p) && IsIPSpoof(target_p)) ?
595                   "0" : target_p->sockhost, target_p->id,
596 <                 (unsigned long)target_p->servicestamp, target_p->info);
596 >                 target_p->svid, target_p->info);
597      else
598 <      sendto_one(client_p, "NICK %s %d %lu %s %s %s %s %lu :%s",
598 >      sendto_one(client_p, "NICK %s %d %lu %s %s %s %s %s :%s",
599                   target_p->name, target_p->hopcount + 1,
600                   (unsigned long) target_p->tsinfo,
601                   ubuf, target_p->username, target_p->host,
602 <                 target_p->servptr->name, (unsigned long)target_p->servicestamp,
602 >                 target_p->servptr->name, target_p->svid,
603                   target_p->info);
604    }
605    else
# Line 642 | Line 620 | sendnick_TS(struct Client *client_p, str
620                   target_p->servptr->name, target_p->info);
621    }
622  
623 <  if (IsConfAwayBurst((struct AccessItem *)map_to_conf(client_p->localClient->confs.head->data)))
624 <    if (target_p->away[0])
625 <      sendto_one(client_p, ":%s AWAY :%s", ID_or_name(target_p, client_p),
626 <                 target_p->away);
623 >  if (!EmptyString(target_p->certfp))
624 >    sendto_one(client_p, ":%s CERTFP %s",
625 >               ID_or_name(target_p, client_p), target_p->certfp);
626 >
627 >  if (target_p->away[0])
628 >    sendto_one(client_p, ":%s AWAY :%s", ID_or_name(target_p, client_p),
629 >               target_p->away);
630  
631   }
632  
# Line 657 | Line 638 | sendnick_TS(struct Client *client_p, str
638   * side effects - build up string representing capabilities of server listed
639   */
640   const char *
641 < show_capabilities(struct Client *target_p)
641 > show_capabilities(const struct Client *target_p)
642   {
643 <  static char msgbuf[IRCD_BUFSIZE];
644 <  char *t = msgbuf;
664 <  dlink_node *ptr;
665 <
666 <  t += ircsprintf(msgbuf, "TS ");
643 >  static char msgbuf[IRCD_BUFSIZE] = "TS";
644 >  const dlink_node *ptr = NULL;
645  
646    DLINK_FOREACH(ptr, cap_list.head)
647    {
648      const struct Capability *cap = ptr->data;
649  
650 <    if (IsCapable(target_p, cap->cap))
651 <      t += ircsprintf(t, "%s ", cap->name);
650 >    if (!IsCapable(target_p, cap->cap))
651 >      continue;
652 >
653 >    strlcat(msgbuf,       " ", sizeof(msgbuf));
654 >    strlcat(msgbuf, cap->name, sizeof(msgbuf));
655    }
656  
676  *(t - 1) = '\0';
657    return msgbuf;
658   }
659  
# Line 703 | Line 683 | void
683   server_estab(struct Client *client_p)
684   {
685    struct Client *target_p;
686 <  struct ConfItem *conf;
707 <  struct AccessItem *aconf=NULL;
686 >  struct MaskItem *conf = NULL;
687    char *host;
688    const char *inpath;
689    static char inpath_ip[HOSTLEN * 2 + USERLEN + 6];
# Line 720 | Line 699 | server_estab(struct Client *client_p)
699    inpath = get_client_name(client_p, MASK_IP); /* "refresh" inpath with host */
700    host   = client_p->name;
701  
702 <  if ((conf = find_conf_name(&client_p->localClient->confs, host, SERVER_TYPE))
702 >  if ((conf = find_conf_name(&client_p->localClient->confs, host, CONF_SERVER))
703        == NULL)
704    {
705      /* This shouldn't happen, better tell the ops... -A1kmm */
706 <    sendto_realops_flags(UMODE_ALL, L_ALL, "Warning: Lost connect{} block "
706 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
707 >                         "Warning: Lost connect{} block "
708                           "for server %s(this shouldn't happen)!", host);
709      exit_client(client_p, &me, "Lost connect{} block!");
710      return;
# Line 750 | Line 730 | server_estab(struct Client *client_p)
730      }
731    }
732  
753  aconf = map_to_conf(conf);
754
733    if (IsUnknown(client_p))
734    {
735 <    /* jdc -- 1.  Use EmptyString(), not [0] index reference.
758 <     *        2.  Check aconf->spasswd, not aconf->passwd.
759 <     */
760 <    if (!EmptyString(aconf->spasswd))
761 <      sendto_one(client_p, "PASS %s TS %d %s",
762 <                 aconf->spasswd, TS_CURRENT, me.id);
763 <
764 <    /* Pass my info to the new server
765 <     *
766 <     * Pass on ZIP if supported
767 <     * Pass on TB if supported.
768 <     * - Dianora
769 <     */
735 >    sendto_one(client_p, "PASS %s TS %d %s", conf->spasswd, TS_CURRENT, me.id);
736  
737 <    send_capabilities(client_p, aconf,
772 <      (IsConfTopicBurst(aconf) ? CAP_TBURST : 0));
737 >    send_capabilities(client_p, 0);
738  
739      sendto_one(client_p, "SERVER %s 1 :%s%s",
740                 me.name, ConfigServerHide.hidden ? "(H) " : "", me.info);
# Line 783 | Line 748 | server_estab(struct Client *client_p)
748      hash_add_id(client_p);
749  
750    /* XXX Does this ever happen? I don't think so -db */
751 <  detach_conf(client_p, OPER_TYPE);
751 >  detach_conf(client_p, CONF_OPER);
752  
753    /* *WARNING*
754    **    In the following code in place of plain server's
# Line 825 | Line 790 | server_estab(struct Client *client_p)
790    /* fixing eob timings.. -gnp */
791    client_p->localClient->firsttime = CurrentTime;
792  
793 <  if (find_matching_name_conf(SERVICE_TYPE, client_p->name, NULL, NULL, 0))
793 >  if (find_matching_name_conf(CONF_SERVICE, client_p->name, NULL, NULL, 0))
794      AddFlag(client_p, FLAGS_SERVICE);
795  
796    /* Show the real host/IP to admins */
# Line 835 | Line 800 | server_estab(struct Client *client_p)
800      compression = SSL_get_current_compression(client_p->localClient->fd.ssl);
801      expansion   = SSL_get_current_expansion(client_p->localClient->fd.ssl);
802  
803 <    sendto_realops_flags(UMODE_ALL, L_ADMIN,
803 >    sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
804                           "Link with %s established: [SSL: %s, Compression/Expansion method: %s/%s] (Capabilities: %s)",
805                           inpath_ip, ssl_get_cipher(client_p->localClient->fd.ssl),
806                           compression ? SSL_COMP_get_name(compression) : "NONE",
807                           expansion ? SSL_COMP_get_name(expansion) : "NONE",
808                           show_capabilities(client_p));
809      /* Now show the masked hostname/IP to opers */
810 <    sendto_realops_flags(UMODE_ALL, L_OPER,
810 >    sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
811                           "Link with %s established: [SSL: %s, Compression/Expansion method: %s/%s] (Capabilities: %s)",
812                           inpath, ssl_get_cipher(client_p->localClient->fd.ssl),
813                           compression ? SSL_COMP_get_name(compression) : "NONE",
# Line 857 | Line 822 | server_estab(struct Client *client_p)
822    else
823   #endif
824    {
825 <    sendto_realops_flags(UMODE_ALL, L_ADMIN,
825 >    sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
826                           "Link with %s established: (Capabilities: %s)",
827 <                         inpath_ip,show_capabilities(client_p));
827 >                         inpath_ip, show_capabilities(client_p));
828      /* Now show the masked hostname/IP to opers */
829 <    sendto_realops_flags(UMODE_ALL, L_OPER,
829 >    sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
830                           "Link with %s established: (Capabilities: %s)",
831 <                         inpath,show_capabilities(client_p));
831 >                         inpath, show_capabilities(client_p));
832      ilog(LOG_TYPE_IRCD, "Link with %s established: (Capabilities: %s)",
833           inpath_ip, show_capabilities(client_p));
834    }
# Line 935 | Line 900 | server_estab(struct Client *client_p)
900        sendto_one(client_p, ":%s SERVER %s %d :%s%s",
901                   target_p->servptr->name, target_p->name, target_p->hopcount+1,
902                   IsHidden(target_p) ? "(H) " : "", target_p->info);
903 +
904 +    if (HasFlag(target_p, FLAGS_EOB))
905 +      sendto_one(client_p, ":%s EOB", ID_or_name(client_p, target_p));
906    }
907  
908    server_burst(client_p);
# Line 989 | Line 957 | burst_all(struct Client *client_p)
957        send_channel_modes(client_p, chptr);
958  
959        if (IsCapable(client_p, CAP_TBURST))
960 <        send_tb(client_p, chptr);
960 >        send_tb(client_p, chptr);
961      }
962    }
963  
# Line 1005 | Line 973 | burst_all(struct Client *client_p)
973      DelFlag(target_p, FLAGS_BURSTED);
974    }
975  
1008  /* We send the time we started the burst, and let the remote host determine an EOB time,
1009  ** as otherwise we end up sending a EOB of 0   Sending here means it gets sent last -- fl
1010  */
1011  /* Its simpler to just send EOB and use the time its been connected.. --fl_ */
976    if (IsCapable(client_p, CAP_EOB))
977      sendto_one(client_p, ":%s EOB", ID_or_name(&me, client_p));
978   }
# Line 1098 | Line 1062 | burst_members(struct Client *client_p, s
1062   * it suceeded or not, and 0 if it fails in here somewhere.
1063   */
1064   int
1065 < serv_connect(struct AccessItem *aconf, struct Client *by)
1065 > serv_connect(struct MaskItem *conf, struct Client *by)
1066   {
1103  struct ConfItem *conf;
1067    struct Client *client_p;
1068    char buf[HOSTIPLEN + 1];
1069  
1070    /* conversion structs */
1071    struct sockaddr_in *v4;
1072 <  /* Make sure aconf is useful */
1073 <  assert(aconf != NULL);
1072 >  /* Make sure conf is useful */
1073 >  assert(conf != NULL);
1074  
1112  /* XXX should be passing struct ConfItem in the first place */
1113  conf = unmap_conf_item(aconf);
1075  
1076 <  /* log */
1116 <  getnameinfo((struct sockaddr *)&aconf->addr, aconf->addr.ss_len,
1076 >  getnameinfo((struct sockaddr *)&conf->addr, conf->addr.ss_len,
1077                buf, sizeof(buf), NULL, 0, NI_NUMERICHOST);
1078 <  ilog(LOG_TYPE_IRCD, "Connect to %s[%s] @%s", conf->name, aconf->host,
1078 >  ilog(LOG_TYPE_IRCD, "Connect to %s[%s] @%s", conf->name, conf->host,
1079         buf);
1080  
1081    /* Still processing a DNS lookup? -> exit */
1082 <  if (aconf->dns_pending)
1082 >  if (conf->dns_pending)
1083    {
1084 <    sendto_realops_flags(UMODE_ALL, L_ALL,
1084 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
1085                           "Error connecting to %s: DNS lookup for connect{} in progress.",
1086                           conf->name);
1087      return (0);
1088    }
1089  
1090 <  if (aconf->dns_failed)
1090 >  if (conf->dns_failed)
1091    {
1092 <    sendto_realops_flags(UMODE_ALL, L_ALL,
1092 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
1093                           "Error connecting to %s: DNS lookup for connect{} failed.",
1094                           conf->name);
1095      return (0);
1096    }
1097  
1098    /* Make sure this server isn't already connected
1099 <   * Note: aconf should ALWAYS be a valid C: line
1099 >   * Note: conf should ALWAYS be a valid C: line
1100     */
1101    if ((client_p = hash_find_server(conf->name)) != NULL)
1102    {
1103 <    sendto_realops_flags(UMODE_ALL, L_ADMIN,
1104 <                         "Server %s already present from %s",
1105 <                         conf->name, get_client_name(client_p, SHOW_IP));
1106 <    sendto_realops_flags(UMODE_ALL, L_OPER,
1107 <                         "Server %s already present from %s",
1108 <                         conf->name, get_client_name(client_p, MASK_IP));
1103 >    sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1104 >                         "Server %s already present from %s",
1105 >                         conf->name, get_client_name(client_p, SHOW_IP));
1106 >    sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
1107 >                         "Server %s already present from %s",
1108 >                         conf->name, get_client_name(client_p, MASK_IP));
1109      if (by && IsClient(by) && !MyClient(by))
1110        sendto_one(by, ":%s NOTICE %s :Server %s already present from %s",
1111 <                 me.name, by->name, conf->name,
1112 <                 get_client_name(client_p, MASK_IP));
1113 <    return (0);
1111 >                 me.name, by->name, conf->name,
1112 >                 get_client_name(client_p, MASK_IP));
1113 >    return 0;
1114    }
1115      
1116    /* Create a local client */
# Line 1158 | Line 1118 | serv_connect(struct AccessItem *aconf, s
1118  
1119    /* Copy in the server, hostname, fd */
1120    strlcpy(client_p->name, conf->name, sizeof(client_p->name));
1121 <  strlcpy(client_p->host, aconf->host, sizeof(client_p->host));
1121 >  strlcpy(client_p->host, conf->host, sizeof(client_p->host));
1122  
1123    /* We already converted the ip once, so lets use it - stu */
1124    strlcpy(client_p->sockhost, buf, sizeof(client_p->sockhost));
1125  
1126    /* create a socket for the server connection */
1127 <  if (comm_open(&client_p->localClient->fd, aconf->addr.ss.ss_family,
1127 >  if (comm_open(&client_p->localClient->fd, conf->addr.ss.ss_family,
1128                  SOCK_STREAM, 0, NULL) < 0)
1129    {
1130      /* Eek, failure to create the socket */
1131 <    report_error(L_ALL,
1132 <                 "opening stream socket to %s: %s", conf->name, errno);
1131 >    report_error(L_ALL, "opening stream socket to %s: %s",
1132 >                 conf->name, errno);
1133      SetDead(client_p);
1134      exit_client(client_p, &me, "Connection failed");
1135 <    return (0);
1135 >    return 0;
1136    }
1137  
1138    /* servernames are always guaranteed under HOSTLEN chars */
# Line 1181 | Line 1141 | serv_connect(struct AccessItem *aconf, s
1141    /* Attach config entries to client here rather than in
1142     * serv_connect_callback(). This to avoid null pointer references.
1143     */
1144 <  if (!attach_connect_block(client_p, conf->name, aconf->host))
1144 >  if (!attach_connect_block(client_p, conf->name, conf->host))
1145    {
1146 <    sendto_realops_flags(UMODE_ALL, L_ALL,
1147 <                         "Host %s is not enabled for connecting:no C/N-line",
1148 <                         conf->name);
1146 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
1147 >                         "Host %s is not enabled for connecting: no connect{} block",
1148 >                         conf->name);
1149      if (by && IsClient(by) && !MyClient(by))  
1150        sendto_one(by, ":%s NOTICE %s :Connect to host %s failed.",
1151 <                 me.name, by->name, client_p->name);
1151 >                 me.name, by->name, client_p->name);
1152      SetDead(client_p);
1153      exit_client(client_p, client_p, "Connection failed");
1154 <    return (0);
1154 >    return 0;
1155    }
1156  
1157    /* at this point we have a connection in progress and C/N lines
# Line 1210 | Line 1170 | serv_connect(struct AccessItem *aconf, s
1170    SetConnecting(client_p);
1171    dlinkAdd(client_p, &client_p->node, &global_client_list);
1172    /* from def_fam */
1173 <  client_p->localClient->aftype = aconf->aftype;
1173 >  client_p->localClient->aftype = conf->aftype;
1174  
1175    /* Now, initiate the connection */
1176    /* XXX assume that a non 0 type means a specific bind address
1177     * for this connect.
1178     */
1179 <  switch (aconf->aftype)
1179 >  switch (conf->aftype)
1180    {
1181      case AF_INET:
1182 <      v4 = (struct sockaddr_in*)&aconf->bind;
1182 >      v4 = (struct sockaddr_in*)&conf->bind;
1183        if (v4->sin_addr.s_addr != 0)
1184        {
1185          struct irc_ssaddr ipn;
1186          memset(&ipn, 0, sizeof(struct irc_ssaddr));
1187          ipn.ss.ss_family = AF_INET;
1188          ipn.ss_port = 0;
1189 <        memcpy(&ipn, &aconf->bind, sizeof(struct irc_ssaddr));
1190 <        comm_connect_tcp(&client_p->localClient->fd, aconf->host, aconf->port,
1191 <                         (struct sockaddr *)&ipn, ipn.ss_len,
1192 <                         serv_connect_callback, client_p, aconf->aftype,
1193 <                         CONNECTTIMEOUT);
1189 >        memcpy(&ipn, &conf->bind, sizeof(struct irc_ssaddr));
1190 >        comm_connect_tcp(&client_p->localClient->fd, conf->host, conf->port,
1191 >                         (struct sockaddr *)&ipn, ipn.ss_len,
1192 >                         serv_connect_callback, client_p, conf->aftype,
1193 >                         CONNECTTIMEOUT);
1194        }
1195        else if (ServerInfo.specific_ipv4_vhost)
1196        {
# Line 1239 | Line 1199 | serv_connect(struct AccessItem *aconf, s
1199          ipn.ss.ss_family = AF_INET;
1200          ipn.ss_port = 0;
1201          memcpy(&ipn, &ServerInfo.ip, sizeof(struct irc_ssaddr));
1202 <        comm_connect_tcp(&client_p->localClient->fd, aconf->host, aconf->port,
1202 >        comm_connect_tcp(&client_p->localClient->fd, conf->host, conf->port,
1203                           (struct sockaddr *)&ipn, ipn.ss_len,
1204 <                         serv_connect_callback, client_p, aconf->aftype,
1205 <                         CONNECTTIMEOUT);
1204 >                         serv_connect_callback, client_p, conf->aftype,
1205 >                         CONNECTTIMEOUT);
1206        }
1207        else
1208 <        comm_connect_tcp(&client_p->localClient->fd, aconf->host, aconf->port,
1209 <                         NULL, 0, serv_connect_callback, client_p, aconf->aftype,
1208 >        comm_connect_tcp(&client_p->localClient->fd, conf->host, conf->port,
1209 >                         NULL, 0, serv_connect_callback, client_p, conf->aftype,
1210                           CONNECTTIMEOUT);
1211        break;
1212   #ifdef IPV6
1213      case AF_INET6:
1214        {
1215 <        struct irc_ssaddr ipn;
1216 <        struct sockaddr_in6 *v6;
1217 <        struct sockaddr_in6 *v6conf;
1218 <
1219 <        memset(&ipn, 0, sizeof(struct irc_ssaddr));
1220 <        v6conf = (struct sockaddr_in6 *)&aconf->bind;
1221 <        v6 = (struct sockaddr_in6 *)&ipn;
1222 <
1223 <        if (memcmp(&v6conf->sin6_addr, &v6->sin6_addr,
1224 <                   sizeof(struct in6_addr)) != 0)
1225 <        {
1226 <          memcpy(&ipn, &aconf->bind, sizeof(struct irc_ssaddr));
1227 <          ipn.ss.ss_family = AF_INET6;
1228 <          ipn.ss_port = 0;
1229 <          comm_connect_tcp(&client_p->localClient->fd,
1230 <                           aconf->host, aconf->port,
1231 <                           (struct sockaddr *)&ipn, ipn.ss_len,
1232 <                           serv_connect_callback, client_p,
1233 <                           aconf->aftype, CONNECTTIMEOUT);
1234 <        }
1275 <        else if (ServerInfo.specific_ipv6_vhost)
1215 >        struct irc_ssaddr ipn;
1216 >        struct sockaddr_in6 *v6;
1217 >        struct sockaddr_in6 *v6conf;
1218 >
1219 >        memset(&ipn, 0, sizeof(struct irc_ssaddr));
1220 >        v6conf = (struct sockaddr_in6 *)&conf->bind;
1221 >        v6 = (struct sockaddr_in6 *)&ipn;
1222 >
1223 >        if (memcmp(&v6conf->sin6_addr, &v6->sin6_addr, sizeof(struct in6_addr)) != 0)
1224 >        {
1225 >          memcpy(&ipn, &conf->bind, sizeof(struct irc_ssaddr));
1226 >          ipn.ss.ss_family = AF_INET6;
1227 >          ipn.ss_port = 0;
1228 >          comm_connect_tcp(&client_p->localClient->fd,
1229 >                           conf->host, conf->port,
1230 >                           (struct sockaddr *)&ipn, ipn.ss_len,
1231 >                           serv_connect_callback, client_p,
1232 >                           conf->aftype, CONNECTTIMEOUT);
1233 >        }
1234 >        else if (ServerInfo.specific_ipv6_vhost)
1235          {
1236 <          memcpy(&ipn, &ServerInfo.ip6, sizeof(struct irc_ssaddr));
1237 <          ipn.ss.ss_family = AF_INET6;
1238 <          ipn.ss_port = 0;
1239 <          comm_connect_tcp(&client_p->localClient->fd,
1240 <                           aconf->host, aconf->port,
1241 <                           (struct sockaddr *)&ipn, ipn.ss_len,
1242 <                           serv_connect_callback, client_p,
1243 <                           aconf->aftype, CONNECTTIMEOUT);
1244 <        }
1245 <        else
1246 <          comm_connect_tcp(&client_p->localClient->fd,
1247 <                           aconf->host, aconf->port,
1248 <                           NULL, 0, serv_connect_callback, client_p,
1249 <                           aconf->aftype, CONNECTTIMEOUT);
1236 >          memcpy(&ipn, &ServerInfo.ip6, sizeof(struct irc_ssaddr));
1237 >          ipn.ss.ss_family = AF_INET6;
1238 >          ipn.ss_port = 0;
1239 >          comm_connect_tcp(&client_p->localClient->fd,
1240 >                           conf->host, conf->port,
1241 >                           (struct sockaddr *)&ipn, ipn.ss_len,
1242 >                           serv_connect_callback, client_p,
1243 >                           conf->aftype, CONNECTTIMEOUT);
1244 >        }
1245 >        else
1246 >          comm_connect_tcp(&client_p->localClient->fd,
1247 >                           conf->host, conf->port,
1248 >                           NULL, 0, serv_connect_callback, client_p,
1249 >                           conf->aftype, CONNECTTIMEOUT);
1250        }
1251   #endif
1252    }
1253 <  return (1);
1253 >  return 1;
1254   }
1255  
1256   #ifdef HAVE_LIBCRYPTO
1257   static void
1258   finish_ssl_server_handshake(struct Client *client_p)
1259   {
1260 <  struct ConfItem *conf=NULL;
1302 <  struct AccessItem *aconf=NULL;
1260 >  struct MaskItem *conf = NULL;
1261  
1262    conf = find_conf_name(&client_p->localClient->confs,
1263 <                        client_p->name, SERVER_TYPE);
1263 >                        client_p->name, CONF_SERVER);
1264    if (conf == NULL)
1265    {
1266 <    sendto_realops_flags(UMODE_ALL, L_ADMIN,
1266 >    sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1267                           "Lost connect{} block for %s", get_client_name(client_p, HIDE_IP));
1268 <    sendto_realops_flags(UMODE_ALL, L_OPER,
1268 >    sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
1269                           "Lost connect{} block for %s", get_client_name(client_p, MASK_IP));
1270  
1271      exit_client(client_p, &me, "Lost connect{} block");
1272      return;
1273    }
1274  
1275 <  aconf = map_to_conf(conf);
1275 >  sendto_one(client_p, "PASS %s TS %d %s", conf->spasswd, TS_CURRENT, me.id);
1276  
1277 <  /* jdc -- Check and send spasswd, not passwd. */
1320 <  if (!EmptyString(aconf->spasswd))
1321 <    sendto_one(client_p, "PASS %s TS %d %s",
1322 <               aconf->spasswd, TS_CURRENT, me.id);
1323 <
1324 <  send_capabilities(client_p, aconf,
1325 <                   (IsConfTopicBurst(aconf) ? CAP_TBURST : 0));
1277 >  send_capabilities(client_p, 0);
1278  
1279    sendto_one(client_p, "SERVER %s 1 :%s%s",
1280               me.name, ConfigServerHide.hidden ? "(H) " : "",
# Line 1333 | Line 1285 | finish_ssl_server_handshake(struct Clien
1285     */
1286    if (IsDead(client_p))
1287    {
1288 <      sendto_realops_flags(UMODE_ALL, L_ADMIN,
1288 >      sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1289                             "%s[%s] went dead during handshake",
1290                             client_p->name,
1291                             client_p->host);
1292 <      sendto_realops_flags(UMODE_ALL, L_OPER,
1292 >      sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
1293                             "%s went dead during handshake", client_p->name);
1294        return;
1295    }
# Line 1370 | Line 1322 | ssl_server_handshake(fde_t *fd, struct C
1322        default:
1323        {
1324          const char *sslerr = ERR_error_string(ERR_get_error(), NULL);
1325 <        sendto_realops_flags(UMODE_ALL, L_ALL,
1325 >        sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
1326                               "Error connecting to %s: %s", client_p->name,
1327                               sslerr ? sslerr : "unknown SSL error");
1328          exit_client(client_p, client_p, "Error during SSL handshake");
# Line 1383 | Line 1335 | ssl_server_handshake(fde_t *fd, struct C
1335   }
1336  
1337   static void
1338 < ssl_connect_init(struct Client *client_p, struct AccessItem *aconf, fde_t *fd)
1338 > ssl_connect_init(struct Client *client_p, struct MaskItem *conf, fde_t *fd)
1339   {
1340    if ((client_p->localClient->fd.ssl = SSL_new(ServerInfo.client_ctx)) == NULL)
1341    {
# Line 1396 | Line 1348 | ssl_connect_init(struct Client *client_p
1348  
1349    SSL_set_fd(fd->ssl, fd->fd);
1350  
1351 <  if (!EmptyString(aconf->cipher_list))
1352 <    SSL_set_cipher_list(client_p->localClient->fd.ssl, aconf->cipher_list);
1351 >  if (!EmptyString(conf->cipher_list))
1352 >    SSL_set_cipher_list(client_p->localClient->fd.ssl, conf->cipher_list);
1353  
1354    ssl_server_handshake(NULL, client_p);
1355   }
# Line 1415 | Line 1367 | static void
1367   serv_connect_callback(fde_t *fd, int status, void *data)
1368   {
1369    struct Client *client_p = data;
1370 <  struct ConfItem *conf=NULL;
1419 <  struct AccessItem *aconf=NULL;
1370 >  struct MaskItem *conf = NULL;
1371  
1372    /* First, make sure its a real client! */
1373    assert(client_p != NULL);
# Line 1432 | Line 1383 | serv_connect_callback(fde_t *fd, int sta
1383       * Admins get to see any IP, mere opers don't *sigh*
1384       */
1385       if (ConfigServerHide.hide_server_ips)
1386 <       sendto_realops_flags(UMODE_ALL, L_ADMIN,
1386 >       sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1387                              "Error connecting to %s: %s",
1388                              client_p->name, comm_errstr(status));
1389       else
1390 <       sendto_realops_flags(UMODE_ALL, L_ADMIN,
1391 <                            "Error connecting to %s[%s]: %s", client_p->name,
1392 <                            client_p->host, comm_errstr(status));
1393 <
1394 <     sendto_realops_flags(UMODE_ALL, L_OPER,
1395 <                          "Error connecting to %s: %s",
1396 <                          client_p->name, comm_errstr(status));
1390 >       sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1391 >                            "Error connecting to %s[%s]: %s", client_p->name,
1392 >                            client_p->host, comm_errstr(status));
1393 >
1394 >     sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
1395 >                          "Error connecting to %s: %s",
1396 >                          client_p->name, comm_errstr(status));
1397  
1398       /* If a fd goes bad, call dead_link() the socket is no
1399        * longer valid for reading or writing.
# Line 1454 | Line 1405 | serv_connect_callback(fde_t *fd, int sta
1405    /* COMM_OK, so continue the connection procedure */
1406    /* Get the C/N lines */
1407    conf = find_conf_name(&client_p->localClient->confs,
1408 <                        client_p->name, SERVER_TYPE);
1408 >                        client_p->name, CONF_SERVER);
1409    if (conf == NULL)
1410    {
1411 <    sendto_realops_flags(UMODE_ALL, L_ADMIN,
1412 <                         "Lost connect{} block for %s", get_client_name(client_p, HIDE_IP));
1413 <    sendto_realops_flags(UMODE_ALL, L_OPER,
1414 <                         "Lost connect{} block for %s", get_client_name(client_p, MASK_IP));
1411 >    sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1412 >                         "Lost connect{} block for %s", get_client_name(client_p, HIDE_IP));
1413 >    sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
1414 >                         "Lost connect{} block for %s", get_client_name(client_p, MASK_IP));
1415  
1416      exit_client(client_p, &me, "Lost connect{} block");
1417      return;
1418    }
1419  
1469  aconf = map_to_conf(conf);
1420    /* Next, send the initial handshake */
1421    SetHandshake(client_p);
1422  
1423   #ifdef HAVE_LIBCRYPTO
1424 <  if (IsConfSSL(aconf))
1424 >  if (IsConfSSL(conf))
1425    {
1426 <    ssl_connect_init(client_p, aconf, fd);
1426 >    ssl_connect_init(client_p, conf, fd);
1427      return;
1428    }
1429   #endif
1430  
1431 <  /* jdc -- Check and send spasswd, not passwd. */
1482 <  if (!EmptyString(aconf->spasswd))
1483 <    sendto_one(client_p, "PASS %s TS %d %s",
1484 <               aconf->spasswd, TS_CURRENT, me.id);
1431 >  sendto_one(client_p, "PASS %s TS %d %s", conf->spasswd, TS_CURRENT, me.id);
1432  
1433 <  send_capabilities(client_p, aconf,
1487 <                   (IsConfTopicBurst(aconf) ? CAP_TBURST : 0));
1433 >  send_capabilities(client_p, 0);
1434  
1435 <  sendto_one(client_p, "SERVER %s 1 :%s%s",
1436 <             me.name, ConfigServerHide.hidden ? "(H) " : "",
1491 <             me.info);
1435 >  sendto_one(client_p, "SERVER %s 1 :%s%s", me.name,
1436 >             ConfigServerHide.hidden ? "(H) " : "", me.info);
1437  
1438    /* If we've been marked dead because a send failed, just exit
1439     * here now and save everyone the trouble of us ever existing.
1440     */
1441    if (IsDead(client_p))
1442    {
1443 <      sendto_realops_flags(UMODE_ALL, L_ADMIN,
1444 <                           "%s[%s] went dead during handshake",
1443 >      sendto_realops_flags(UMODE_ALL, L_ADMIN, SEND_NOTICE,
1444 >                           "%s[%s] went dead during handshake",
1445                             client_p->name,
1446 <                           client_p->host);
1447 <      sendto_realops_flags(UMODE_ALL, L_OPER,
1448 <                           "%s went dead during handshake", client_p->name);
1446 >                           client_p->host);
1447 >      sendto_realops_flags(UMODE_ALL, L_OPER, SEND_NOTICE,
1448 >                           "%s went dead during handshake", client_p->name);
1449        return;
1450    }
1451  
# Line 1520 | Line 1465 | find_servconn_in_progress(const char *na
1465      cptr = ptr->data;
1466  
1467      if (cptr && cptr->name[0])
1468 <      if (match(name, cptr->name))
1468 >      if (!match(name, cptr->name))
1469          return cptr;
1470    }
1471    

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)