Add support to show user links using "STATS L"

Change "stats L" to show servers and user links and restrict it to
IRC Operators.
This commit is contained in:
Federico G. Schwindt 2013-09-18 23:51:44 +01:00 committed by Alexander Barton
parent 13a5358a3d
commit ec5ab4fcd1
2 changed files with 16 additions and 6 deletions

View File

@ -451,17 +451,21 @@ Status and Informational Commands
Show statistics and other information of type <query> of a particular
IRC server in the network.
.
The following <query> types are supported (case-insensitive):
The following <query> types are supported (case-insensitive where
applicable):
.
- g Network-wide bans ("G-Lines").
- k Server-local bans ("K-Lines").
- l Link status (parent server and own link only).
- L Link status (servers and user links).
- l Link status (servers and own link).
- m Command usage count.
- u Server uptime.
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
The server of the current connection is used when <target> is omitted.
.
To use "STATS L" the user must be an IRC Operator.
References:
- RFC 2812, 3.4.4 "Stats message"

View File

@ -41,6 +41,7 @@
#include "irc-macros.h"
#include "irc-write.h"
#include "client-cap.h"
#include "op.h"
#include "exp.h"
#include "irc-info.h"
@ -865,6 +866,7 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
unsigned int days, hrs, mins;
struct list_head *list;
struct list_elem *list_item;
bool more_links = false;
assert(Client != NULL);
assert(Req != NULL);
@ -909,16 +911,20 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
list_item = Lists_GetNext(list_item);
}
break;
case 'L': /* Link status (servers and user links) */
if (!Op_Check(from, Req))
return Op_NoPrivileges(from, Req);
more_links = true;
case 'l': /* Link status (servers and own link) */
case 'L':
time_now = time(NULL);
for (con = Conn_First(); con != NONE; con = Conn_Next(con)) {
cl = Conn_GetClient(con);
if (!cl)
continue;
if ((Client_Type(cl) == CLIENT_SERVER)
|| (cl == Client)) {
/* Server link or our own connection */
if (Client_Type(cl) == CLIENT_SERVER ||
cl == Client ||
(more_links && Client_Type(cl) == CLIENT_USER)) {
#ifdef ZLIB
if (Conn_Options(con) & CONN_ZIP) {
if (!IRC_WriteStrClient