diff --git a/ircd/s_stats.c b/ircd/s_stats.c index 150e9a46..36b40b77 100644 --- a/ircd/s_stats.c +++ b/ircd/s_stats.c @@ -33,6 +33,7 @@ #include "ircd_crypt.h" #include "ircd_log.h" #include "ircd_reply.h" +#include "ircd_snprintf.h" #include "ircd_string.h" #include "listener.h" #include "list.h" @@ -460,12 +461,13 @@ stats_servers_verbose(struct Client* sptr, const struct StatDesc* sd, */ if (sd->sd_funcdata) { send_reply(sptr, SND_EXPLICIT | RPL_STATSVERBOSE, - "%-20s %-20s Flags Hops Numeric Lag RTT Up Down " - "Clients/Max Proto %-10s :Info", "Servername", "Uplink", - "LinkTS"); - fmt = "%-20s %-20s %c%c%c%c%c %4i %s %-4i %5i %4i %4i %4i %5i %5i P%-2i %Tu :%s"; + ":%-20s %-20s Flags Hops %-8s %5s %4s %4s %4s %5s %6s %-6s %-10s Info", + "Servername", "Uplink", "Numeric", "Lag", "RTT", "Up", "Down", + "Users", "Max", "Proto", "LinkTS"); + fmt = ":%-20s %-20s %c%c%c%c%c %4i %-8s %5i %4i %4i %4i %5i %6i P%-2i %10Tu %s"; } else { - fmt = "%s %s %c%c%c%c%c %i %s %i %i %i %i %i %i %i P%i %Tu :%s"; + /* Two fields for numeric: base64 token (NumServ) and integer form */ + fmt = "%s %s %c%c%c%c%c %i %s %u %i %i %i %i %i %i P%i %Tu :%s"; } for (acptr = GlobalClientList; acptr; acptr = cli_next(acptr)) @@ -475,26 +477,52 @@ stats_servers_verbose(struct Client* sptr, const struct StatDesc* sd, /* narrow search */ if (param && match(param, cli_name(acptr))) continue; - send_reply(sptr, SND_EXPLICIT | RPL_STATSVERBOSE, fmt, - cli_name(acptr), - cli_name(cli_serv(acptr)->up), - IsBurst(acptr) ? 'B' : '-', - IsBurstAck(acptr) ? 'A' : '-', - IsHub(acptr) ? 'H' : '-', - IsService(acptr) ? 'S' : '-', - IsIPv6(acptr) ? '6' : '-', - cli_hopcount(acptr), - NumServ(acptr), - base64toint(cli_yxx(acptr)), - cli_serv(acptr)->lag, - cli_serv(acptr)->asll_rtt, - cli_serv(acptr)->asll_to, - cli_serv(acptr)->asll_from, - (acptr == &me ? UserStats.local_clients : cli_serv(acptr)->clients), - cli_serv(acptr)->nn_mask, - cli_serv(acptr)->prot, - cli_serv(acptr)->timestamp, - cli_info(acptr)); + if (sd->sd_funcdata) { + char numbuf[32]; + + ircd_snprintf(sptr, numbuf, sizeof(numbuf), "%s(%u)", + NumServ(acptr), base64toint(cli_yxx(acptr))); + send_reply(sptr, SND_EXPLICIT | RPL_STATSVERBOSE, fmt, + cli_name(acptr), + cli_name(cli_serv(acptr)->up), + IsBurst(acptr) ? 'B' : '-', + IsBurstAck(acptr) ? 'A' : '-', + IsHub(acptr) ? 'H' : '-', + IsService(acptr) ? 'S' : '-', + IsIPv6(acptr) ? '6' : '-', + cli_hopcount(acptr), + numbuf, + cli_serv(acptr)->lag, + cli_serv(acptr)->asll_rtt, + cli_serv(acptr)->asll_to, + cli_serv(acptr)->asll_from, + (acptr == &me ? UserStats.local_clients : cli_serv(acptr)->clients), + cli_serv(acptr)->nn_mask, + cli_serv(acptr)->prot, + cli_serv(acptr)->timestamp, + cli_info(acptr)); + } else { + send_reply(sptr, SND_EXPLICIT | RPL_STATSVERBOSE, fmt, + cli_name(acptr), + cli_name(cli_serv(acptr)->up), + IsBurst(acptr) ? 'B' : '-', + IsBurstAck(acptr) ? 'A' : '-', + IsHub(acptr) ? 'H' : '-', + IsService(acptr) ? 'S' : '-', + IsIPv6(acptr) ? '6' : '-', + cli_hopcount(acptr), + NumServ(acptr), + base64toint(cli_yxx(acptr)), + cli_serv(acptr)->lag, + cli_serv(acptr)->asll_rtt, + cli_serv(acptr)->asll_to, + cli_serv(acptr)->asll_from, + (acptr == &me ? UserStats.local_clients : cli_serv(acptr)->clients), + cli_serv(acptr)->nn_mask, + cli_serv(acptr)->prot, + cli_serv(acptr)->timestamp, + cli_info(acptr)); + } } }