/[svn]/ircd-hybrid/trunk/modules/m_stats.c
ViewVC logotype

Diff of /ircd-hybrid/trunk/modules/m_stats.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6551 by michael, Sun Sep 6 11:17:15 2015 UTC revision 6552 by michael, Mon Sep 28 17:54:14 2015 UTC
# Line 1384  stats_ltrace(struct Client *source_p, in Line 1384  stats_ltrace(struct Client *source_p, in
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    {    {
# Line 1447  do_stats(struct Client *source_p, int pa Line 1450  do_stats(struct Client *source_p, int pa
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);
# Line 1516  ms_stats(struct Client *source_p, int pa Line 1511  ms_stats(struct Client *source_p, int pa
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",
# Line 1531  static struct Message stats_msgtab = Line 1533  static struct Message stats_msgtab =
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    

Legend:
Removed from v.6551  
changed lines
  Added in v.6552

svnadmin@ircd-hybrid.org
ViewVC Help
Powered by ViewVC 1.1.28