[NeoStats-Devel] [Commits] r2754 - in trunk: include modules/statserv src
[email protected] Sat, 20 Aug 2005 08:59:15 +1000
| Newsgroups | gmane.comp.neostats.devel |
|---|---|
| Message-ID | <[email protected]> |
Author: Mark
Date: Sat Aug 20 06:59:11 2005
New Revision: 2754
Modified:
trunk/include/neostats.h
trunk/modules/statserv/channel.c
trunk/modules/statserv/channel.h
trunk/modules/statserv/htmlstats.c
trunk/modules/statserv/htmlstats.h
trunk/modules/statserv/network.c
trunk/modules/statserv/server.c
trunk/modules/statserv/stats.c
trunk/modules/statserv/stats.h
trunk/modules/statserv/statserv.c
trunk/modules/statserv/tld.c
trunk/modules/statserv/user.c
trunk/modules/statserv/version.c
trunk/src/nsdba.c
Log:
StatServ: more comments and tidy ups
Modified: trunk/include/neostats.h
==============================================================================
--- trunk/include/neostats.h (original)
+++ trunk/include/neostats.h Sat Aug 20 06:59:11 2005
@@ -1381,9 +1381,9 @@
EXPORTFUNC int DBACloseDatabase( void );
EXPORTFUNC int DBAOpenTable( const char *table );
EXPORTFUNC int DBACloseTable( const char *table );
-EXPORTFUNC int DBAStore( const char *table, char *key, void *data, int size );
-EXPORTFUNC int DBAFetch( const char *table, char *key, void *data, int size );
-EXPORTFUNC int DBADelete( const char *table, char * key );
+EXPORTFUNC int DBAStore( const char *table, const char *key, void *data, int size );
+EXPORTFUNC int DBAFetch( const char *table, const char *key, void *data, int size );
+EXPORTFUNC int DBADelete( const char *table, const char * key );
EXPORTFUNC int DBAFetchRows( const char *table, DBRowHandler handler );
/* DB API Macros to wrap common types */
#define DBAStoreBool( table, key, data ) DBAStore( table, key, ( void* )data, sizeof ( int ) )
Modified: trunk/modules/statserv/channel.c
==============================================================================
--- trunk/modules/statserv/channel.c (original)
+++ trunk/modules/statserv/channel.c Sat Aug 20 06:59:11 2005
@@ -27,10 +27,29 @@
#include "network.h"
#include "channel.h"
+/** Channel table name */
#define CHANNEL_TABLE "Channel"
+/** Channel list */
static list_t *channelstatlist;
+/** @brief AverageChannelStatistic
+ *
+ * Average channel statistic
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+static void AverageChannelStatistic( channelstat *cs, const void *v )
+{
+ AverageStatistic( &cs->users );
+ AverageStatistic( &cs->kicks );
+ AverageStatistic( &cs->topics );
+ AverageStatistic( &cs->joins );
+}
+
/** @brief AverageChannelStatistics
*
* Average channel statistics
@@ -42,18 +61,24 @@
void AverageChannelStatistics( void )
{
- lnode_t *cn;
- channelstat *cs;
+ GetChannelStats( AverageChannelStatistic, CHANNEL_SORT_NONE, -1, 0, NULL );
+}
- cn = list_first( channelstatlist );
- while( cn ) {
- cs = lnode_get( cn );
- AverageStatistic( &cs->users );
- AverageStatistic( &cs->kicks );
- AverageStatistic( &cs->topics );
- AverageStatistic( &cs->joins );
- cn = list_next( channelstatlist, cn );
- }
+/** @brief ResetChannelStatistic
+ *
+ * Reset channel statistic
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void ResetChannelStatistic( channelstat *cs, const void *v )
+{
+ ResetStatistic( &cs->users );
+ ResetStatistic( &cs->kicks );
+ ResetStatistic( &cs->topics );
+ ResetStatistic( &cs->joins );
}
/** @brief ResetChannelStatistics
@@ -67,31 +92,38 @@
void ResetChannelStatistics( void )
{
- lnode_t *cn;
- channelstat *cs;
-
- cn = list_first( channelstatlist );
- while( cn ) {
- cs = lnode_get( cn );
- ResetStatistic( &cs->users );
- ResetStatistic( &cs->kicks );
- ResetStatistic( &cs->topics );
- ResetStatistic( &cs->joins );
- cn = list_next( channelstatlist, cn );
- }
+ GetChannelStats( ResetChannelStatistic, CHANNEL_SORT_NONE, -1, 0, NULL );
}
-static channelstat *findchanstats( char *name )
+/** @brief findchanstats
+ *
+ * Check list for channel
+ *
+ * @param name of channel ctcp version to search for
+ *
+ * @return pointer to stat found or NULL if none
+ */
+
+static channelstat *findchanstats( const char *name )
{
channelstat *cs;
cs = lnode_find( channelstatlist, name, comparef );
- if( !cs ) {
+ if( !cs )
dlog( DEBUG2, "findchanstats: %s not found", name );
- }
return cs;
}
+/** @brief topcurrentchannel
+ *
+ * list sorting helper
+ *
+ * @param key1
+ * @param key2
+ *
+ * @return results of comparison
+ */
+
int topcurrentchannel( const void *key1, const void *key2 )
{
const channelstat *chan1 = key1;
@@ -99,6 +131,16 @@
return( chan2->c->users - chan1->c->users );
}
+/** @brief topjoinrunningtotalchannel
+ *
+ * list sorting helper
+ *
+ * @param key1
+ * @param key2
+ *
+ * @return results of comparison
+ */
+
int topjoinrunningtotalchannel( const void *key1, const void *key2 )
{
const channelstat *chan1 = key1;
@@ -106,6 +148,16 @@
return( chan2->users.alltime.runningtotal - chan1->users.alltime.runningtotal );
}
+/** @brief topkickrunningtotalchannel
+ *
+ * list sorting helper
+ *
+ * @param key1
+ * @param key2
+ *
+ * @return results of comparison
+ */
+
int topkickrunningtotalchannel( const void *key1, const void *key2 )
{
const channelstat *chan1 = key1;
@@ -113,6 +165,16 @@
return( chan2->kicks.alltime.runningtotal - chan1->kicks.alltime.runningtotal );
}
+/** @brief toptopicrunningtotalchannel
+ *
+ * list sorting helper
+ *
+ * @param key1
+ * @param key2
+ *
+ * @return results of comparison
+ */
+
int toptopicrunningtotalchannel( const void *key1, const void *key2 )
{
const channelstat *chan1 = key1;
@@ -120,35 +182,41 @@
return( chan2->topics.alltime.runningtotal - chan1->topics.alltime.runningtotal );
}
-/* @brief load the info for a specific channel from the database
- * or return null a blank if it does not exist.
- *
- * @params name the channel name to load
- *
- * @returns a channelstat struct that contains info for the channel. If its a new Channel, contains the name and thats it.
+/** @brief LoadChannel
+ *
+ * Load channel stats
+ *
+ * @param name of channel to load
+ *
+ * @return pointer to stat
*/
-
+
static channelstat *LoadChannel( char *name )
{
channelstat *cs;
SET_SEGV_LOCATION();
- if( list_isfull( channelstatlist ) ) {
+ if( list_isfull( channelstatlist ) )
+ {
nlog( LOG_CRITICAL, "StatServ channel hash full" );
return NULL;
}
cs = ns_calloc( sizeof( channelstat ) );
- if( DBAFetch( CHANNEL_TABLE, name, cs, sizeof( channelstat ) ) == NS_SUCCESS ) {
+ if( DBAFetch( CHANNEL_TABLE, name, cs, sizeof( channelstat ) ) == NS_SUCCESS )
+ {
dlog( DEBUG2, "Loading channel %s", cs->name );
PostLoadStatistic( &cs->joins );
PostLoadStatistic( &cs->kicks );
PostLoadStatistic( &cs->topics );
PostLoadStatistic( &cs->users );
- if( ( me.now - cs->ts_lastseen ) > StatServ.channeltime ) {
+ if( ( me.now - cs->ts_lastseen ) > StatServ.channeltime )
+ {
dlog( DEBUG1, "Reset old channel %s", cs->name );
cs->ts_lastseen = me.now;
}
- } else {
+ }
+ else
+ {
dlog( DEBUG2, "Creating channel %s", cs->name );
strlcpy( cs->name, name, MAXCHANLEN );
}
@@ -157,14 +225,15 @@
return cs;
}
-/* @brief save the info for a specific channel to the database
- *
- *
- * @params cs the channelstat struct to save
- *
- * @returns nothing
+/** @brief SaveChannel
+ *
+ * Save channel stats
+ *
+ * @param cs channel to save
+ *
+ * @return pointer to stat
*/
-
+
static void SaveChannel( channelstat *cs )
{
PreSaveStatistic( &cs->joins );
@@ -175,6 +244,16 @@
cs->lastsave = me.now;
}
+/** @brief AddChannel
+ *
+ * Add channel
+ *
+ * @param c pointer to channel
+ * @param v not used
+ *
+ * @return none
+ */
+
static int AddChannel( Channel* c, void *v )
{
channelstat *cs;
@@ -186,12 +265,30 @@
return NS_FALSE;
}
+/** @brief ss_event_newchan
+ *
+ * NEWCHAN event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_event_newchan( const CmdParams *cmdparams )
{
AddChannel( cmdparams->channel, NULL );
return NS_SUCCESS;
}
+/** @brief ss_event_delchan
+ *
+ * DELCHAN event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_event_delchan( const CmdParams *cmdparams )
{
channelstat *cs;
@@ -200,7 +297,8 @@
ClearChannelModValue( cmdparams->channel );
DelNetworkChannel();
ln = list_find( channelstatlist, cmdparams->channel->name, comparef );
- if( !ln ) {
+ if( !ln )
+ {
nlog( LOG_WARNING, "Couldn't find channel %s when deleting from stats", cmdparams->channel->name );
return NS_SUCCESS;
}
@@ -212,6 +310,15 @@
return NS_SUCCESS;
}
+/** @brief ss_event_join
+ *
+ * JOIN event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_event_join( const CmdParams *cmdparams )
{
channelstat *cs;
@@ -227,6 +334,15 @@
return NS_SUCCESS;
}
+/** @brief ss_event_part
+ *
+ * PART event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_event_part( const CmdParams *cmdparams )
{
channelstat *cs;
@@ -242,6 +358,15 @@
return NS_SUCCESS;
}
+/** @brief ss_event_kick
+ *
+ * KICK event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_event_topic( const CmdParams *cmdparams )
{
channelstat *cs;
@@ -256,6 +381,15 @@
return NS_SUCCESS;
}
+/** @brief ss_event_kick
+ *
+ * KICK event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_event_kick( const CmdParams *cmdparams )
{
channelstat *cs;
@@ -271,6 +405,16 @@
return NS_SUCCESS;
}
+/** @brief top10membershandler
+ *
+ * Report topics
+ *
+ * @param cs pointer to channel stat
+ * @param v pointer to client to send to
+ *
+ * @return none
+ */
+
static void top10membershandler( const channelstat *cs, const void *v )
{
CmdParams *cmdparams = ( CmdParams * ) v;
@@ -279,6 +423,16 @@
cs->name, cs->c->users );
}
+/** @brief top10joinshandler
+ *
+ * Report topics
+ *
+ * @param cs pointer to channel stat
+ * @param v pointer to client to send to
+ *
+ * @return none
+ */
+
static void top10joinshandler( const channelstat *cs, const void *v )
{
CmdParams *cmdparams = ( CmdParams * ) v;
@@ -287,6 +441,16 @@
cs->name, cs->users.alltime.runningtotal );
}
+/** @brief top10kickshandler
+ *
+ * Report topics
+ *
+ * @param cs pointer to channel stat
+ * @param v pointer to client to send to
+ *
+ * @return none
+ */
+
static void top10kickshandler( const channelstat *cs, const void *v )
{
CmdParams *cmdparams = ( CmdParams * ) v;
@@ -295,6 +459,16 @@
cs->name, cs->kicks.alltime.runningtotal );
}
+/** @brief top10topicshandler
+ *
+ * Report topics
+ *
+ * @param cs pointer to channel stat
+ * @param v pointer to client to send to
+ *
+ * @return none
+ */
+
static void top10topicshandler( const channelstat *cs, const void *v )
{
CmdParams *cmdparams = ( CmdParams * ) v;
@@ -303,33 +477,54 @@
cs->name, cs->topics.alltime.runningtotal );
}
+/** @brief ss_cmd_channel
+ *
+ * CHANNEL command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ * cmdparams->av[0] = optionally POP, KICKS, TOPICS, channel name
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
int ss_cmd_channel( const CmdParams *cmdparams )
{
channelstat *cs;
- if( cmdparams->ac == 0 ) {
+ if( cmdparams->ac == 0 )
+ {
irc_prefmsg( ss_bot, cmdparams->source, "Top 10 Online Channels:" );
irc_prefmsg( ss_bot, cmdparams->source, "=======================" );
GetChannelStats( top10membershandler, CHANNEL_SORT_MEMBERS, 10, ( UserLevel( cmdparams->source ) < NS_ULEVEL_OPER ), ( void * )cmdparams );
irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
- } else if( !ircstrcasecmp( cmdparams->av[0], "POP" ) ) {
+ }
+ else if( !ircstrcasecmp( cmdparams->av[0], "POP" ) )
+ {
irc_prefmsg( ss_bot, cmdparams->source, "Top 10 Join Channels (Ever):" );
irc_prefmsg( ss_bot, cmdparams->source, "============================" );
GetChannelStats( top10joinshandler, CHANNEL_SORT_JOINS, 10, ( UserLevel( cmdparams->source ) < NS_ULEVEL_OPER ), ( void * )cmdparams );
irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
- } else if( !ircstrcasecmp( cmdparams->av[0], "KICKS" ) ) {
+ }
+ else if( !ircstrcasecmp( cmdparams->av[0], "KICKS" ) )
+ {
irc_prefmsg( ss_bot,cmdparams->source, "Top 10 Kick Channels (Ever):" );
irc_prefmsg( ss_bot,cmdparams->source, "============================" );
GetChannelStats( top10kickshandler, CHANNEL_SORT_KICKS, 10, ( UserLevel( cmdparams->source ) < NS_ULEVEL_OPER ), ( void * )cmdparams );
irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
- } else if( !ircstrcasecmp( cmdparams->av[0], "TOPICS" ) ) {
+ }
+ else if( !ircstrcasecmp( cmdparams->av[0], "TOPICS" ) )
+ {
irc_prefmsg( ss_bot, cmdparams->source, "Top 10 Topic Channels (Ever):" );
irc_prefmsg( ss_bot, cmdparams->source, "=============================" );
GetChannelStats( top10topicshandler, CHANNEL_SORT_TOPICS, 10, ( UserLevel( cmdparams->source ) < NS_ULEVEL_OPER ), ( void * )cmdparams );
irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
- } else {
+ }
+ else
+ {
cs = findchanstats( cmdparams->av[0] );
- if( !cs ) {
+ if( !cs )
+ {
irc_prefmsg( ss_bot,cmdparams->source,
"No statistics for %s", cmdparams->av[0] );
return NS_SUCCESS;
@@ -356,6 +551,15 @@
return NS_SUCCESS;
}
+/** @brief SaveChanStats
+ *
+ * Save channel stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
void SaveChanStats( void )
{
channelstat *cs;
@@ -366,15 +570,17 @@
/* we want to only do 25% each progressive save */
limit = ( list_count( channelstatlist ) /4 );
cn = list_first( channelstatlist );
- while( cn ) {
+ while( cn )
+ {
cs = lnode_get( cn );
/* we are not shutting down, so do progressive save if we have more than 100 channels */
- if( StatServ.shutdown == 0 && ( limit > 25 ) ) {
- if( count > limit ) {
+ if( StatServ.shutdown == 0 && ( limit > 25 ) )
+ {
+ if( count > limit )
break;
- }
/* calc is we save the entire database in the savedb interval plus 1/2 */
- if( ( me.now - cs->lastsave ) < PROGCHANTIME ) {
+ if( ( me.now - cs->lastsave ) < PROGCHANTIME )
+ {
cn = list_next( channelstatlist, cn );
continue;
}
@@ -385,12 +591,13 @@
}
}
-/* @brief run through database deleting old channels
- *
- *
- * @params nothing
- *
- * @returns nothing
+/** @brief del_chan
+ *
+ * Delete old channel stats table row handler
+ *
+ * @param none
+ *
+ * @return NS_TRUE if deleted else NS_FALSE
*/
static int del_chan( void *data, int size )
@@ -398,7 +605,8 @@
channelstat *cs;
cs = ( channelstat * )data;
- if( ( ( me.now - cs->ts_lastseen ) > StatServ.channeltime ) && ( !cs->c ) ) {
+ if( ( ( me.now - cs->ts_lastseen ) > StatServ.channeltime ) && ( !cs->c ) )
+ {
dlog( DEBUG1, "Deleting Channel %s", cs->name );
DBADelete( CHANNEL_TABLE, cs->name );
/* Delete only one channel per loop */
@@ -407,53 +615,47 @@
return NS_FALSE;
}
-int DelOldChan( void *userptr )
+/** @brief DelOldChanTimer
+ *
+ * Delete old channel stats timer handler
+ *
+ * @param none
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+int DelOldChanTimer( void *userptr )
{
time_t start;
start = time( NULL );
dlog( DEBUG1, "Deleting old channels" );
DBAFetchRows( CHANNEL_TABLE, del_chan );
- dlog( DEBUG1, "DelOldChan: %d seconds", ( int )( time( NULL ) - start ) );
- return NS_SUCCESS;
-}
-
-int InitChannelStats( void )
-{
- channelstatlist = list_create( -1 );
- if( !channelstatlist )
- {
- nlog( LOG_CRITICAL, "Unable to create channel stat list" );
- return NS_FAILURE;
- }
- GetChannelList( AddChannel, NULL );
+ dlog( DEBUG1, "DelOldChanTimer: %d seconds", ( int )( time( NULL ) - start ) );
return NS_SUCCESS;
}
-void FiniChannelStats( void )
-{
- lnode_t *ln;
- channelstat *cs;
-
- SaveChanStats();
- ln = list_first( channelstatlist );
- while( ln ) {
- cs = ( channelstat * )lnode_get( ln );
- ClearChannelModValue( cs->c );
- ns_free( cs );
- ln = list_next( channelstatlist, ln );
- }
- list_destroy_nodes( channelstatlist );
- list_destroy( channelstatlist );
-}
+/** @brief GetChannelStats
+ *
+ * Walk through list passing each channel to handler
+ *
+ * @param handler pointer to handler function
+ * @param sortstyle
+ * @param maxcount
+ * @param ignorehidden
+ * @param v pointer to client to send to
+ *
+ * @return none
+ */
void GetChannelStats( const ChannelStatHandler handler, CHANNEL_SORT sortstyle, int maxcount, int ignorehidden, void *v )
{
- int i = 0;
+ int count = 0;
lnode_t *ln;
channelstat *cs;
- switch( sortstyle ) {
+ switch( sortstyle )
+ {
case CHANNEL_SORT_MEMBERS:
if( !list_is_sorted( channelstatlist, topcurrentchannel ) )
list_sort( channelstatlist, topcurrentchannel );
@@ -475,15 +677,64 @@
}
ln = list_first( channelstatlist );
- while( ln ) {
+ while( ln )
+ {
cs = ( channelstat * )lnode_get( ln );
- if( i >= maxcount )
+ if( maxcount != -1 && count >= maxcount )
break;
if( !ignorehidden || !is_hidden_chan( cs->c ) )
{
- i++;
+ count++;
handler( cs, v );
}
ln = list_next( channelstatlist, ln );
}
}
+
+/** @brief InitChannelStats
+ *
+ * Init channel stats
+ *
+ * @param none
+ *
+ * @return NS_SUCCESS on success, NS_FAILURE on failure
+ */
+
+int InitChannelStats( void )
+{
+ channelstatlist = list_create( -1 );
+ if( !channelstatlist )
+ {
+ nlog( LOG_CRITICAL, "Unable to create channel stat list" );
+ return NS_FAILURE;
+ }
+ GetChannelList( AddChannel, NULL );
+ return NS_SUCCESS;
+}
+
+/** @brief FiniChannelStats
+ *
+ * Fini channel stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void FiniChannelStats( void )
+{
+ lnode_t *ln;
+ channelstat *cs;
+
+ SaveChanStats();
+ ln = list_first( channelstatlist );
+ while( ln )
+ {
+ cs = ( channelstat * )lnode_get( ln );
+ ClearChannelModValue( cs->c );
+ ns_free( cs );
+ ln = list_next( channelstatlist, ln );
+ }
+ list_destroy_nodes( channelstatlist );
+ list_destroy( channelstatlist );
+}
Modified: trunk/modules/statserv/channel.h
==============================================================================
--- trunk/modules/statserv/channel.h (original)
+++ trunk/modules/statserv/channel.h Sat Aug 20 06:59:11 2005
@@ -46,7 +46,7 @@
statistic joins;
}channelstat;
-typedef void (*ChannelStatHandler)( const channelstat *cs, const void *v );
+typedef void (*ChannelStatHandler)( channelstat *cs, const void *v );
void GetChannelStats( const ChannelStatHandler handler, CHANNEL_SORT sortstyle, int maxcount, int ignorehidden, const void *v );
int topcurrentchannel( const void *key1, const void *key2 );
@@ -60,7 +60,7 @@
int ss_event_topic( const CmdParams *cmdparams );
int ss_event_kick( const CmdParams *cmdparams );
int ss_cmd_channel( const CmdParams *cmdparams );
-int DelOldChan( void *v );
+int DelOldChanTimer( void *v );
int InitChannelStats( void );
void FiniChannelStats( void );
void SaveChanStats( void );
Modified: trunk/modules/statserv/htmlstats.c
==============================================================================
--- trunk/modules/statserv/htmlstats.c (original)
+++ trunk/modules/statserv/htmlstats.c Sat Aug 20 06:59:11 2005
@@ -35,13 +35,16 @@
#include <fcntl.h>
#endif /* HAVE_FCNTL_H */
+/** HTML output handler type */
typedef void( *htmlhandler )( void );
+/** HTML handler table struct */
typedef struct htmlfunc {
char* directive;
htmlhandler handler;
}htmlfunc;
+/** HTML handler prototypes */
static void html_map( void );
static void html_srvlist( void );
static void html_srvlistdet( void );
@@ -58,9 +61,12 @@
static void html_title( void );
static void html_clientstats( void );
+/** Output file pointer */
static FILE *opf;
+/** Output file template */
static const char html_template[]="data/index.tpl";
+/** HTML handler lookup table */
static htmlfunc htmlfuncs[]=
{
{"!MAP!", html_map},
@@ -81,17 +87,44 @@
{NULL, NULL},
};
+/** @brief html_title
+ *
+ * HTML handler for title
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_title( void )
{
os_fprintf( opf, "Network Statistics for %s", me.netname );
}
+/** @brief html_version
+ *
+ * HTML handler for version
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_version( void )
{
os_fputs( me.version, opf );
}
-void put_copyright( void )
+/** @brief put_copyright
+ *
+ * HTML handler for copyright footer
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+static void put_copyright( void )
{
os_fprintf( opf, "<br><br><center>Statistics last updated at %s<br>", sftime( time( NULL ) ) );
os_fprintf( opf, "<b>StatServ Information:</b>\n" );
@@ -102,6 +135,15 @@
os_fprintf( opf, "</center></html>\n" );
}
+/** @brief serverlisthandler
+ *
+ * HTML handler helper for srvlist
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void serverlisthandler( const serverstat *ss, const void *v )
{
os_fprintf( opf, "<tr><td height=\"4\"></td>\n" );
@@ -109,6 +151,15 @@
ss->name, ss->name,( ss->s ) ? "ONLINE" : "OFFLINE" );
}
+/** @brief html_srvlist
+ *
+ * HTML handler for srvlist
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_srvlist( void )
{
os_fprintf( opf, "<table border=0><tr><th colspan = 2>Server name</th></tr>" );
@@ -116,6 +167,15 @@
os_fprintf( opf, "</table>" );
}
+/** @brief serverlistdetailhandler
+ *
+ * HTML handler helper for srvlistdet
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void serverlistdetailhandler( const serverstat *ss, const void *v )
{
os_fprintf( opf, "<tr><th><a name=%s>Server:</th><th colspan = 2><b>%s</b></th></tr>\n",
@@ -147,6 +207,15 @@
(int)ss->splits.alltime.runningtotal );
}
+/** @brief html_srvlistdet
+ *
+ * HTML handler for srvlistdet
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_srvlistdet( void )
{
os_fprintf( opf, "<table border=0>" );
@@ -154,6 +223,15 @@
os_fprintf( opf, "</table>" );
}
+/** @brief html_netstats
+ *
+ * HTML handler for netstats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_netstats( void )
{
os_fprintf( opf, "<table border = 0>" );
@@ -190,6 +268,15 @@
os_fprintf( opf, "<td colspan=\"3\">%d</td></tr></table>\n", me.awaycount );
}
+/** @brief html_dailystats
+ *
+ * HTML handler for daily
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_dailystats( void )
{
os_fprintf( opf, "<table border = 0>" );
@@ -225,6 +312,15 @@
os_fprintf( opf, "</tr></table>\n" );
}
+/** @brief html_weeklystats
+ *
+ * HTML handler for weekly
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_weeklystats( void )
{
os_fprintf( opf, "<table border = 0>" );
@@ -260,6 +356,15 @@
os_fprintf( opf, "</tr></table>\n" );
}
+/** @brief html_monthlystats
+ *
+ * HTML handler for monthly
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_monthlystats( void )
{
os_fprintf( opf, "<table border = 0>" );
@@ -295,12 +400,30 @@
os_fprintf( opf, "</tr></table>\n" );
}
+/** @brief top10membershandler
+ *
+ * HTML handler helper for top10members
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void top10membershandler( const channelstat *cs, const void *v )
{
os_fprintf( opf, "<tr><td>%s</td><td align=right>%d</td></tr>\n",
cs->name, cs->c->users );
}
+/** @brief html_channeltop10members
+ *
+ * HTML handler for channeltop10members
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_channeltop10members( void )
{
os_fprintf( opf, "<table border = 0><tr><th>Channel</th><th align=right>Members</th></tr>" );
@@ -308,12 +431,30 @@
os_fprintf( opf, "</table>" );
}
+/** @brief top10joinshandler
+ *
+ * HTML handler helper for top10joins
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void top10joinshandler( const channelstat *cs, const void *v )
{
os_fprintf( opf, "<tr><td>%s</td><td align=right>%d</td></tr>\n",
cs->name, cs->users.alltime.runningtotal );
}
+/** @brief html_channeltop10joins
+ *
+ * HTML handler for channeltop10joins
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_channeltop10joins( void )
{
os_fprintf( opf, "<table border = 0><tr><th>Channel</th><th align=right>Total Joins</th></tr>" );
@@ -321,12 +462,30 @@
os_fprintf( opf, "</table>" );
}
+/** @brief top10kickshandler
+ *
+ * HTML handler helper for top10kicks
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void top10kickshandler( const channelstat *cs, const void *v )
{
os_fprintf( opf, "<tr><td>%s</td><td align=right>%d</td></tr>\n",
cs->name, cs->kicks.alltime.runningtotal );
}
+/** @brief html_channeltop10kicks
+ *
+ * HTML handler for channeltop10kicks
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_channeltop10kicks( void )
{
os_fprintf( opf, "<table border = 0><tr><th>Channel</th><th>Total Kicks</th></tr>" );
@@ -334,12 +493,30 @@
os_fprintf( opf, "</table>" );
}
+/** @brief top10topicshandler
+ *
+ * HTML handler helper for top10topics
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void top10topicshandler( const channelstat *cs, const void *v )
{
os_fprintf( opf, "<tr><td>%s</td><td align=right>%d</td></tr>\n",
cs->name, cs->topics.alltime.runningtotal );
}
+/** @brief html_channeltop10topics
+ *
+ * HTML handler for channeltop10topics
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_channeltop10topics( void )
{
os_fprintf( opf, "<table border = 0><tr><th>Channel</th><th>Total Topics</th></tr>" );
@@ -347,12 +524,30 @@
os_fprintf( opf, "</table>" );
}
+/** @brief HTMLClientVersionReport
+ *
+ * HTML handler helper for ClientVersionReport
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void HTMLClientVersionReport( const ss_ctcp_version *cv, const void *v )
{
os_fprintf( opf, "<tr><td>%s</td><td align=right>%d</td></tr>\n",
cv->name, cv->users.current );
}
+/** @brief html_clientstats
+ *
+ * HTML handler for clientstats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_clientstats( void )
{
os_fprintf( opf, "<table border = 0><tr><th>Version</th><th align=right>Count</th></tr>" );
@@ -360,12 +555,30 @@
os_fprintf( opf, "</table>" );
}
+/** @brief HTMLTLDReport
+ *
+ * HTML handler helper for TLDReport
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void HTMLTLDReport( const TLD *tld, const void *v )
{
os_fprintf( opf, "<tr><td>%s</td><td>%s</td><td>%3d</td><td>%3d</td><td>%3d</td><td>%3d</td><td>%3d</td></tr>",
tld->tld, tld->country, tld->users.current, tld->users.daily.runningtotal, tld->users.weekly.runningtotal, tld->users.monthly.runningtotal, tld->users.alltime.runningtotal );
}
+/** @brief html_tldmap
+ *
+ * HTML handler for tldmap
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_tldmap( void )
{
os_fprintf( opf, "<table border = 0><tr><th>tld</th><th>Country</th><th>Current</th><th>Day</th><th>Week</th><th>Month</th><th>All Time</th></tr>" );
@@ -373,6 +586,15 @@
os_fprintf( opf, "</table>" );
}
+/** @brief get_map
+ *
+ * HTML recursive handler to generate network map
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void get_map( char *uplink, int level )
{
#define MAPBUFSIZE 512
@@ -424,13 +646,31 @@
}
}
+/** @brief html_map
+ *
+ * HTML handler for map
+ *
+ * @param none
+ *
+ * @return none
+ */
+
static void html_map( void )
{
get_map( "", 0 );
os_fputs( "</TABLE>\n", opf );
}
-int ss_html( void *userptr )
+/** @brief HTMLOutput
+ *
+ * output HTML file
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void HTMLOutput( void )
{
#define HTMLREADBUFSIZE 512
static char buf[HTMLREADBUFSIZE];
@@ -443,13 +683,13 @@
if( !tpl ) {
nlog( LOG_WARNING, "Failed to open StatServ HTML template %s.", html_template );
irc_chanalert( ss_bot, "Failed to open StatServ HTML template %s.", html_template );
- return NS_SUCCESS;
+ return;
}
opf = os_fopen( StatServ.htmlpath, "wt" );
if( !opf ) {
nlog( LOG_WARNING, "Failed to open HTML output file %s. Check file permissions.", StatServ.htmlpath );
irc_chanalert( ss_bot, "Failed to open HTML output file %s. Check file permissions.", StatServ.htmlpath );
- return NS_SUCCESS;
+ return;
}
while( os_fgets( buf, HTMLREADBUFSIZE, tpl ) ) {
bufptr = buf;
@@ -479,15 +719,36 @@
/* update the umode so others can read it and owner can overwrite it */
chmod(StatServ.htmlpath, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
#endif /* WIN32 */
+}
-
+/** @brief HTMLOutputTimer
+ *
+ * Timer handler to output HTML file
+ *
+ * @param none
+ *
+ * @return none
+ */
+int HTMLOutputTimer( void *userptr )
+{
+ HTMLOutput();
return NS_SUCCESS;
}
-int ss_cmd_forcehtml( CmdParams *cmdparams )
+/** @brief ss_cmd_forcehtml
+ *
+ * FORCEHTML command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_cmd_forcehtml( const CmdParams *cmdparams )
{
nlog( LOG_NOTICE, "%s!%s@%s forced an update of the HTML file.",
cmdparams->source->name, cmdparams->source->user->username, cmdparams->source->user->hostname );
- ss_html( NULL);
+ HTMLOutput();
return NS_SUCCESS;
}
Modified: trunk/modules/statserv/htmlstats.h
==============================================================================
--- trunk/modules/statserv/htmlstats.h (original)
+++ trunk/modules/statserv/htmlstats.h Sat Aug 20 06:59:11 2005
@@ -25,6 +25,7 @@
#define _HTMLSTATS_H_
int ss_cmd_forcehtml( const CmdParams *cmdparams );
-int ss_html( void *v );
+int HTMLOutputTimer( void *v );
+void HTMLOutput( void );
#endif /* _HTMLSTATS_H_ */
Modified: trunk/modules/statserv/network.c
==============================================================================
--- trunk/modules/statserv/network.c (original)
+++ trunk/modules/statserv/network.c Sat Aug 20 06:59:11 2005
@@ -26,8 +26,10 @@
#include "stats.h"
#include "network.h"
+/** Network table name */
#define NETWORK_TABLE "Network"
+/** Network stats */
networkstat networkstats;
/** @brief AverageNetworkStatistics
@@ -39,13 +41,13 @@
* @return none
*/
-void AverageNetworkStatistics (void)
+void AverageNetworkStatistics( void )
{
- AverageStatistic (&networkstats.servers);
- AverageStatistic (&networkstats.channels);
- AverageStatistic (&networkstats.users);
- AverageStatistic (&networkstats.opers);
- AverageStatistic (&networkstats.kills);
+ AverageStatistic( &networkstats.servers );
+ AverageStatistic( &networkstats.channels );
+ AverageStatistic( &networkstats.users );
+ AverageStatistic( &networkstats.opers );
+ AverageStatistic( &networkstats.kills );
}
/** @brief ResetNetworkStatistics
@@ -57,143 +59,289 @@
* @return none
*/
-void ResetNetworkStatistics (void)
+void ResetNetworkStatistics( void )
{
- ResetStatistic (&networkstats.servers);
- ResetStatistic (&networkstats.channels);
- ResetStatistic (&networkstats.users);
- ResetStatistic (&networkstats.opers);
- ResetStatistic (&networkstats.kills);
+ ResetStatistic( &networkstats.servers );
+ ResetStatistic( &networkstats.channels );
+ ResetStatistic( &networkstats.users );
+ ResetStatistic( &networkstats.opers );
+ ResetStatistic( &networkstats.kills );
}
-void AddNetworkServer (void)
+/** @brief AddNetworkServer
+ *
+ * Add server to network stats
+ * Report new record if previous ones beaten
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void AddNetworkServer( void )
{
- if (IncStatistic (&networkstats.servers)) {
- announce_record ("\2NEW NETWORK RECORD\2 %d servers on the network",
- networkstats.servers.current);
- }
+ if( IncStatistic( &networkstats.servers ) )
+ announce_record( "\2NEW NETWORK RECORD\2 %d servers on the network",
+ networkstats.servers.current );
}
-void DelNetworkServer (void)
+/** @brief DelNetworkServer
+ *
+ * Delete server from network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void DelNetworkServer( void )
{
- DecStatistic (&networkstats.servers);
+ DecStatistic( &networkstats.servers );
}
-void AddNetworkChannel (void)
+/** @brief AddNetworkChannel
+ *
+ * Add channel to network stats
+ * Report new record if previous ones beaten
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void AddNetworkChannel( void )
{
- if (IncStatistic (&networkstats.channels)) {
- announce_record ("\2NEW NETWORK RECORD\2 %d channels on the network",
- networkstats.channels.current);
- }
+ if( IncStatistic( &networkstats.channels ) )
+ announce_record( "\2NEW NETWORK RECORD\2 %d channels on the network",
+ networkstats.channels.current );
}
-void DelNetworkChannel (void)
+/** @brief DelNetworkChannel
+ *
+ * Delete channel from network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void DelNetworkChannel( void )
{
- DecStatistic (&networkstats.channels);
+ DecStatistic( &networkstats.channels );
}
-void AddNetworkUser (void)
+/** @brief AddNetworkUser
+ *
+ * Add user to network stats
+ * Report new record if previous ones beaten
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void AddNetworkUser( void )
{
- if (IncStatistic (&networkstats.users)) {
- announce_record ("\2NEW NETWORK RECORD!\2 %d users on the network",
- networkstats.users.current);
- }
+ if( IncStatistic( &networkstats.users ) )
+ announce_record( "\2NEW NETWORK RECORD!\2 %d users on the network",
+ networkstats.users.current );
}
-void DelNetworkUser (void)
+/** @brief DelNetworkUser
+ *
+ * Delete user from network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void DelNetworkUser( void )
{
- DecStatistic (&networkstats.users);
+ DecStatistic( &networkstats.users );
}
-void AddNetworkOper (void)
+/** @brief AddNetworkOper
+ *
+ * Add oper to network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void AddNetworkOper( void )
{
- IncStatistic (&networkstats.opers);
+ IncStatistic( &networkstats.opers );
}
-void DelNetworkOper (void)
+/** @brief DelNetworkOper
+ *
+ * Delete oper from network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void DelNetworkOper( void )
{
- DecStatistic (&networkstats.opers);
+ DecStatistic( &networkstats.opers );
}
-void AddNetworkKill (void)
+/** @brief AddNetworkKill
+ *
+ * Add kill to network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void AddNetworkKill( void )
{
- IncStatistic (&networkstats.kills);
+ IncStatistic( &networkstats.kills );
}
-void DelNetworkKill (void)
+/** @brief DelNetworkKill
+ *
+ * Delete kill from network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void DelNetworkKill( void )
{
- DecStatistic (&networkstats.kills);
+ DecStatistic( &networkstats.kills );
}
-int ss_cmd_netstats (const CmdParams *cmdparams)
+/** @brief ss_cmd_netstats
+ *
+ * NETSTATS command handler
+ * Reports current network statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_cmd_netstats( const CmdParams *cmdparams )
{
SET_SEGV_LOCATION();
- irc_prefmsg(ss_bot, cmdparams->source, "Network Statistics:-----");
- irc_prefmsg(ss_bot, cmdparams->source, "Current Users: %d", networkstats.users.current);
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Users: %d [%s]",
- networkstats.users.alltime.max, sftime(networkstats.users.alltime.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Total Users Connected: %d",
- networkstats.users.alltime.runningtotal);
- irc_prefmsg(ss_bot, cmdparams->source, "Current Channels %d", networkstats.channels.current);
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Channels %d [%s]",
- networkstats.channels.alltime.max, sftime(networkstats.channels.alltime.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Current Opers: %d", networkstats.opers.current);
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Opers: %d [%s]",
- networkstats.opers.alltime.max, sftime(networkstats.opers.alltime.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Users Set Away: %d", me.awaycount);
- irc_prefmsg(ss_bot, cmdparams->source, "Current Servers: %d", networkstats.servers.current);
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Servers: %d [%s]",
- networkstats.servers.alltime.max, sftime(networkstats.servers.alltime.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "End of list.");
+ irc_prefmsg( ss_bot, cmdparams->source, "Network Statistics:-----" );
+ irc_prefmsg( ss_bot, cmdparams->source, "Current Users: %d", networkstats.users.current );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Users: %d [%s]",
+ networkstats.users.alltime.max, sftime( networkstats.users.alltime.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Total Users Connected: %d",
+ networkstats.users.alltime.runningtotal );
+ irc_prefmsg( ss_bot, cmdparams->source, "Current Channels %d", networkstats.channels.current );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Channels %d [%s]",
+ networkstats.channels.alltime.max, sftime( networkstats.channels.alltime.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Current Opers: %d", networkstats.opers.current );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Opers: %d [%s]",
+ networkstats.opers.alltime.max, sftime( networkstats.opers.alltime.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Users Set Away: %d", me.awaycount );
+ irc_prefmsg( ss_bot, cmdparams->source, "Current Servers: %d", networkstats.servers.current );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Servers: %d [%s]",
+ networkstats.servers.alltime.max, sftime( networkstats.servers.alltime.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
return NS_SUCCESS;
}
-int ss_cmd_daily (const CmdParams *cmdparams)
+/** @brief ss_cmd_daily
+ *
+ * DAILY command handler
+ * Reports current daily network statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_cmd_daily( const CmdParams *cmdparams )
{
SET_SEGV_LOCATION();
- irc_prefmsg(ss_bot, cmdparams->source, "Daily Network Statistics:");
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Servers: %-2d %s",
- networkstats.servers.daily.max, sftime(networkstats.servers.daily.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Users: %-2d %s",
- networkstats.users.daily.max, sftime(networkstats.users.daily.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Channel: %-2d %s",
- networkstats.channels.daily.max, sftime(networkstats.channels.daily.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Maximum Opers: %-2d %s",
- networkstats.opers.daily.max, sftime(networkstats.opers.daily.ts_max));
- irc_prefmsg(ss_bot, cmdparams->source, "Total Users Connected: %-2d",
- networkstats.users.daily.runningtotal);
- irc_prefmsg(ss_bot, cmdparams->source, "End of Information.");
+ irc_prefmsg( ss_bot, cmdparams->source, "Daily Network Statistics:" );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Servers: %-2d %s",
+ networkstats.servers.daily.max, sftime( networkstats.servers.daily.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Users: %-2d %s",
+ networkstats.users.daily.max, sftime( networkstats.users.daily.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Channel: %-2d %s",
+ networkstats.channels.daily.max, sftime( networkstats.channels.daily.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum Opers: %-2d %s",
+ networkstats.opers.daily.max, sftime( networkstats.opers.daily.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Total Users Connected: %-2d",
+ networkstats.users.daily.runningtotal );
+ irc_prefmsg( ss_bot, cmdparams->source, "End of Information." );
return NS_SUCCESS;
}
-void LoadNetworkStats(void)
+/** @brief LoadNetworkStats
+ *
+ * Load network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void LoadNetworkStats( void )
{
- if (DBAFetch (NETWORK_TABLE, NETWORK_TABLE, &networkstats, sizeof (networkstats)) == NS_SUCCESS)
+ if( DBAFetch( NETWORK_TABLE, NETWORK_TABLE, &networkstats, sizeof( networkstats ) ) == NS_SUCCESS )
{
- PostLoadStatistic (&networkstats.servers);
- PostLoadStatistic (&networkstats.channels);
- PostLoadStatistic (&networkstats.users);
- PostLoadStatistic (&networkstats.opers);
- PostLoadStatistic (&networkstats.kills);
+ PostLoadStatistic( &networkstats.servers );
+ PostLoadStatistic( &networkstats.channels );
+ PostLoadStatistic( &networkstats.users );
+ PostLoadStatistic( &networkstats.opers );
+ PostLoadStatistic( &networkstats.kills );
}
}
-void SaveNetworkStats(void)
+/** @brief SaveNetworkStats
+ *
+ * Save network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void SaveNetworkStats( void )
{
- DBAStore (NETWORK_TABLE, NETWORK_TABLE, &networkstats, sizeof(networkstats));
- PreSaveStatistic (&networkstats.servers);
- PreSaveStatistic (&networkstats.channels);
- PreSaveStatistic (&networkstats.users);
- PreSaveStatistic (&networkstats.opers);
- PreSaveStatistic (&networkstats.kills);
+ DBAStore( NETWORK_TABLE, NETWORK_TABLE, &networkstats, sizeof( networkstats ) );
+ PreSaveStatistic( &networkstats.servers );
+ PreSaveStatistic( &networkstats.channels );
+ PreSaveStatistic( &networkstats.users );
+ PreSaveStatistic( &networkstats.opers );
+ PreSaveStatistic( &networkstats.kills );
}
-void InitNetworkStats (void)
+/** @brief InitVersionStats
+ *
+ * Init version stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void InitNetworkStats( void )
{
LoadNetworkStats();
}
-void FiniNetworkStats (void)
+/** @brief FiniNetworkStats
+ *
+ * Fini network stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void FiniNetworkStats( void )
{
SaveNetworkStats();
}
Modified: trunk/modules/statserv/server.c
==============================================================================
--- trunk/modules/statserv/server.c (original)
+++ trunk/modules/statserv/server.c Sat Aug 20 06:59:11 2005
@@ -27,8 +27,10 @@
#include "network.h"
#include "server.h"
+/** Server table name */
#define SERVER_TABLE "Server"
+/** Server hash */
static hash_t *serverstathash;
/** @brief AverageServerStatistics
@@ -40,17 +42,18 @@
* @return none
*/
-void AverageServerStatistics (void)
+void AverageServerStatistics( void )
{
serverstat *ss;
hscan_t hs;
hnode_t *sn;
- hash_scan_begin (&hs, serverstathash);
- while ((sn = hash_scan_next (&hs))) {
- ss = hnode_get (sn);
- AverageStatistic (&ss->users);
- AverageStatistic (&ss->opers);
+ hash_scan_begin( &hs, serverstathash );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ ss = hnode_get( sn );
+ AverageStatistic( &ss->users );
+ AverageStatistic( &ss->opers );
}
}
@@ -63,156 +66,279 @@
* @return none
*/
-void ResetServerStatistics (void)
+void ResetServerStatistics( void )
{
serverstat *ss;
hscan_t hs;
hnode_t *sn;
- hash_scan_begin (&hs, serverstathash);
- while ((sn = hash_scan_next (&hs))) {
- ss = hnode_get (sn);
- ResetStatistic (&ss->users);
- ResetStatistic (&ss->opers);
+ hash_scan_begin( &hs, serverstathash );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ ss = hnode_get( sn );
+ ResetStatistic( &ss->users );
+ ResetStatistic( &ss->opers );
}
}
-static serverstat *new_server_stat (const char *name)
+/** @brief new_server_stat
+ *
+ * Create new server stat
+ *
+ * @param name of server to search for
+ *
+ * @return pointer to stat created or NULL if unable
+ */
+
+static serverstat *new_server_stat( const char *name )
{
serverstat *ss;
SET_SEGV_LOCATION();
- dlog (DEBUG2, "new_server_stat(%s)", name);
- if (hash_isfull (serverstathash)) {
- nlog (LOG_CRITICAL, "StatServ Server hash is full!");
+ dlog( DEBUG2, "new_server_stat( %s )", name );
+ if( hash_isfull( serverstathash ) )
+ {
+ nlog( LOG_CRITICAL, "StatServ Server hash is full!" );
return NULL;
}
- ss = ns_calloc (sizeof(serverstat));
- memcpy (ss->name, name, MAXHOST);
- hnode_create_insert (serverstathash, ss, ss->name);
+ ss = ns_calloc( sizeof( serverstat ) );
+ memcpy( ss->name, name, MAXHOST );
+ hnode_create_insert( serverstathash, ss, ss->name );
return ss;
}
-static serverstat *findserverstats (const char *name)
+/** @brief findserverstats
+ *
+ * Check list for server
+ *
+ * @param name of server to search for
+ *
+ * @return pointer to stat found or NULL if none
+ */
+
+static serverstat *findserverstats( const char *name )
{
serverstat *stats;
- stats = (serverstat *)hnode_find (serverstathash, name);
- if (!stats) {
- dlog (DEBUG2, "findserverstats (%s) - not found", name);
- }
+ stats =( serverstat * )hnode_find( serverstathash, name );
+ if( !stats )
+ dlog( DEBUG2, "findserverstats( %s ) - not found", name );
return stats;
}
+/** @brief AddServerUser
+ *
+ * Add user stat
+ *
+ * @param u pointer to client to update
+ *
+ * @return none
+ */
+
void AddServerUser( const Client *u )
{
serverstat *ss;
- ss = GetServerModValue (u->uplink);
- if (IncStatistic (&ss->users)) {
- announce_record ("\2NEW SERVER RECORD!\2 %d users on server %s",
- ss->s->server->users, ss->name);
+ ss = GetServerModValue( u->uplink );
+ if( IncStatistic( &ss->users ) )
+ {
+ announce_record( "\2NEW SERVER RECORD!\2 %d users on server %s",
+ ss->s->server->users, ss->name );
}
}
-void DelServerUser (const Client *u)
+/** @brief DelServerUser
+ *
+ * Delete server user
+ *
+ * @param u pointer to client to update
+ *
+ * @return none
+ */
+
+void DelServerUser( const Client *u )
{
serverstat *ss;
- ss = GetServerModValue (u->uplink);
- DecStatistic (&ss->users);
+ ss = GetServerModValue( u->uplink );
+ DecStatistic( &ss->users );
}
-void AddServerOper (const Client *u)
+/** @brief AddServerOper
+ *
+ * Add server oper
+ *
+ * @param u pointer to client to update
+ *
+ * @return none
+ */
+
+void AddServerOper( const Client *u )
{
serverstat *ss;
- ss = GetServerModValue (u->uplink);
- if (IncStatistic (&ss->opers)) {
- announce_record ("\2NEW SERVER RECORD!\2 %d opers on %s",
- ss->opers.alltime.runningtotal, ss->name);
+ ss = GetServerModValue( u->uplink );
+ if( IncStatistic( &ss->opers ) )
+ {
+ announce_record( "\2NEW SERVER RECORD!\2 %d opers on %s",
+ ss->opers.alltime.runningtotal, ss->name );
}
}
-void DelServerOper (const Client *u)
+/** @brief DelServerOper
+ *
+ * Delete server oper
+ *
+ * @param s pointer to client to update
+ *
+ * @return none
+ */
+
+void DelServerOper( const Client *u )
{
serverstat *ss;
- ss = GetServerModValue (u->uplink);
- DecStatistic (&ss->opers);
+ ss = GetServerModValue( u->uplink );
+ DecStatistic( &ss->opers );
}
-static int AddServerStat (Client *s, const void *v)
+/** @brief AddServerStat
+ *
+ * Add server stat
+ *
+ * @param s pointer to client to update
+ * @param v not used
+ *
+ * @return none
+ */
+
+static int AddServerStat( Client *s, const void *v )
{
serverstat *ss;
- dlog (DEBUG2, "AddServerStat(%s)", s->name);
- ss = findserverstats (s->name);
- if (!ss) {
- ss = new_server_stat (s->name);
- }
+ dlog( DEBUG2, "AddServerStat( %s )", s->name );
+ ss = findserverstats( s->name );
+ if( !ss )
+ ss = new_server_stat( s->name );
ss->ts_start = ss->ts_lastseen = me.now;
- AddNetworkServer ();
- SetServerModValue (s, (void *)ss);
+ AddNetworkServer();
+ SetServerModValue( s,( void * )ss );
ss->s = s;
return NS_FALSE;
}
-int ss_event_server (const CmdParams *cmdparams)
+/** @brief ss_event_server
+ *
+ * SERVER event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_event_server( const CmdParams *cmdparams )
{
- AddServerStat (cmdparams->source, NULL);
+ AddServerStat( cmdparams->source, NULL );
return NS_SUCCESS;
}
-static void DelServerStat (Client* s)
+/** @brief DelServerStat
+ *
+ * Delete server stat
+ *
+ * @param s pointer to client to update
+ *
+ * @return none
+ */
+
+static void DelServerStat( Client* s )
{
serverstat *ss;
- ss = (serverstat *) GetServerModValue (s);
+ ss =( serverstat * ) GetServerModValue( s );
ss->ts_lastseen = me.now;
- IncStatistic (&ss->splits);
- ClearServerModValue (s);
+ IncStatistic( &ss->splits );
+ ClearServerModValue( s );
ss->s = NULL;
}
-int ss_event_squit (const CmdParams *cmdparams)
+/** @brief ss_event_squit
+ *
+ * SQUIT event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_event_squit( const CmdParams *cmdparams )
{
- DelServerStat (cmdparams->source);
- DelNetworkServer ();
+ DelServerStat( cmdparams->source );
+ DelNetworkServer();
return NS_SUCCESS;
}
-static void UpdatePingStats (const Client* s)
+/** @brief UpdatePingStats
+ *
+ * Update ping stats
+ *
+ * @param s pointer to client to update
+ *
+ * @return none
+ */
+
+static void UpdatePingStats( const Client* s )
{
serverstat *ss;
- ss = (serverstat *) GetServerModValue (s);
- if (!ss)
+ ss =( serverstat * ) GetServerModValue( s );
+ if( !ss )
return;
- if (s->server->ping > ss->highest_ping) {
+ if( s->server->ping > ss->highest_ping )
+ {
ss->highest_ping = s->server->ping;
ss->ts_highest_ping = me.now;
}
- if (s->server->ping < ss->lowest_ping) {
+ if( s->server->ping < ss->lowest_ping )
+ {
ss->lowest_ping = s->server->ping;
ss->ts_lowest_ping = me.now;
}
/* ok, updated the statistics, now lets see if this server is "lagged out" */
- if (s->server->ping > StatServ.lagtime) {
- announce_lag ("\2%s\2 is lagged out with a ping of %d", s->name, s->server->ping);
- }
+ if( s->server->ping > StatServ.lagtime )
+ announce_lag( "\2%s\2 is lagged out with a ping of %d", s->name, s->server->ping );
}
-int ss_event_pong (const CmdParams *cmdparams)
+/** @brief ss_event_pong
+ *
+ * PONG event handler
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_event_pong( const CmdParams *cmdparams )
{
/* we don't want negative pings! */
- if (cmdparams->source->server->ping > 0) {
- UpdatePingStats (cmdparams->source);
- }
+ if( cmdparams->source->server->ping > 0 )
+ UpdatePingStats( cmdparams->source );
return NS_SUCCESS;
}
-static void makemap(const char *uplink, const Client * u, int level)
+/** @brief makemap
+ *
+ * MAP command handler
+ * Recursively transverse map and report results
+ *
+ * @param uplink current point in map
+ * @param u client to report to
+ * @param level in map
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+static void makemap( const char *uplink, const Client * u, int level )
{
static char buf[256];
hscan_t hs;
@@ -220,260 +346,393 @@
Client *s;
serverstat *ss;
int i;
- hash_scan_begin (&hs, GetServerHash ());
- while ((sn = hash_scan_next (&hs))) {
- s = hnode_get (sn);
- printf("%d %s %s (%s)\n", level, s->name, s->uplink ? s->uplink->name : "", uplink);
- ss = (serverstat *) GetServerModValue (s);
- if ((level == 0) && (s->uplinkname[0] == 0)) {
+ hash_scan_begin( &hs, GetServerHash() );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ s = hnode_get( sn );
+ printf( "%d %s %s( %s )\n", level, s->name, s->uplink ? s->uplink->name : "", uplink );
+ ss =( serverstat * ) GetServerModValue( s );
+ if( ( level == 0 ) &&( s->uplinkname[0] == 0 ) )
+ {
/* its the root server */
- if (StatServ.exclusions && IsExcluded(s)) {
- makemap(s->name, u, level);
- }
- irc_prefmsg (ss_bot, u,
+ if( StatServ.exclusions && IsExcluded( s ) )
+ makemap( s->name, u, level );
+ irc_prefmsg( ss_bot, u,
"\2%-45s [ %d/%d ] [ %d/%d ] [ %d/%ld ]",
- ss->name, s->server->users, (int)ss->users.alltime.max,
- ss->opers.current, ss->opers.alltime.max, (int)s->server->ping, ss->highest_ping);
- makemap(s->name, u, level + 1);
- } else if ((level > 0) && (s->uplink) && !ircstrcasecmp (s->uplink->name, uplink)) {
- if (StatServ.exclusions && IsExcluded(s)) {
- makemap(s->name, u, level);
- }
+ ss->name, s->server->users,( int )ss->users.alltime.max,
+ ss->opers.current, ss->opers.alltime.max,( int )s->server->ping, ss->highest_ping );
+ makemap( s->name, u, level + 1 );
+ } else if( ( level > 0 ) &&( s->uplink ) && !ircstrcasecmp( s->uplink->name, uplink ) )
+ {
+ if( StatServ.exclusions && IsExcluded( s ) )
+ makemap( s->name, u, level );
/* its not the root server */
if( StatServ.flatmap )
{
- irc_prefmsg (ss_bot, u,
+ irc_prefmsg( ss_bot, u,
"\2%-40s [ %d/%d ] [ %d/%d ] [ %d/%ld ]",
- ss->name, s->server->users, (int)ss->users.alltime.max,
- ss->opers.current, ss->opers.alltime.max, (int)s->server->ping, ss->highest_ping);
+ ss->name, s->server->users,( int )ss->users.alltime.max,
+ ss->opers.current, ss->opers.alltime.max,( int )s->server->ping, ss->highest_ping );
}
else
{
buf[0]='\0';
- for (i = 1; i < level; i++) {
- strlcat (buf, " |", 256);
- }
- irc_prefmsg (ss_bot, u,
+ for( i = 1; i < level; i++ )
+ strlcat( buf, " |", 256 );
+ irc_prefmsg( ss_bot, u,
"%s \\_\2%-40s [ %d/%d ] [ %d/%d ] [ %d/%ld ]",
- buf, ss->name, s->server->users, (int)ss->users.alltime.max,
- ss->opers.current, ss->opers.alltime.max, (int)s->server->ping, ss->highest_ping);
+ buf, ss->name, s->server->users,( int )ss->users.alltime.max,
+ ss->opers.current, ss->opers.alltime.max,( int )s->server->ping, ss->highest_ping );
}
- makemap(s->name, u, level + 1);
+ makemap( s->name, u, level + 1 );
}
}
}
-int ss_cmd_map (const CmdParams *cmdparams)
+/** @brief ss_cmd_map
+ *
+ * MAP command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_cmd_map( const CmdParams *cmdparams )
{
SET_SEGV_LOCATION();
- irc_prefmsg (ss_bot, cmdparams->source, "%-40s %-10s %-10s %-10s",
- "\2[NAME]\2", "\2[USERS/MAX]\2", "\2[OPERS/MAX]\2", "\2[LAG/MAX]\2");
- makemap ("", cmdparams->source, 0);
- irc_prefmsg (ss_bot, cmdparams->source, "End of list.");
+ irc_prefmsg( ss_bot, cmdparams->source, "%-40s %-10s %-10s %-10s",
+ "\2[NAME]\2", "\2[USERS/MAX]\2", "\2[OPERS/MAX]\2", "\2[LAG/MAX]\2" );
+ makemap( "", cmdparams->source, 0 );
+ irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
return NS_SUCCESS;
}
-int ss_cmd_server_list (const CmdParams *cmdparams)
+/** @brief ss_cmd_server_list
+ *
+ * SERVER LIST command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+int ss_cmd_server_list( const CmdParams *cmdparams )
{
serverstat *ss;
hscan_t hs;
hnode_t *sn;
- irc_prefmsg (ss_bot, cmdparams->source, "Server listing:");
- hash_scan_begin (&hs, serverstathash);
- while ((sn = hash_scan_next (&hs))) {
- ss = hnode_get (sn);
- irc_prefmsg (ss_bot, cmdparams->source, "%s (%s)", ss->name,
- (ss->s) ? "ONLINE" : "OFFLINE");
+ irc_prefmsg( ss_bot, cmdparams->source, "Server listing:" );
+ hash_scan_begin( &hs, serverstathash );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ ss = hnode_get( sn );
+ irc_prefmsg( ss_bot, cmdparams->source, "%s( %s )", ss->name,
+ ( ss->s ) ? "ONLINE" : "OFFLINE" );
}
- irc_prefmsg (ss_bot,cmdparams->source, "End of list.");
+ irc_prefmsg( ss_bot,cmdparams->source, "End of list." );
return NS_SUCCESS;
}
-static int ss_server_del (const CmdParams *cmdparams)
+/** @brief ss_server_del
+ *
+ * SERVER DEL command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+static int ss_server_del( const CmdParams *cmdparams )
{
serverstat *ss;
hnode_t *node;
- if (cmdparams->ac < 2) {
+ if( cmdparams->ac < 2 )
return NS_ERR_NEED_MORE_PARAMS;
- }
- ss = findserverstats (cmdparams->av[1]);
- if (!ss) {
- irc_prefmsg (ss_bot, cmdparams->source, "%s is not in the database", cmdparams->av[1]);
+ ss = findserverstats( cmdparams->av[1] );
+ if( !ss )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source, "%s is not in the database", cmdparams->av[1] );
return NS_SUCCESS;
}
- if (ss->s) {
- irc_prefmsg (ss_bot, cmdparams->source,
- "Cannot remove %s from the database, it is online!!", cmdparams->av[1]);
+ if( ss->s )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source,
+ "Cannot remove %s from the database, it is online!!", cmdparams->av[1] );
return NS_SUCCESS;
}
- node = hash_lookup(serverstathash, cmdparams->av[1]);
- if (node) {
- ss = (serverstat *)hnode_get( node );
- hash_delete (serverstathash, node);
- hnode_destroy (node);
- ns_free (ss);
- irc_prefmsg (ss_bot, cmdparams->source, "Removed %s from the database.",
- cmdparams->av[1]);
- nlog (LOG_NOTICE, "%s deleted stats for %s", cmdparams->source->name, cmdparams->av[1]);
+ node = hash_lookup( serverstathash, cmdparams->av[1] );
+ if( node )
+ {
+ ss =( serverstat * )hnode_get( node );
+ hash_delete( serverstathash, node );
+ hnode_destroy( node );
+ ns_free( ss );
+ irc_prefmsg( ss_bot, cmdparams->source, "Removed %s from the database.",
+ cmdparams->av[1] );
+ nlog( LOG_NOTICE, "%s deleted stats for %s", cmdparams->source->name, cmdparams->av[1] );
}
return NS_SUCCESS;
}
-static int ss_server_copy (const CmdParams *cmdparams)
+/** @brief ss_server_copy
+ *
+ * SERVER COPY command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+static int ss_server_copy( const CmdParams *cmdparams )
{
serverstat *dest;
serverstat *src;
- if (UserLevel(cmdparams->source) < NS_ULEVEL_ADMIN) {
+ if( UserLevel( cmdparams->source ) < NS_ULEVEL_ADMIN )
return NS_ERR_NO_PERMISSION;
- }
- if (cmdparams->ac < 3) {
+ if( cmdparams->ac < 3 )
return NS_ERR_NEED_MORE_PARAMS;
- }
- dest = findserverstats (cmdparams->av[2]);
- if (dest)
+ dest = findserverstats( cmdparams->av[2] );
+ if( dest )
{
- if (dest->s) {
- irc_prefmsg (ss_bot, cmdparams->source, "Server %s is online!", cmdparams->av[2]);
+ if( dest->s )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source, "Server %s is online!", cmdparams->av[2] );
return NS_SUCCESS;
}
- ns_free(dest);
+ ns_free( dest );
}
- src = findserverstats (cmdparams->av[1]);
- if (!src) {
- irc_prefmsg (ss_bot, cmdparams->source, "%s is not in the database",
- cmdparams->av[1]);
+ src = findserverstats( cmdparams->av[1] );
+ if( !src )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source, "%s is not in the database",
+ cmdparams->av[1] );
return NS_SUCCESS;
}
- memcpy (dest, src, sizeof(serverstat));
- strlcpy (dest->name, cmdparams->av[2], MAXHOST);
- irc_prefmsg (ss_bot, cmdparams->source, "Copied database entry for %s to %s",
- cmdparams->av[1], cmdparams->av[2]);
- nlog (LOG_NOTICE, "%s requested STATS COPY %s to %s", cmdparams->source->name,
- cmdparams->av[1], cmdparams->av[2]);
+ memcpy( dest, src, sizeof( serverstat ) );
+ strlcpy( dest->name, cmdparams->av[2], MAXHOST );
+ irc_prefmsg( ss_bot, cmdparams->source, "Copied database entry for %s to %s",
+ cmdparams->av[1], cmdparams->av[2] );
+ nlog( LOG_NOTICE, "%s requested STATS COPY %s to %s", cmdparams->source->name,
+ cmdparams->av[1], cmdparams->av[2] );
return NS_SUCCESS;
}
-static int ss_cmd_server_stats (const CmdParams *cmdparams)
+/** @brief ss_cmd_server_stats
+ *
+ * SERVER command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
+
+static int ss_cmd_server_stats( const CmdParams *cmdparams )
{
serverstat *ss;
Client *s;
char *server;
- if (cmdparams->ac == 0) {
+ if( cmdparams->ac == 0 )
return NS_ERR_SYNTAX_ERROR;
- }
server = cmdparams->av[0];
- ss = findserverstats (server);
- if (!ss) {
- nlog (LOG_CRITICAL, "Unable to find server statistics for %s", server);
- irc_prefmsg (ss_bot, cmdparams->source, "Unable to find server statistics for %s", server);
+ ss = findserverstats( server );
+ if( !ss )
+ {
+ nlog( LOG_CRITICAL, "Unable to find server statistics for %s", server );
+ irc_prefmsg( ss_bot, cmdparams->source, "Unable to find server statistics for %s", server );
return NS_SUCCESS;
}
- irc_prefmsg (ss_bot, cmdparams->source, "Statistics for \2%s\2 since %s",
- ss->name, sftime(ss->ts_start));
+ irc_prefmsg( ss_bot, cmdparams->source, "Statistics for \2%s\2 since %s",
+ ss->name, sftime( ss->ts_start ) );
s = ss->s;
- if (!s) {
- irc_prefmsg (ss_bot, cmdparams->source, "Server Last Seen: %s",
- sftime(ss->ts_lastseen));
- } else {
+ if( !s )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source, "Server Last Seen: %s",
+ sftime( ss->ts_lastseen ) );
+ }
+ else
+ {
/* Calculate uptime as uptime from server plus uptime of NeoStats */
time_t uptime;
- uptime = s->server->uptime + (me.now - me.ts_boot);
- irc_prefmsg (ss_bot, cmdparams->source, "Version: %s", s->version );
- irc_prefmsg (ss_bot, cmdparams->source, "Uptime: %ld day%s, %02ld:%02ld:%02ld", ( uptime / TS_ONE_DAY ), ( ( uptime / TS_ONE_DAY ) == 1 ) ? "" : "s", ((uptime / TS_ONE_HOUR) % 24), ((uptime / TS_ONE_MINUTE) % TS_ONE_MINUTE), (uptime % 60) );
- irc_prefmsg (ss_bot, cmdparams->source, "Current Users: %-3d (%d%%)",
+ uptime = s->server->uptime +( me.now - me.ts_boot );
+ irc_prefmsg( ss_bot, cmdparams->source, "Version: %s", s->version );
+ irc_prefmsg( ss_bot, cmdparams->source, "Uptime: %ld day%s, %02ld:%02ld:%02ld",( uptime / TS_ONE_DAY ),( ( uptime / TS_ONE_DAY ) == 1 ) ? "" : "s",( ( uptime / TS_ONE_HOUR ) % 24 ),( ( uptime / TS_ONE_MINUTE ) % TS_ONE_MINUTE ),( uptime % 60 ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Current Users: %-3d( %d%% )",
s->server->users,
- (int)((float) s->server->users / (float) networkstats.users.current * 100));
- }
- irc_prefmsg (ss_bot, cmdparams->source, "Maximum users: %-3d at %s",
- ss->users.alltime.max, sftime(ss->users.alltime.ts_max));
- irc_prefmsg (ss_bot, cmdparams->source, "Total users connected: %-3d", ss->users.alltime.runningtotal);
- if (s) {
- irc_prefmsg (ss_bot, cmdparams->source, "Current opers: %-3d", ss->opers.current);
- }
- irc_prefmsg (ss_bot, cmdparams->source, "Maximum opers: %-3d at %s",
- ss->opers.alltime.max, sftime(ss->opers.alltime.ts_max));
- irc_prefmsg (ss_bot, cmdparams->source, "IRCop kills: %d", ss->operkills.alltime.runningtotal);
- irc_prefmsg (ss_bot, cmdparams->source, "Server kills: %d", ss->serverkills.alltime.runningtotal);
- irc_prefmsg (ss_bot, cmdparams->source, "Lowest ping: %-3d at %s",
- (int)ss->lowest_ping, sftime(ss->ts_lowest_ping));
- irc_prefmsg (ss_bot, cmdparams->source, "Higest ping: %-3d at %s",
- (int)ss->highest_ping, sftime(ss->ts_highest_ping));
- if (s) {
- irc_prefmsg (ss_bot, cmdparams->source, "Current Ping: %-3d", (int)s->server->ping);
+ ( int )( ( float ) s->server->users /( float ) networkstats.users.current * 100 ) );
}
- if (ss->splits.alltime.runningtotal >= 1) {
- irc_prefmsg (ss_bot, cmdparams->source,
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum users: %-3d at %s",
+ ss->users.alltime.max, sftime( ss->users.alltime.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Total users connected: %-3d", ss->users.alltime.runningtotal );
+ if( s )
+ irc_prefmsg( ss_bot, cmdparams->source, "Current opers: %-3d", ss->opers.current );
+ irc_prefmsg( ss_bot, cmdparams->source, "Maximum opers: %-3d at %s",
+ ss->opers.alltime.max, sftime( ss->opers.alltime.ts_max ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "IRCop kills: %d", ss->operkills.alltime.runningtotal );
+ irc_prefmsg( ss_bot, cmdparams->source, "Server kills: %d", ss->serverkills.alltime.runningtotal );
+ irc_prefmsg( ss_bot, cmdparams->source, "Lowest ping: %-3d at %s",
+ ( int )ss->lowest_ping, sftime( ss->ts_lowest_ping ) );
+ irc_prefmsg( ss_bot, cmdparams->source, "Higest ping: %-3d at %s",
+ ( int )ss->highest_ping, sftime( ss->ts_highest_ping ) );
+ if( s )
+ irc_prefmsg( ss_bot, cmdparams->source, "Current Ping: %-3d",( int )s->server->ping );
+ if( ss->splits.alltime.runningtotal >= 1 )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source,
"%s has split from the network %d time %s",
- ss->name, ss->splits.alltime.runningtotal, (ss->splits.alltime.runningtotal == 1) ? "" : "s");
- } else {
- irc_prefmsg (ss_bot, cmdparams->source, "%s has never split from the network.",
- ss->name);
+ ss->name, ss->splits.alltime.runningtotal,( ss->splits.alltime.runningtotal == 1 ) ? "" : "s" );
}
- irc_prefmsg (ss_bot, cmdparams->source, "***** End of Statistics *****");
+ else
+ {
+ irc_prefmsg( ss_bot, cmdparams->source, "%s has never split from the network.",
+ ss->name );
+ }
+ irc_prefmsg( ss_bot, cmdparams->source, "***** End of Statistics *****" );
return NS_SUCCESS;
}
+/** @brief ss_cmd_server
+ *
+ * SERVER command handler
+ * Reports current statistics to requesting user
+ *
+ * @param cmdparams
+ * cmdparams->av[0] = optionally LIST, DEL, COPY
+ *
+ * @return NS_SUCCESS if succeeds, else NS_FAILURE
+ */
-int ss_cmd_server (const CmdParams *cmdparams)
+int ss_cmd_server( const CmdParams *cmdparams )
{
SET_SEGV_LOCATION();
- if (!ircstrcasecmp (cmdparams->av[0], "LIST")) {
- return ss_cmd_server_list (cmdparams);
- } else if (!ircstrcasecmp (cmdparams->av[0], "DEL")) {
- return ss_server_del (cmdparams);
- } else if (!ircstrcasecmp (cmdparams->av[0], "COPY")) {
- return ss_server_copy (cmdparams);
- }
- return ss_cmd_server_stats (cmdparams);
+ if( !ircstrcasecmp( cmdparams->av[0], "LIST" ) )
+ return ss_cmd_server_list( cmdparams );
+ if( !ircstrcasecmp( cmdparams->av[0], "DEL" ) )
+ return ss_server_del( cmdparams );
+ if( !ircstrcasecmp( cmdparams->av[0], "COPY" ) )
+ return ss_server_copy( cmdparams );
+ return ss_cmd_server_stats( cmdparams );
}
-static void SaveServer (serverstat *ss)
+/** @brief SaveServer
+ *
+ * Save server stat
+ *
+ * @param ss pointer to server stat to save
+ *
+ * @return none
+ */
+
+static void SaveServer( serverstat *ss )
{
- dlog (DEBUG1, "Writing statistics to database for %s", ss->name);
- PreSaveStatistic (&ss->users);
- PreSaveStatistic (&ss->opers);
- PreSaveStatistic (&ss->operkills);
- PreSaveStatistic (&ss->serverkills);
- PreSaveStatistic (&ss->splits);
- DBAStore (SERVER_TABLE, ss->name, (void *)ss, sizeof (serverstat));
+ dlog( DEBUG1, "Writing statistics to database for %s", ss->name );
+ PreSaveStatistic( &ss->users );
+ PreSaveStatistic( &ss->opers );
+ PreSaveStatistic( &ss->operkills );
+ PreSaveStatistic( &ss->serverkills );
+ PreSaveStatistic( &ss->splits );
+ DBAStore( SERVER_TABLE, ss->name,( void * )ss, sizeof( serverstat ) );
}
-void SaveServerStats(void)
+/** @brief SaveServerStats
+ *
+ * Save server stats
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void SaveServerStats( void )
{
serverstat *ss;
hnode_t *sn;
hscan_t hs;
/* run through stats and save them */
- hash_scan_begin (&hs, serverstathash);
- while ((sn = hash_scan_next (&hs))) {
- ss = hnode_get (sn);
- SaveServer (ss);
+ hash_scan_begin( &hs, serverstathash );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ ss = hnode_get( sn );
+ SaveServer( ss );
}
}
-int LoadServerStats(const void *data, const int size)
+/** @brief LoadVersionStats
+ *
+ * Table load handler
+ *
+ * @param data pointer to table row data
+ * @param size of loaded data
+ *
+ * @return none
+ */
+
+int LoadServerStats( const void *data, const int size )
{
serverstat *ss;
- ss = ns_calloc (sizeof(serverstat));
- os_memcpy (ss, data, sizeof(serverstat));
- dlog (DEBUG1, "Loaded statistics for %ss", ss->name);
- hnode_create_insert (serverstathash, ss, ss->name);
- PostLoadStatistic (&ss->users);
- PostLoadStatistic (&ss->opers);
- PostLoadStatistic (&ss->operkills);
- PostLoadStatistic (&ss->serverkills);
- PostLoadStatistic (&ss->splits);
+ if( size != sizeof( serverstat ) )
+ {
+ nlog( LOG_CRITICAL, "server data size invalid" );
+ return NS_FALSE;
+ }
+ ss = ns_calloc( sizeof( serverstat ) );
+ os_memcpy( ss, data, sizeof( serverstat ) );
+ dlog( DEBUG1, "Loaded statistics for %ss", ss->name );
+ hnode_create_insert( serverstathash, ss, ss->name );
+ PostLoadStatistic( &ss->users );
+ PostLoadStatistic( &ss->opers );
+ PostLoadStatistic( &ss->operkills );
+ PostLoadStatistic( &ss->serverkills );
+ PostLoadStatistic( &ss->splits );
return NS_FALSE;
}
-int InitServerStats (void)
+/** @brief GetServerStats
+ *
+ * Walk through list passing each server to handler
+ *
+ * @param handler pointer to handler function
+ * @param v pointer to client to send to
+ *
+ * @return none
+ */
+
+void GetServerStats( const ServerStatHandler handler, const void *v )
+{
+ serverstat *ss;
+ hnode_t *sn;
+ hscan_t hs;
+
+ hash_scan_begin( &hs, serverstathash );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ ss = hnode_get( sn );
+ handler( ss, v );
+ }
+}
+
+/** @brief InitServerStats
+ *
+ * Init server stats
+ *
+ * @param none
+ *
+ * @return NS_SUCCESS on success, NS_FAILURE on failure
+ */
+
+int InitServerStats( void )
{
serverstathash = hash_create( -1, 0, 0 );
if( !serverstathash )
@@ -481,38 +740,35 @@
nlog( LOG_CRITICAL, "Unable to create server hash list" );
return NS_FAILURE;
}
- DBAFetchRows (SERVER_TABLE, LoadServerStats);
- GetServerList (AddServerStat, NULL);
+ DBAFetchRows( SERVER_TABLE, LoadServerStats );
+ GetServerList( AddServerStat, NULL );
return NS_SUCCESS;
}
-void FiniServerStats (void)
-{
- serverstat *ss;
- hnode_t *sn;
- hscan_t hs;
-
- SaveServerStats();
- hash_scan_begin (&hs, serverstathash);
- while ((sn = hash_scan_next (&hs))) {
- ss = hnode_get (sn);
- ClearServerModValue (ss->s);
- hash_scan_delete(serverstathash, sn);
- hnode_destroy(sn);
- ns_free (ss);
- }
- hash_destroy(serverstathash);
-}
+/** @brief FiniServerStats
+ *
+ * Fini server stats
+ *
+ * @param none
+ *
+ * @return none
+ */
-void GetServerStats (const ServerStatHandler handler, const void *v)
+void FiniServerStats( void )
{
serverstat *ss;
hnode_t *sn;
hscan_t hs;
- hash_scan_begin (&hs, serverstathash);
- while ((sn = hash_scan_next (&hs))) {
- ss = hnode_get (sn);
- handler (ss, v);
+ SaveServerStats();
+ hash_scan_begin( &hs, serverstathash );
+ while( ( sn = hash_scan_next( &hs ) ) )
+ {
+ ss = hnode_get( sn );
+ ClearServerModValue( ss->s );
+ hash_scan_delete( serverstathash, sn );
+ hnode_destroy( sn );
+ ns_free( ss );
}
+ hash_destroy( serverstathash );
}
Modified: trunk/modules/statserv/stats.c
==============================================================================
--- trunk/modules/statserv/stats.c (original)
+++ trunk/modules/statserv/stats.c Sat Aug 20 06:59:11 2005
@@ -32,86 +32,148 @@
#include "version.h"
#include "tld.h"
-#define WEEKNUM(t) (((t)->tm_yday + 7 - ((t)->tm_wday)) / 7)
+/** macro to calculate week number from time */
+#define WEEKNUM( t )( ( ( t )->tm_yday + 7 -( ( t )->tm_wday ) ) / 7 )
-void PreSaveStatistic (statistic *stat)
+/** @brief PreSaveStatistic
+ *
+ * Update statistic time prior to save
+ *
+ * @param stat pointer to stat to update
+ *
+ * @return none
+ */
+
+void PreSaveStatistic( statistic *stat )
{
struct tm *ltm;
- ltm = localtime (&me.now);
+ ltm = localtime( &me.now );
stat->month = ltm->tm_mon;
- stat->week = WEEKNUM(ltm);
+ stat->week = WEEKNUM( ltm );
stat->day = ltm->tm_yday;
}
-void PostLoadStatistic (statistic *stat)
+/** @brief PostLoadStatistic
+ *
+ * Update statistic based on time post load
+ *
+ * @param stat pointer to stat to update
+ *
+ * @return none
+ */
+
+void PostLoadStatistic( statistic *stat )
{
struct tm *ltm;
- ltm = localtime (&me.now);
+ ltm = localtime( &me.now );
stat->current = 0;
- if (stat->day != ltm->tm_yday) {
- ResetStatisticEntry (&stat->daily, stat->current);
- }
+ if( stat->day != ltm->tm_yday )
+ ResetStatisticEntry( &stat->daily, stat->current );
/* Only load weekly stats if week not changed */
- if (stat->week != WEEKNUM(ltm)) {
- ResetStatisticEntry (&stat->weekly, stat->current);
- }
+ if( stat->week != WEEKNUM( ltm ) )
+ ResetStatisticEntry( &stat->weekly, stat->current );
/* Only load monthly stats if month not changed */
- if (stat->month != ltm->tm_mon) {
- ResetStatisticEntry (&stat->monthly, stat->current);
- }
+ if( stat->month != ltm->tm_mon )
+ ResetStatisticEntry( &stat->monthly, stat->current );
}
-void AverageStatisticEntry (statisticentry *stat, unsigned int current)
-{
- stat->average = (stat->max + current) / 2;
-}
+/** @brief AverageStatisticEntry
+ *
+ * Average statistic entry
+ *
+ * @param stat pointer to stat to update
+ * @param current value on network
+ *
+ * @return none
+ */
+
+void AverageStatisticEntry( statisticentry *stat, unsigned int current )
+{
+ stat->average =( stat->max + current ) / 2;
+}
+
+/** @brief AverageStatistic
+ *
+ * Average statistic
+ *
+ * @param stat pointer to stat to update
+ *
+ * @return none
+ */
+
+void AverageStatistic( statistic *stat )
+{
+ AverageStatisticEntry( &stat->daily, stat->current );
+ AverageStatisticEntry( &stat->weekly, stat->current );
+ AverageStatisticEntry( &stat->monthly, stat->current );
+ AverageStatisticEntry( &stat->alltime, stat->current );
+}
+
+/** @brief ResetStatisticEntry
+ *
+ * Reset statistic entry
+ *
+ * @param stat pointer to stat to update
+ * @param current value on network
+ *
+ * @return none
+ */
-void AverageStatistic (statistic *stat)
-{
- AverageStatisticEntry (&stat->daily, stat->current);
- AverageStatisticEntry (&stat->weekly, stat->current);
- AverageStatisticEntry (&stat->monthly, stat->current);
- AverageStatisticEntry (&stat->alltime, stat->current);
-}
-
-void ResetStatisticEntry (statisticentry *stat, unsigned int current)
+void ResetStatisticEntry( statisticentry *stat, unsigned int current )
{
stat->runningtotal = current;
stat->max = current;
stat->ts_max = me.now;
}
-void ResetStatistic (statistic *stat)
-{
- struct tm *ts = gmtime(&me.now);
-
- /* Reset daily on first hour of day (i.e. midnight) */
- if (ts->tm_hour == 0) {
- ResetStatisticEntry (&stat->daily, stat->current);
- }
+/** @brief ResetStatistic
+ *
+ * Reset statistic
+ *
+ * @param stat pointer to stat to update
+ * @param current value on network
+ *
+ * @return none
+ */
+
+void ResetStatistic( statistic *stat )
+{
+ struct tm *ts = gmtime( &me.now );
+
+ /* Reset daily on first hour of day( i.e. midnight ) */
+ if( ts->tm_hour == 0 )
+ ResetStatisticEntry( &stat->daily, stat->current );
/* Reset weekly on first day of week */
- if (ts->tm_wday == 0) {
- ResetStatisticEntry (&stat->weekly, stat->current);
- }
+ if( ts->tm_wday == 0 )
+ ResetStatisticEntry( &stat->weekly, stat->current );
/* Reset monthly on first day of month */
- if (ts->tm_mday == 1) {
- ResetStatisticEntry (&stat->monthly, stat->current);
- }
+ if( ts->tm_mday == 1 )
+ ResetStatisticEntry( &stat->monthly, stat->current );
}
-int IncStatisticEntry (statisticentry *stat, unsigned int current)
+/** @brief IncStatisticEntry
+ *
+ * increment statistic entry
+ *
+ * @param stat pointer to stat to update
+ * @param current value on network
+ *
+ * @return none
+ */
+
+int IncStatisticEntry( statisticentry *stat, unsigned int current )
{
int isrecord = 0;
- if (current > stat->max)
+ if( current > stat->max )
{
stat->max = current;
stat->ts_max = me.now;
isrecord = 1;
}
- else if (current == stat->max)
+ else if( current == stat->max )
{
stat->ts_max = me.now;
}
@@ -119,48 +181,86 @@
return isrecord;
}
-int IncStatistic (statistic *stat)
+/** @brief IncStatistic
+ *
+ * increment statistic
+ *
+ * @param stat pointer to stat to update
+ *
+ * @return none
+ */
+
+int IncStatistic( statistic *stat )
{
stat->current++;
- IncStatisticEntry (&stat->daily, stat->current);
- IncStatisticEntry (&stat->weekly, stat->current);
- IncStatisticEntry (&stat->monthly, stat->current);
- return IncStatisticEntry (&stat->alltime, stat->current);
-}
+ IncStatisticEntry( &stat->daily, stat->current );
+ IncStatisticEntry( &stat->weekly, stat->current );
+ IncStatisticEntry( &stat->monthly, stat->current );
+ return IncStatisticEntry( &stat->alltime, stat->current );
+}
+
+/** @brief DecStatistic
+ *
+ * decrement statistic
+ *
+ * @param stat pointer to stat to update
+ *
+ * @return none
+ */
-void DecStatistic (statistic *stat)
+void DecStatistic( statistic *stat )
{
- if (stat->current > 0) {
+ if( stat->current > 0 )
stat->current--;
- }
}
-int SetStatisticEntry (statisticentry *stat, unsigned int current, int diff)
+/** @brief SetStatisticEntry
+ *
+ * set statistic entry
+ *
+ * @param stat pointer to stat to update
+ * @param current value on network
+ * @param diff between stored and current
+ *
+ * @return none
+ */
+
+int SetStatisticEntry( statisticentry *stat, unsigned int current, int diff )
{
int isrecord = 0;
- if (current > stat->max)
+ if( current > stat->max )
{
stat->max = current;
stat->ts_max = me.now;
isrecord = 1;
}
- else if (current == stat->max)
+ else if( current == stat->max )
{
stat->ts_max = me.now;
}
/* Only adjust running total if diff is > 0 */
- if (diff > 0) {
+ if( diff > 0 )
stat->runningtotal += diff;
- }
return isrecord;
}
-int SetStatistic (statistic *stat, int current)
+/** @brief SetStatistic
+ *
+ * set statistic
+ *
+ * @param stat pointer to stat to update
+ * @param current value on network
+ *
+ * @return none
+ */
+
+int SetStatistic( statistic *stat, int current )
{
int diff = 0;
- if (current != stat->current) {
+ if( current != stat->current )
+ {
/* Subtract this way so that diff is the correct sign for a
* later add to running total. I.e.
* current > stat->current : +ve
@@ -170,115 +270,219 @@
diff = current - stat->current;
stat->current = current;
}
- SetStatisticEntry (&stat->daily, stat->current, diff);
- SetStatisticEntry (&stat->weekly, stat->current, diff);
- SetStatisticEntry (&stat->monthly, stat->current, diff);
- return SetStatisticEntry (&stat->alltime, stat->current, diff);
-}
+ SetStatisticEntry( &stat->daily, stat->current, diff );
+ SetStatisticEntry( &stat->weekly, stat->current, diff );
+ SetStatisticEntry( &stat->monthly, stat->current, diff );
+ return SetStatisticEntry( &stat->alltime, stat->current, diff );
+}
+
+/** @brief check_interval
+ *
+ * check interval between announcements
+ *
+ * @param none
+ *
+ * @return NS_TRUE if OK else NS_FALSE
+ */
-static int check_interval()
+static int check_interval( void )
{
static time_t lasttime;
static int count;
- if (!IsModuleSynched()) {
- return -1;
+ if( !IsModuleSynched() )
+ return NS_FALSE;
+ if( ( me.now - lasttime ) < StatServ.msginterval )
+ {
+ if( ++count > StatServ.msglimit )
+ return NS_FALSE;
}
- if ((me.now - lasttime) < StatServ.msginterval ) {
- if (++count > StatServ.msglimit)
- return -1;
- } else {
+ else
+ {
lasttime = me.now;
count = 0;
}
- return NS_SUCCESS;
+ return NS_TRUE;
}
-static void
-announce(int announcetype, const char *msg)
+/** @brief announce
+ *
+ * Make announcement of selected type
+ *
+ * @param announcetype type of announcement
+ * @param msg to send
+ *
+ * @return none
+ */
+
+static void announce( int announcetype, const char *msg )
{
- switch(announcetype) {
+ switch( announcetype )
+ {
case 3:
- irc_wallops (ss_bot, "%s", msg);
+ irc_wallops( ss_bot, "%s", msg );
break;
case 2:
- irc_globops (ss_bot, "%s", msg);
+ irc_globops( ss_bot, "%s", msg );
break;
case 1:
default:
- irc_chanalert (ss_bot, "%s", msg);
+ irc_chanalert( ss_bot, "%s", msg );
break;
}
}
-void
-announce_record (const char *msg, ...)
+/** @brief announce_record
+ *
+ * Make announcement
+ *
+ * @param msg to send
+ *
+ * @return none
+ */
+
+void announce_record( const char *msg, ... )
{
static char announce_buf[BUFSIZE];
va_list ap;
- if(StatServ.recordalert <= 0 || check_interval() < 0) {
+ if( StatServ.recordalert <= 0 || check_interval() < 0 )
return;
- }
- va_start (ap, msg);
- ircvsnprintf (announce_buf, BUFSIZE, msg, ap);
- va_end (ap);
- announce(StatServ.recordalert, announce_buf);
-}
+ va_start( ap, msg );
+ ircvsnprintf( announce_buf, BUFSIZE, msg, ap );
+ va_end( ap );
+ announce( StatServ.recordalert, announce_buf );
+}
+
+/** @brief announce_lag
+ *
+ * Make announcement
+ *
+ * @param msg to send
+ *
+ * @return none
+ */
-void
-announce_lag(const char *msg, ...)
+void announce_lag( const char *msg, ... )
{
static char announce_buf[BUFSIZE];
va_list ap;
- if(StatServ.lagalert <= 0 || check_interval() < 0) {
+ if( StatServ.lagalert <= 0 || check_interval() < 0 )
return;
- }
- va_start (ap, msg);
- ircvsnprintf (announce_buf, BUFSIZE, msg, ap);
- va_end (ap);
- announce(StatServ.lagalert, announce_buf);
-}
+ va_start( ap, msg );
+ ircvsnprintf( announce_buf, BUFSIZE, msg, ap );
+ va_end( ap );
+ announce( StatServ.lagalert, announce_buf );
+}
+
+/** @brief ResetStatisticsTimer
+ *
+ * Timer handler for rest of statistics
+ *
+ * @param none
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
-int ResetStatistics (void *userptr)
+int ResetStatisticsTimer( void *userptr )
{
SET_SEGV_LOCATION();
- dlog (DEBUG1, "Reset Statistics");
- ResetNetworkStatistics ();
- ResetServerStatistics ();
- ResetChannelStatistics ();
- ResetTLDStatistics ();
+ dlog( DEBUG1, "Reset Statistics" );
+ ResetNetworkStatistics();
+ ResetServerStatistics();
+ ResetChannelStatistics();
+ ResetTLDStatistics();
return NS_SUCCESS;
}
-int AverageStatistics (void *userptr)
+/** @brief AverageStatistics
+ *
+ * Average of statistics
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+void AverageStatistics( void )
+{
+ SET_SEGV_LOCATION();
+ dlog( DEBUG1, "Average Statistics" );
+ AverageNetworkStatistics();
+ AverageServerStatistics();
+ AverageChannelStatistics();
+ AverageTLDStatistics();
+}
+
+/** @brief AverageStatisticsTimer
+ *
+ * Timer handler for average of statistics
+ *
+ * @param none
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+int AverageStatisticsTimer( void *userptr )
{
SET_SEGV_LOCATION();
- dlog (DEBUG1, "Average Statistics");
- AverageNetworkStatistics ();
- AverageServerStatistics ();
- AverageChannelStatistics ();
- AverageTLDStatistics ();
+ AverageStatistics();
return NS_SUCCESS;
}
-int GetAllTimePercent (statistic *stat)
+/** @brief GetAllTimePercent
+ *
+ * Generate all time stat percent
+ *
+ * @param stat pointer to stat to calculate
+ *
+ * @return percent
+ */
+
+int GetAllTimePercent( statistic *stat )
{
- return (int)(((float) stat->current / (float) stat->alltime.max) * 100);
+ return( int )( ( ( float ) stat->current / ( float ) stat->alltime.max ) * 100 );
}
-int GetDailyPercent (statistic *stat)
+/** @brief GetDailyPercent
+ *
+ * Generate daily percent
+ *
+ * @param stat pointer to stat to calculate
+ *
+ * @return percent
+ */
+
+int GetDailyPercent( statistic *stat )
{
- return (int)(((float) stat->current / (float) stat->daily.max) * 100);
+ return( int )( ( ( float ) stat->current / ( float ) stat->daily.max ) * 100 );
}
-int GetWeeklyPercent (statistic *stat)
+/** @brief GetWeeklyPercent
+ *
+ * Generate weekly stat percent
+ *
+ * @param stat pointer to stat to calculate
+ *
+ * @return percent
+ */
+
+int GetWeeklyPercent( statistic *stat )
{
- return (int)(((float) stat->current / (float) stat->weekly.max) * 100);
+ return( int )( ( ( float ) stat->current / ( float ) stat->weekly.max ) * 100 );
}
-int GetMonthlyPercent (statistic *stat)
+/** @brief GetMonthlyPercent
+ *
+ * Generate monthly stat percent
+ *
+ * @param stat pointer to stat to calculate
+ *
+ * @return percent
+ */
+
+int GetMonthlyPercent( statistic *stat )
{
- return (int)(((float) stat->current / (float) stat->monthly.max) * 100);
+ return( int )( ( ( float ) stat->current / ( float ) stat->monthly.max ) * 100 );
}
Modified: trunk/modules/statserv/stats.h
==============================================================================
--- trunk/modules/statserv/stats.h (original)
+++ trunk/modules/statserv/stats.h Sat Aug 20 06:59:11 2005
@@ -44,10 +44,11 @@
void AverageStatisticEntry( statisticentry *stat, unsigned int current );
void AverageStatistic( statistic *stat );
-int AverageStatistics( void *v );
+int AverageStatisticsTimer( void *v );
+void AverageStatistics( void );
void ResetStatisticEntry( statisticentry *stat, unsigned int current );
void ResetStatistic( statistic *stat );
-int ResetStatistics( void *v );
+int ResetStatisticsTimer( void *v );
int IncStatisticEntry( statisticentry *stat, unsigned int current );
int IncStatistic( statistic *stat );
void DecStatisticEntry( statisticentry *stat, unsigned int current );
Modified: trunk/modules/statserv/statserv.c
==============================================================================
--- trunk/modules/statserv/statserv.c (original)
+++ trunk/modules/statserv/statserv.c Sat Aug 20 06:59:11 2005
@@ -39,10 +39,11 @@
#include "tld.h"
#include "htmlstats.h"
-static int ss_set_htmltime_cb (CmdParams *cmdparams, SET_REASON reason);
-static int ss_set_exclusions_cb (CmdParams *cmdparams, SET_REASON reason);
-static int ss_set_html_cb (CmdParams *cmdparams, SET_REASON reason);
-static int ss_set_htmlpath_cb (CmdParams *cmdparams, SET_REASON reason);
+/** SET callback prototypes */
+static int ss_set_htmltime_cb( CmdParams *cmdparams, SET_REASON reason );
+static int ss_set_exclusions_cb( CmdParams *cmdparams, SET_REASON reason );
+static int ss_set_html_cb( CmdParams *cmdparams, SET_REASON reason );
+static int ss_set_htmlpath_cb( CmdParams *cmdparams, SET_REASON reason );
/** Bot pointer */
Bot *ss_bot;
@@ -108,17 +109,17 @@
/** Bot setting table */
static bot_setting ss_settings[]=
{
- {"HTML", &StatServ.html, SET_TYPE_BOOLEAN, 0, 0, NS_ULEVEL_ADMIN, NULL, ss_help_set_html, ss_set_html_cb, (void *)0},
- {"HTMLPATH", &StatServ.htmlpath, SET_TYPE_STRING, 0, MAXPATH, NS_ULEVEL_ADMIN, NULL, ss_help_set_htmlpath, ss_set_htmlpath_cb, (void *)""},
- {"HTMLTIME", &StatServ.htmltime, SET_TYPE_INT, 600, TS_ONE_HOUR, NS_ULEVEL_ADMIN, "seconds", ss_help_set_htmltime, ss_set_htmltime_cb, (void*)TS_ONE_HOUR},
- {"CHANNELTIME", &StatServ.channeltime, SET_TYPE_INT, TS_ONE_DAY, 18144000,NS_ULEVEL_ADMIN, "seconds", ss_help_set_channeltime, NULL, (void*)604800},
- {"MSGINTERVAL", &StatServ.msginterval, SET_TYPE_INT, 1, 99, NS_ULEVEL_ADMIN, "seconds", ss_help_set_msginterval, NULL, (void *)TS_ONE_MINUTE},
- {"MSGLIMIT", &StatServ.msglimit, SET_TYPE_INT, 1, 99, NS_ULEVEL_ADMIN, NULL, ss_help_set_msglimit, NULL, (void *)5},
- {"LAGTIME", &StatServ.lagtime, SET_TYPE_INT, 1, 256, NS_ULEVEL_ADMIN, "seconds", ss_help_set_lagtime, NULL, (void *)30},
- {"LAGALERT", &StatServ.lagalert, SET_TYPE_INT, 0, 3, NS_ULEVEL_ADMIN, NULL, ss_help_set_lagalert, NULL, (void *)1},
- {"RECORDALERT", &StatServ.recordalert, SET_TYPE_INT, 0, 3, NS_ULEVEL_ADMIN, NULL, ss_help_set_recordalert, NULL, (void *)1},
- {"EXCLUSIONS", &StatServ.exclusions, SET_TYPE_BOOLEAN, 0, 0, NS_ULEVEL_ADMIN, NULL, ss_help_set_exclusions, ss_set_exclusions_cb, (void *)0},
- {"FLATMAP", &StatServ.flatmap, SET_TYPE_BOOLEAN, 0, 0, NS_ULEVEL_ADMIN, NULL, ss_help_set_flatmap, NULL, (void *)0},
+ {"HTML", &StatServ.html, SET_TYPE_BOOLEAN, 0, 0, NS_ULEVEL_ADMIN, NULL, ss_help_set_html, ss_set_html_cb,( void * )0},
+ {"HTMLPATH", &StatServ.htmlpath, SET_TYPE_STRING, 0, MAXPATH, NS_ULEVEL_ADMIN, NULL, ss_help_set_htmlpath, ss_set_htmlpath_cb,( void * )""},
+ {"HTMLTIME", &StatServ.htmltime, SET_TYPE_INT, 600, TS_ONE_HOUR, NS_ULEVEL_ADMIN, "seconds", ss_help_set_htmltime, ss_set_htmltime_cb,( void* )TS_ONE_HOUR},
+ {"CHANNELTIME", &StatServ.channeltime, SET_TYPE_INT, TS_ONE_DAY, 18144000,NS_ULEVEL_ADMIN, "seconds", ss_help_set_channeltime, NULL,( void* )604800},
+ {"MSGINTERVAL", &StatServ.msginterval, SET_TYPE_INT, 1, 99, NS_ULEVEL_ADMIN, "seconds", ss_help_set_msginterval, NULL,( void * )TS_ONE_MINUTE},
+ {"MSGLIMIT", &StatServ.msglimit, SET_TYPE_INT, 1, 99, NS_ULEVEL_ADMIN, NULL, ss_help_set_msglimit, NULL,( void * )5},
+ {"LAGTIME", &StatServ.lagtime, SET_TYPE_INT, 1, 256, NS_ULEVEL_ADMIN, "seconds", ss_help_set_lagtime, NULL,( void * )30},
+ {"LAGALERT", &StatServ.lagalert, SET_TYPE_INT, 0, 3, NS_ULEVEL_ADMIN, NULL, ss_help_set_lagalert, NULL,( void * )1},
+ {"RECORDALERT", &StatServ.recordalert, SET_TYPE_INT, 0, 3, NS_ULEVEL_ADMIN, NULL, ss_help_set_recordalert, NULL,( void * )1},
+ {"EXCLUSIONS", &StatServ.exclusions, SET_TYPE_BOOLEAN, 0, 0, NS_ULEVEL_ADMIN, NULL, ss_help_set_exclusions, ss_set_exclusions_cb,( void * )0},
+ {"FLATMAP", &StatServ.flatmap, SET_TYPE_BOOLEAN, 0, 0, NS_ULEVEL_ADMIN, NULL, ss_help_set_flatmap, NULL,( void * )0},
NS_SETTING_END()
};
@@ -135,12 +136,21 @@
ss_settings,
};
-int SaveStats(void *userptr)
+/** @brief SaveStatsTimer
+ *
+ * Save stats timer handler
+ *
+ * @param none
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+int SaveStatsTimer( void *userptr )
{
SET_SEGV_LOCATION();
- SaveServerStats ();
- SaveChanStats ();
- SaveNetworkStats ();
+ SaveServerStats();
+ SaveChanStats();
+ SaveNetworkStats();
return NS_SUCCESS;
}
@@ -160,7 +170,7 @@
ModuleConfig( ss_settings );
if( StatServ.html && StatServ.htmlpath[0] == 0 )
{
- nlog(LOG_NOTICE, "HTML stats disabled as HTML_PATH is not set");
+ nlog( LOG_NOTICE, "HTML stats disabled as HTML_PATH is not set" );
StatServ.html = 0;
}
InitNetworkStats();
@@ -186,30 +196,31 @@
* @return NS_SUCCESS if suceeds else NS_FAILURE
*/
-int ModSynch (void)
+int ModSynch( void )
{
SET_SEGV_LOCATION();
/* RTA init must be in synch since core does not start
RTA during the init cycle when NeoStats first boots */
- ss_bot = AddBot (&ss_botinfo);
- if (!ss_bot)
+ ss_bot = AddBot( &ss_botinfo );
+ if( !ss_bot )
return NS_FAILURE;
/* Timer to save the database */
- AddTimer (TIMER_TYPE_INTERVAL, SaveStats, "SaveStats", DBSAVETIME, NULL);
+ AddTimer( TIMER_TYPE_INTERVAL, SaveStatsTimer, "SaveStatsTimer", DBSAVETIME, NULL );
/* Timer to output html */
- if (StatServ.html) {
- AddTimer (TIMER_TYPE_INTERVAL, ss_html, "ss_html", StatServ.htmltime, NULL);
+ if( StatServ.html )
+ {
+ AddTimer( TIMER_TYPE_INTERVAL, HTMLOutputTimer, "HTMLOutputTimer", StatServ.htmltime, NULL );
/* Initial output at load */
- ss_html ( NULL );
+ HTMLOutput();
}
/* Timer to reset timeslice stats */
- AddTimer (TIMER_TYPE_MIDNIGHT, ResetStatistics, "ResetStatistics", 0, NULL);
+ AddTimer( TIMER_TYPE_MIDNIGHT, ResetStatisticsTimer, "ResetStatisticsTimer", 0, NULL );
/* Timer to average stats */
- AddTimer (TIMER_TYPE_INTERVAL, AverageStatistics, "AverageStatistics", TS_ONE_HOUR, NULL);
+ AddTimer( TIMER_TYPE_INTERVAL, AverageStatisticsTimer, "AverageStatisticsTimer", TS_ONE_HOUR, NULL );
/* Initial average at load */
- AverageStatistics( NULL );
+ AverageStatistics();
/* Timer to delete old channels */
- AddTimer (TIMER_TYPE_INTERVAL, DelOldChan, "DelOldChan", TS_ONE_HOUR, NULL);
+ AddTimer( TIMER_TYPE_INTERVAL, DelOldChanTimer, "DelOldChanTimer", TS_ONE_HOUR, NULL );
return NS_SUCCESS;
}
@@ -222,7 +233,7 @@
* @return NS_SUCCESS if suceeds else NS_FAILURE
*/
-int ModFini (void)
+int ModFini( void )
{
StatServ.shutdown = 1;
FiniServerStats();
@@ -233,57 +244,102 @@
return NS_SUCCESS;
}
-static int ss_set_html_cb (CmdParams *cmdparams, SET_REASON reason)
+/** @brief ss_set_html_cb
+ *
+ * Set callback for SET HTML
+ * Enable or disable html output
+ *
+ * @cmdparams pointer to commands param struct
+ * @cmdparams reason for SET
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+static int ss_set_html_cb( CmdParams *cmdparams, SET_REASON reason )
{
if( reason == SET_CHANGE )
{
- if (StatServ.html && StatServ.htmlpath[0] == 0) {
- irc_prefmsg (ss_bot, cmdparams->source,
- "You need to SET HTMLPATH. HTML output disabled.");
+ if( StatServ.html && StatServ.htmlpath[0] == 0 )
+ {
+ irc_prefmsg ( ss_bot, cmdparams->source,
+ "You need to SET HTMLPATH. HTML output disabled." );
StatServ.html = 0;
return NS_SUCCESS;
}
- if (StatServ.html) {
- AddTimer (TIMER_TYPE_INTERVAL, ss_html, "ss_html", StatServ.htmltime, NULL);
- } else {
- DelTimer ("ss_html");
- }
+ if( StatServ.html )
+ AddTimer( TIMER_TYPE_INTERVAL, HTMLOutputTimer, "HTMLOutputTimer", StatServ.htmltime, NULL );
+ else
+ DelTimer( "HTMLOutputTimer" );
}
return NS_SUCCESS;
}
-static int ss_set_htmlpath_cb (CmdParams *cmdparams, SET_REASON reason)
+/** @brief ss_set_htmlpath_cb
+ *
+ * Set callback for SET HTMLPATH
+ * Change html output path
+ *
+ * @cmdparams pointer to commands param struct
+ * @cmdparams reason for SET
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+static int ss_set_htmlpath_cb( CmdParams *cmdparams, SET_REASON reason )
{
FILE *opf;
if( reason == SET_CHANGE )
{
- opf = os_fopen (StatServ.htmlpath, "wt");
- if (!opf) {
- irc_prefmsg (ss_bot, cmdparams->source,
- "Failed to open HTML output file %s. Check file permissions. HTML output disabled.", StatServ.htmlpath);
+ opf = os_fopen( StatServ.htmlpath, "wt" );
+ if( !opf )
+ {
+ irc_prefmsg( ss_bot, cmdparams->source,
+ "Failed to open HTML output file %s. Check file permissions. HTML output disabled.", StatServ.htmlpath );
return NS_SUCCESS;
}
- os_fclose (opf);
- ss_html (NULL);
+ os_fclose( opf );
+ HTMLOutput();
}
return NS_SUCCESS;
}
-static int ss_set_htmltime_cb (CmdParams *cmdparams, SET_REASON reason)
+/** @brief ss_set_htmltime_cb
+ *
+ * Set callback for SET HTMLTIME
+ * Change html output time
+ *
+ * @cmdparams pointer to commands param struct
+ * @cmdparams reason for SET
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+static int ss_set_htmltime_cb( CmdParams *cmdparams, SET_REASON reason )
{
if( reason == SET_CHANGE )
{
- SetTimerInterval ("ss_html", StatServ.htmltime);
+ SetTimerInterval( "HTMLOutputTimer", StatServ.htmltime );
}
return NS_SUCCESS;
}
-static int ss_set_exclusions_cb (CmdParams *cmdparams, SET_REASON reason)
+/** @brief ss_set_exclusions_cb
+ *
+ * Set callback for exclusions
+ * Enable or disable exclude event flag
+ *
+ * @cmdparams pointer to commands param struct
+ * @cmdparams reason for SET
+ *
+ * @return NS_SUCCESS if suceeds else NS_FAILURE
+ */
+
+static int ss_set_exclusions_cb( CmdParams *cmdparams, SET_REASON reason )
{
if( reason == SET_LOAD || reason == SET_CHANGE )
{
- SetAllEventFlags (EVENT_FLAG_USE_EXCLUDE, StatServ.exclusions);
+ SetAllEventFlags( EVENT_FLAG_USE_EXCLUDE, StatServ.exclusions );
}
return NS_SUCCESS;
}
Modified: trunk/modules/statserv/tld.c
==============================================================================
--- trunk/modules/statserv/tld.c (original)
+++ trunk/modules/statserv/tld.c Sat Aug 20 06:59:11 2005
@@ -35,9 +35,12 @@
#include "GeoIP.h"
#include "GeoIPCity.h"
+/** TLD table name */
#define TLD_TABLE "TLD"
+/** Unknown entry */
#define UNKNOWN_COUNTRY_CODE "???"
+/** TLD list */
static list_t *tldstatlist;
static GeoIP *gi;
@@ -56,12 +59,15 @@
TLD *t;
tn = list_first( tldstatlist );
- while( tn != NULL ) {
+ while( tn != NULL )
+ {
t = lnode_get( tn );
ResetStatistic( &t->users );
- if( t->users.current == 0 ) {
+ if( t->users.current == 0 )
+ {
/* don't delete the tld entry ??? as its our "unknown" entry */
- if( ircstrcasecmp( t->tld, UNKNOWN_COUNTRY_CODE ) ) {
+ if( ircstrcasecmp( t->tld, UNKNOWN_COUNTRY_CODE ) )
+ {
tn2 = list_next( tldstatlist, tn );
ns_free( t );
list_delete( tldstatlist, tn );
@@ -259,6 +265,20 @@
return NS_SUCCESS;
}
+/** @brief SaveTLDStat
+ *
+ * Save TLD stat
+ *
+ * @param none
+ *
+ * @return none
+ */
+
+static void SaveTLDStat( const TLD *tld, const void *v )
+{
+ DBAStore( TLD_TABLE, tld->tld, ( void * )v, sizeof( TLD ) );
+}
+
/** @brief SaveTLDStats
*
* Save TLD stats
@@ -270,16 +290,7 @@
void SaveTLDStats( void )
{
- lnode_t *tn;
- TLD *t;
-
- tn = list_first( tldstatlist );
- while( tn != NULL )
- {
- t = lnode_get( tn );
- DBAStore( TLD_TABLE, t->tld, ( void * )t, sizeof( TLD ) );
- tn = list_next( tldstatlist, tn );
- }
+ GetTLDStats( SaveTLDStat, NULL );
}
/** @brief new_tld
Modified: trunk/modules/statserv/user.c
==============================================================================
--- trunk/modules/statserv/user.c (original)
+++ trunk/modules/statserv/user.c Sat Aug 20 06:59:11 2005
@@ -85,12 +85,15 @@
SET_SEGV_LOCATION();
ss = GetServerModValue( cmdparams->source->uplink );
- if( !ss ) {
+ if( !ss )
+ {
nlog( LOG_WARNING, "Unable to find stats for %s", cmdparams->source->uplink->name );
return NS_SUCCESS;
}
- while( *modes ) {
- switch( *modes ) {
+ while( *modes )
+ {
+ switch( *modes )
+ {
case '+':
add = 1;
break;
@@ -99,12 +102,16 @@
break;
case 'O':
case 'o':
- if( add ) {
+ if( add )
+ {
dlog( DEBUG1, "Increasing OperCount for %s", ss->name );
AddNetworkOper();
AddServerOper( cmdparams->source );
- } else {
- if( IsOper( cmdparams->source ) ) {
+ }
+ else
+ {
+ if( IsOper( cmdparams->source ) )
+ {
dlog( DEBUG1, "Decreasing OperCount for %s", ss->name );
DelNetworkOper();
DelServerOper( cmdparams->source );
@@ -210,10 +217,13 @@
return NS_FALSE;
if( operlistaway && IsAway( u ) )
return NS_FALSE;
- if( !operlistserver ) {
+ if( !operlistserver )
+ {
irc_prefmsg( ss_bot, listu, "%-15s %-15s %-10d",
u->name, u->uplink->name, UserLevel( u ) );
- } else {
+ }
+ else
+ {
if( ircstrcasecmp( operlistserver, u->uplink->name ) )
return NS_FALSE;
irc_prefmsg( ss_bot, listu, "%-15s %-15s %-10d",
@@ -239,21 +249,25 @@
SET_SEGV_LOCATION();
operlistaway = 0;
operlistserver = NULL;
- if( cmdparams->ac == 0 ) {
+ if( cmdparams->ac == 0 )
+ {
irc_prefmsg( ss_bot, cmdparams->source, "Online IRCops:" );
irc_prefmsg( ss_bot, cmdparams->source, "ID %-15s %-15s %-10s",
"Nick", "Server", "Level" );
}
- if( cmdparams->ac != 0 ) {
+ if( cmdparams->ac != 0 )
+ {
flags = cmdparams->av[0];
operlistserver = cmdparams->av[1];
}
- if( flags && !ircstrcasecmp( flags, "NOAWAY" ) ) {
+ if( flags && !ircstrcasecmp( flags, "NOAWAY" ) )
+ {
operlistaway = 1;
flags = NULL;
irc_prefmsg( ss_bot, cmdparams->source, "Online IRCops( not away ):" );
}
- if( !operlistaway && flags && strchr( flags, '.' ) ) {
+ if( !operlistaway && flags && strchr( flags, '.' ) )
+ {
operlistserver = flags;
irc_prefmsg( ss_bot, cmdparams->source, "Online IRCops on server %s", operlistserver );
}
@@ -278,9 +292,8 @@
Client *listu;
listu = ( Client * )v;
- if IsBot( u ) {
+ if IsBot( u )
irc_prefmsg( ss_bot, listu, "%-15s %s", u->name, u->uplink->name );
- }
return NS_FALSE;
}
Modified: trunk/modules/statserv/version.c
==============================================================================
--- trunk/modules/statserv/version.c (original)
+++ trunk/modules/statserv/version.c Sat Aug 20 06:59:11 2005
@@ -26,8 +26,10 @@
#include "stats.h"
#include "version.h"
+/** CTCP version table name */
#define CTCPVERSION_TABLE "CTCPVERSION"
+/** Client version list */
static list_t *ctcp_version_list;
/** @brief topcurrentversions
@@ -68,6 +70,20 @@
return cv;
}
+/** @brief SaveClientVersion
+ *
+ * Save client version stat
+ *
+ * @param none
+ *
+ * @return none
+ */
+static void SaveClientVersion( const ss_ctcp_version *cv, const void *v )
+{
+ DBAStore( CTCPVERSION_TABLE, cv->name,( void *)cv, sizeof( ss_ctcp_version));
+ dlog( DEBUG2, "Save version %s", cv->name );
+}
+
/** @brief SaveClientVersions
*
* Save client version stats
@@ -79,17 +95,7 @@
static void SaveClientVersions( void )
{
- ss_ctcp_version *cv;
- lnode_t *cn;
-
- cn = list_first( ctcp_version_list );
- while( cn != NULL )
- {
- cv = ( ss_ctcp_version * ) lnode_get( cn );
- DBAStore( CTCPVERSION_TABLE, cv->name,( void *)cv, sizeof( ss_ctcp_version));
- dlog( DEBUG2, "Save version %s", cv->name );
- cn = list_next( ctcp_version_list, cn );
- }
+ GetClientStats( SaveClientVersion, -1, NULL );
}
/** @brief new_ctcpversion
@@ -161,17 +167,20 @@
{
ss_ctcp_version *cv;
lnode_t *cn;
- int i;
+ int count = 0;
if( !list_is_sorted( ctcp_version_list, topcurrentversions ) )
list_sort( ctcp_version_list, topcurrentversions );
cn = list_first( ctcp_version_list );
- for( i = 0; i < limit && cn; i++ )
+ while( cn != NULL )
{
- cv = lnode_get( cn );
+ cv = ( ss_ctcp_version * ) lnode_get( cn );
handler( cv, v );
cn = list_next( ctcp_version_list, cn );
+ if( limit != -1 && count >= limit )
+ break;
}
+
}
/** @brief ss_cmd_ctcpversion
Modified: trunk/src/nsdba.c
==============================================================================
--- trunk/src/nsdba.c (original)
+++ trunk/src/nsdba.c Sat Aug 20 06:59:11 2005
@@ -47,10 +47,10 @@
static void *( *DBMOpenTable )( const char *name );
static int ( *DBMCloseTable )( void *handle );
-static int ( *DBMGetData )( void *handle, char *key, void *data, int size );
-static int ( *DBMSetData )( void *handle, char *key, void *data, int size );
+static int ( *DBMGetData )( void *handle, const char *key, void *data, int size );
+static int ( *DBMSetData )( void *handle, const char *key, void *data, int size );
static int ( *DBMGetTableRows )( void *handle, DBRowHandler handler );
-static int ( *DBMDelData )( void *handle, char *key );
+static int ( *DBMDelData )( void *handle, const char *key );
static dbm_sym dbm_sym_table[] =
{
@@ -356,7 +356,7 @@
* @return NS_SUCCESS if succeeds, NS_FAILURE if not
*/
-int DBAFetch( const char *table, char *key, void *data, int size )
+int DBAFetch( const char *table, const char *key, void *data, int size )
{
tableentry *tbe;
@@ -379,7 +379,7 @@
* @return NS_SUCCESS if succeeds, NS_FAILURE if not
*/
-int DBAStore( const char *table, char *key, void *data, int size )
+int DBAStore( const char *table, const char *key, void *data, int size )
{
tableentry *tbe;
@@ -421,7 +421,7 @@
* @return NS_SUCCESS if succeeds, NS_FAILURE if not
*/
-int DBADelete( const char *table, char *key )
+int DBADelete( const char *table, const char *key )
{
tableentry *tbe;