1384 |
sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "STATS"); |
sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "STATS"); |
1385 |
} |
} |
1386 |
|
|
1387 |
static const struct StatsStruct |
struct StatsStruct |
1388 |
{ |
{ |
1389 |
const unsigned char letter; |
const unsigned char letter; |
1390 |
void (*handler)(struct Client *, int, char *[]); |
void (*handler)(struct Client *, int, char *[]); |
1391 |
const unsigned int need_oper; |
const unsigned int required_modes; |
1392 |
const unsigned int need_admin; |
}; |
1393 |
} stats_cmd_table[] = { |
|
1394 |
/* letter function need_oper need_admin */ |
static const struct StatsStruct *stats_map[256]; |
1395 |
{ 'a', stats_dns_servers, 1, 1 }, |
static const struct StatsStruct stats_tab[] = |
1396 |
{ 'A', stats_dns_servers, 1, 1 }, |
{ |
1397 |
{ 'c', stats_connect, 1, 0 }, |
{ 'a', stats_dns_servers, UMODE_ADMIN }, |
1398 |
{ 'C', stats_connect, 1, 0 }, |
{ 'A', stats_dns_servers, UMODE_ADMIN }, |
1399 |
{ 'd', stats_tdeny, 1, 0 }, |
{ 'c', stats_connect, UMODE_OPER }, |
1400 |
{ 'D', stats_deny, 1, 0 }, |
{ 'C', stats_connect, UMODE_OPER }, |
1401 |
{ 'e', stats_exempt, 1, 0 }, |
{ 'd', stats_tdeny, UMODE_OPER }, |
1402 |
{ 'E', stats_events, 1, 1 }, |
{ 'D', stats_deny, UMODE_OPER }, |
1403 |
{ 'f', fd_dump, 1, 1 }, |
{ 'e', stats_exempt, UMODE_OPER }, |
1404 |
{ 'F', fd_dump, 1, 1 }, |
{ 'E', stats_events, UMODE_ADMIN }, |
1405 |
{ 'h', stats_hubleaf, 1, 1 }, |
{ 'f', fd_dump, UMODE_ADMIN }, |
1406 |
{ 'H', stats_hubleaf, 1, 0 }, |
{ 'F', fd_dump, UMODE_ADMIN }, |
1407 |
{ 'i', stats_auth, 0, 0 }, |
{ 'h', stats_hubleaf, UMODE_OPER }, |
1408 |
{ 'I', stats_auth, 0, 0 }, |
{ 'H', stats_hubleaf, UMODE_OPER }, |
1409 |
{ 'k', stats_tklines, 0, 0 }, |
{ 'i', stats_auth, 0 }, |
1410 |
{ 'K', stats_klines, 0, 0 }, |
{ 'I', stats_auth, 0 }, |
1411 |
{ 'l', stats_ltrace, 1, 0 }, |
{ 'k', stats_tklines, 0 }, |
1412 |
{ 'L', stats_ltrace, 1, 0 }, |
{ 'K', stats_klines, 0 }, |
1413 |
{ 'm', stats_messages, 0, 0 }, |
{ 'l', stats_ltrace, UMODE_OPER }, |
1414 |
{ 'M', stats_messages, 0, 0 }, |
{ 'L', stats_ltrace, UMODE_OPER }, |
1415 |
{ 'o', stats_oper, 0, 0 }, |
{ 'm', stats_messages, 0 }, |
1416 |
{ 'O', stats_oper, 0, 0 }, |
{ 'M', stats_messages, 0 }, |
1417 |
{ 'p', stats_operedup, 0, 0 }, |
{ 'o', stats_oper, 0 }, |
1418 |
{ 'P', stats_ports, 0, 0 }, |
{ 'O', stats_oper, 0 }, |
1419 |
{ 'q', stats_resv, 1, 0 }, |
{ 'p', stats_operedup, 0 }, |
1420 |
{ 'Q', stats_resv, 1, 0 }, |
{ 'P', stats_ports, 0 }, |
1421 |
{ 'r', stats_usage, 1, 0 }, |
{ 'q', stats_resv, UMODE_OPER }, |
1422 |
{ 'R', stats_usage, 1, 0 }, |
{ 'Q', stats_resv, UMODE_OPER }, |
1423 |
{ 's', stats_service, 1, 0 }, |
{ 'r', stats_usage, UMODE_OPER }, |
1424 |
{ 'S', stats_service, 1, 0 }, |
{ 'R', stats_usage, UMODE_OPER }, |
1425 |
{ 't', stats_tstats, 1, 0 }, |
{ 's', stats_service, UMODE_OPER }, |
1426 |
{ 'T', motd_report, 1, 0 }, |
{ 'S', stats_service, UMODE_OPER }, |
1427 |
{ 'u', stats_uptime, 0, 0 }, |
{ 't', stats_tstats, UMODE_OPER }, |
1428 |
{ 'U', stats_shared, 1, 0 }, |
{ 'T', motd_report, UMODE_OPER }, |
1429 |
{ 'v', stats_servers, 1, 0 }, |
{ 'u', stats_uptime, 0 }, |
1430 |
{ 'x', stats_gecos, 1, 0 }, |
{ 'U', stats_shared, UMODE_OPER }, |
1431 |
{ 'X', stats_gecos, 1, 0 }, |
{ 'v', stats_servers, UMODE_OPER }, |
1432 |
{ 'y', stats_class, 1, 0 }, |
{ 'x', stats_gecos, UMODE_OPER }, |
1433 |
{ 'Y', stats_class, 1, 0 }, |
{ 'X', stats_gecos, UMODE_OPER }, |
1434 |
{ 'z', stats_memory, 1, 0 }, |
{ 'y', stats_class, UMODE_OPER }, |
1435 |
{ '?', stats_servlinks, 0, 0 }, |
{ 'Y', stats_class, UMODE_OPER }, |
1436 |
{ '\0', NULL, 0, 0 } |
{ 'z', stats_memory, UMODE_OPER }, |
1437 |
|
{ '?', stats_servlinks, 0 }, |
1438 |
|
{ '\0', NULL, 0 } |
1439 |
}; |
}; |
1440 |
|
|
1441 |
static void |
static void |
1442 |
do_stats(struct Client *source_p, int parc, char *parv[]) |
do_stats(struct Client *source_p, int parc, char *parv[]) |
1443 |
{ |
{ |
1444 |
const char statchar = *parv[1]; |
const unsigned char statchar = *parv[1]; |
1445 |
|
const struct StatsStruct *tab; |
1446 |
|
|
1447 |
if (statchar == '\0') |
if (statchar == '\0') |
1448 |
{ |
{ |
1450 |
return; |
return; |
1451 |
} |
} |
1452 |
|
|
1453 |
for (const struct StatsStruct *tab = stats_cmd_table; tab->handler; ++tab) |
if ((tab = stats_map[statchar])) |
1454 |
{ |
{ |
1455 |
if (tab->letter == statchar) |
if (!tab->required_modes || HasUMode(source_p, tab->required_modes)) |
|
{ |
|
|
/* The stats table says what privs are needed, so check --fl_ */ |
|
|
if ((tab->need_admin && !HasUMode(source_p, UMODE_ADMIN)) || |
|
|
(tab->need_oper && !HasUMode(source_p, UMODE_OPER))) |
|
|
{ |
|
|
sendto_one_numeric(source_p, &me, ERR_NOPRIVILEGES); |
|
|
break; |
|
|
} |
|
|
|
|
|
sendto_realops_flags(UMODE_SPY, L_ALL, SEND_NOTICE, |
|
|
"STATS %c requested by %s (%s@%s) [%s]", |
|
|
statchar, source_p->name, source_p->username, |
|
|
source_p->host, source_p->servptr->name); |
|
1456 |
tab->handler(source_p, parc, parv); |
tab->handler(source_p, parc, parv); |
1457 |
break; |
else |
1458 |
} |
sendto_one_numeric(source_p, &me, ERR_NOPRIVILEGES); |
1459 |
|
|
1460 |
|
sendto_realops_flags(UMODE_SPY, L_ALL, SEND_NOTICE, |
1461 |
|
"STATS %c requested by %s (%s@%s) [%s]", |
1462 |
|
statchar, source_p->name, source_p->username, |
1463 |
|
source_p->host, source_p->servptr->name); |
1464 |
} |
} |
1465 |
|
|
1466 |
sendto_one_numeric(source_p, &me, RPL_ENDOFSTATS, statchar); |
sendto_one_numeric(source_p, &me, RPL_ENDOFSTATS, statchar); |
1511 |
return 0; |
return 0; |
1512 |
} |
} |
1513 |
|
|
1514 |
|
static void |
1515 |
|
stats_init(void) |
1516 |
|
{ |
1517 |
|
for (const struct StatsStruct *tab = stats_tab; tab->letter; ++tab) |
1518 |
|
stats_map[tab->letter] = tab; |
1519 |
|
} |
1520 |
|
|
1521 |
static struct Message stats_msgtab = |
static struct Message stats_msgtab = |
1522 |
{ |
{ |
1523 |
.cmd = "STATS", |
.cmd = "STATS", |
1533 |
static void |
static void |
1534 |
module_init(void) |
module_init(void) |
1535 |
{ |
{ |
1536 |
|
stats_init(); |
1537 |
mod_add_cmd(&stats_msgtab); |
mod_add_cmd(&stats_msgtab); |
1538 |
} |
} |
1539 |
|
|