X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/45be325cd2a8fcedc7fe71adbe70208d0d16aec2..745237f166ea43fc90e52cd6783551cced063cdc:/modules/m_stats.c diff --git a/modules/m_stats.c b/modules/m_stats.c index 45b9b38..dbc7699 100644 --- a/modules/m_stats.c +++ b/modules/m_stats.c @@ -81,12 +81,12 @@ static void stats_p_spy(struct Client *); struct StatsStruct { char letter; - void (*handler) (); + void (*handler) (struct Client *source_p); int need_oper; int need_admin; }; -static void stats_dns_servers (struct Client *); +static void stats_dns_servers(struct Client *); static void stats_delay(struct Client *); static void stats_hash(struct Client *); static void stats_connect(struct Client *); @@ -101,6 +101,7 @@ static void stats_klines(struct Client *); static void stats_messages(struct Client *); static void stats_dnsbl(struct Client *); static void stats_oper(struct Client *); +static void stats_privset(struct Client *); static void stats_operedup(struct Client *); static void stats_ports(struct Client *); static void stats_tresv(struct Client *); @@ -142,13 +143,13 @@ static struct StatsStruct stats_cmd_table[] = { {'I', stats_auth, 0, 0, }, {'k', stats_tklines, 0, 0, }, {'K', stats_klines, 0, 0, }, - {'l', stats_ltrace, 0, 0, }, - {'L', stats_ltrace, 0, 0, }, + {'l', NULL /* special */, 0, 0, }, + {'L', NULL /* special */, 0, 0, }, {'m', stats_messages, 0, 0, }, {'M', stats_messages, 0, 0, }, {'n', stats_dnsbl, 0, 0, }, {'o', stats_oper, 0, 0, }, - {'O', stats_oper, 0, 0, }, + {'O', stats_privset, 1, 0, }, {'p', stats_operedup, 0, 0, }, {'P', stats_ports, 0, 0, }, {'q', stats_tresv, 1, 0, }, @@ -173,7 +174,6 @@ static struct StatsStruct stats_cmd_table[] = { /* * m_stats by fl_ - * parv[0] = sender prefix * parv[1] = stat letter/command * parv[2] = (if present) server/mask in stats L, or target * @@ -211,7 +211,7 @@ m_stats(struct Client *client_p, struct Client *source_p, int parc, const char * if((statchar != 'L') && (statchar != 'l')) stats_spy(source_p, statchar, NULL); - for (i = 0; stats_cmd_table[i].handler; i++) + for (i = 0; stats_cmd_table[i].letter; i++) { if(stats_cmd_table[i].letter == statchar) { @@ -234,7 +234,7 @@ m_stats(struct Client *client_p, struct Client *source_p, int parc, const char * /* Blah, stats L needs the parameters, none of the others do.. */ if(statchar == 'L' || statchar == 'l') - stats_cmd_table[i].handler (source_p, parc, parv); + stats_ltrace (source_p, parc, parv); else stats_cmd_table[i].handler (source_p); } @@ -318,11 +318,7 @@ stats_connect(struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSCLINE, form_str(RPL_STATSCLINE), -#ifndef HIDE_SERVERS_IPS - server_p->host, -#else "*@127.0.0.1", -#endif buf, server_p->name, server_p->port, server_p->class_name); } @@ -497,7 +493,7 @@ stats_auth (struct Client *source_p) else if((ConfigFileEntry.stats_i_oper_only == 1) && !IsOper (source_p)) { struct ConfItem *aconf; - char *name, *host, *pass, *user, *classname; + char *name, *host, *pass = "*", *user, *classname; int port; if(MyConnect (source_p)) @@ -505,18 +501,20 @@ stats_auth (struct Client *source_p) (struct sockaddr *)&source_p->localClient->ip, CONF_CLIENT, source_p->localClient->ip.ss_family, - source_p->username); + source_p->username, NULL); else aconf = find_conf_by_address (source_p->host, NULL, NULL, NULL, CONF_CLIENT, - 0, source_p->username); + 0, source_p->username, NULL); if(aconf == NULL) return; get_printable_conf (aconf, &name, &host, &pass, &user, &port, &classname); + if(!EmptyString(aconf->spasswd)) + pass = aconf->spasswd; sendto_one_numeric(source_p, RPL_STATSILINE, form_str(RPL_STATSILINE), - name, show_iline_prefix(source_p, aconf, user), + name, pass, show_iline_prefix(source_p, aconf, user), host, port, classname); } @@ -545,10 +543,10 @@ stats_tklines(struct Client *source_p) (struct sockaddr *)&source_p->localClient->ip, CONF_KILL, source_p->localClient->ip.ss_family, - source_p->username); + source_p->username, NULL); else aconf = find_conf_by_address (source_p->host, NULL, NULL, NULL, CONF_KILL, - 0, source_p->username); + 0, source_p->username, NULL); if(aconf == NULL) return; @@ -611,10 +609,10 @@ stats_klines(struct Client *source_p) (struct sockaddr *)&source_p->localClient->ip, CONF_KILL, source_p->localClient->ip.ss_family, - source_p->username); + source_p->username, NULL); else aconf = find_conf_by_address (source_p->host, NULL, NULL, NULL, CONF_KILL, - 0, source_p->username); + 0, source_p->username, NULL); if(aconf == NULL) return; @@ -676,10 +674,15 @@ stats_oper(struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSOLINE, form_str(RPL_STATSOLINE), oper_p->username, oper_p->host, oper_p->name, - IsOper(source_p) ? get_oper_privs(oper_p->flags) : "0", "-1"); + IsOper(source_p) ? oper_p->privset->name : "0", "-1"); } } +static void +stats_privset(struct Client *source_p) +{ + privilegeset_report(source_p); +} /* stats_operedup() * @@ -741,7 +744,7 @@ stats_tresv(struct Client *source_p) if(aconf->hold) sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'q', aconf->port, aconf->name, aconf->passwd); + 'q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK(i, R_MAX, ptr, resvTable) @@ -750,7 +753,7 @@ stats_tresv(struct Client *source_p) if(aconf->hold) sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'q', aconf->port, aconf->name, aconf->passwd); + 'q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK_END } @@ -769,7 +772,7 @@ stats_resv(struct Client *source_p) if(!aconf->hold) sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'Q', aconf->port, aconf->name, aconf->passwd); + 'Q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK(i, R_MAX, ptr, resvTable) @@ -778,7 +781,7 @@ stats_resv(struct Client *source_p) if(!aconf->hold) sendto_one_numeric(source_p, RPL_STATSQLINE, form_str(RPL_STATSQLINE), - 'Q', aconf->port, aconf->name, aconf->passwd); + 'Q', aconf->port, aconf->host, aconf->passwd); } HASH_WALK_END } @@ -854,7 +857,7 @@ stats_tstats (struct Client *source_p) sp.is_sbs += target_p->localClient->sendB; sp.is_sbr += target_p->localClient->receiveB; - sp.is_sti += rb_current_time() - target_p->localClient->firsttime; + sp.is_sti += (unsigned long long)(rb_current_time() - target_p->localClient->firsttime); sp.is_sv++; } @@ -864,7 +867,7 @@ stats_tstats (struct Client *source_p) sp.is_cbs += target_p->localClient->sendB; sp.is_cbr += target_p->localClient->receiveB; - sp.is_cti += rb_current_time() - target_p->localClient->firsttime; + sp.is_cti += (unsigned long long)(rb_current_time() - target_p->localClient->firsttime); sp.is_cl++; } @@ -877,7 +880,9 @@ stats_tstats (struct Client *source_p) "T :accepts %u refused %u", sp.is_ac, sp.is_ref); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :rejected %u delaying %lu", - sp.is_rej, rb_dlink_list_length(&delay_exit)); + sp.is_rej, delay_exit_length()); + sendto_one_numeric(source_p, RPL_STATSDEBUG, + "T :throttled refused %u throttle list size %lu", sp.is_thr, throttle_size()); sendto_one_numeric(source_p, RPL_STATSDEBUG, "T :nicks being delayed %lu", get_nd_count()); @@ -913,8 +918,8 @@ stats_tstats (struct Client *source_p) sp.is_cbr / 1024, sp.is_sbr / 1024); sendto_one_numeric(source_p, RPL_STATSDEBUG, - "T :time connected %lu %lu", - (long int)sp.is_cti, (long int)sp.is_sti); + "T :time connected %llu %llu", + sp.is_cti, sp.is_sti); } static void @@ -951,9 +956,9 @@ static struct shared_flags shared_flagtable[] = { SHARED_UNRESV, 'R' }, { SHARED_LOCOPS, 'L' }, { SHARED_REHASH, 'H' }, - { SHARED_TDLINE, 'd' }, - { SHARED_PDLINE, 'D' }, - { SHARED_UNDLINE, 'E' }, + { SHARED_TDLINE, 'd' }, + { SHARED_PDLINE, 'D' }, + { SHARED_UNDLINE, 'E' }, { 0, '\0'} }; @@ -963,7 +968,7 @@ stats_shared (struct Client *source_p) { struct remote_conf *shared_p; rb_dlink_node *ptr; - char buf[15]; + char buf[sizeof(shared_flagtable)/sizeof(shared_flagtable[0])]; char *p; int i; @@ -1076,7 +1081,7 @@ stats_tgecos(struct Client *source_p) if(aconf->hold) sendto_one_numeric(source_p, RPL_STATSXLINE, form_str(RPL_STATSXLINE), - 'x', aconf->port, aconf->name, + 'x', aconf->port, aconf->host, aconf->passwd); } } @@ -1094,7 +1099,7 @@ stats_gecos(struct Client *source_p) if(!aconf->hold) sendto_one_numeric(source_p, RPL_STATSXLINE, form_str(RPL_STATSXLINE), - 'X', aconf->port, aconf->name, + 'X', aconf->port, aconf->host, aconf->passwd); } } @@ -1394,7 +1399,7 @@ stats_servlinks (struct Client *source_p) sendto_one(source_p, Sformat, get_id(&me, source_p), RPL_STATSLINKINFO, get_id(source_p, source_p), - get_server_name(target_p, SHOW_IP), + target_p->name, (int) rb_linebuf_len (&target_p->localClient->buf_sendq), (int) target_p->localClient->sendM, (int) target_p->localClient->sendK, @@ -1548,7 +1553,7 @@ stats_l_client(struct Client *source_p, struct Client *target_p, if(IsAnyServer(target_p)) { sendto_one_numeric(source_p, RPL_STATSLINKINFO, Lformat, - get_server_name(target_p, SHOW_IP), + target_p->name, (int) rb_linebuf_len(&target_p->localClient->buf_sendq), (int) target_p->localClient->sendM, (int) target_p->localClient->sendK,