[NeoStats-Devel] [Commits] r2773 - in trunk: . include modules/statserv src

[email protected] Thu, 25 Aug 2005 07:43:13 +1000
Newsgroups gmane.comp.neostats.devel
Message-ID <[email protected]>
Author: Mark
Date: Thu Aug 25 05:43:09 2005
New Revision: 2773

Modified:
   trunk/ChangeLog
   trunk/include/neostats.h
   trunk/modules/statserv/htmlstats.c
   trunk/modules/statserv/server.c
   trunk/modules/statserv/server.h
   trunk/src/misc.c
   trunk/src/servers.c
   trunk/src/users.c
Log:
Create core support for map generation accessible to all modules

Modified: trunk/ChangeLog
==============================================================================
--- trunk/ChangeLog	(original)
+++ trunk/ChangeLog	Thu Aug 25 05:43:09 2005
@@ -4,6 +4,9 @@
 Fish (F), Mark (M), DeadNotBuried (D)
 ===============================================================================
 * NeoStats * Version 3.0.a3-dev
+ - Creaye core support for map generation accessible to all modules via a 
+   callback handler and tidy up StatServ map code to take advantage of 
+   the new function. (M)
  - Exclude system tidy ups and bug fix for module excludes. (M)
  - More Validatexxx functions which will allow for wildcards in the string
    tested. (M)

Modified: trunk/include/neostats.h
==============================================================================
--- trunk/include/neostats.h	(original)
+++ trunk/include/neostats.h	Thu Aug 25 05:43:09 2005
@@ -1510,14 +1510,15 @@
 typedef int (*ServerListHandler) ( Client *s, void *v );
 EXPORTFUNC int ProcessServerList( ServerListHandler handler, void *v );
 /* List walk handler type */
+typedef void( *ServerMapHandler )( const Client *s, int isroot, int depth, void *v );
+EXPORTFUNC void ProcessServerMap( ServerMapHandler handler, int useexclusions, void *v );
+/* List walk handler type */
 typedef int (*ModuleListHandler) ( Module *module_ptr, void *v );
 EXPORTFUNC int ProcessModuleList( ModuleListHandler handler, void *v );
 /* List walk handler type */
 typedef int (*BanListHandler) ( Ban *ban, void *v );
 EXPORTFUNC int ProcessBanList( BanListHandler handler, void *v );
 
-EXPORTFUNC hash_t *GetServerHash( void );
-
 EXPORTFUNC int HaveFeature( int mask );
 
 EXPORTFUNC void AddEvent( ModuleEvent *eventptr );

Modified: trunk/modules/statserv/htmlstats.c
==============================================================================
--- trunk/modules/statserv/htmlstats.c	(original)
+++ trunk/modules/statserv/htmlstats.c	Thu Aug 25 05:43:09 2005
@@ -596,63 +596,50 @@
 	TABLE_END( opf );
 }
 
-/** @brief get_map
+/** @brief HTMLMapHandler
  *
- *  HTML recursive handler to generate network map
+ *  HTML handler to output network map
  *
- *  @param none
+ *  @param s pointer to server
+ *  @param isroot whether this server is root
+ *  @param depth of server in map
+ *  @param v not used
  *
  *  @return none
  */
 
-static void get_map( char *uplink, int level )
+static void HTMLMapHandler( const Client *s, int isroot, int depth, void *v )
 {
 #define MAPBUFSIZE 512
 	static char buf[MAPBUFSIZE];
-	hscan_t hs;
-	hnode_t *sn;
-	Client *s;
+	Client *u = (Client *)v;
 	serverstat *ss;
-	int i;
 
-	hash_scan_begin( &hs, GetServerHash() );
-	while( ( sn = hash_scan_next( &hs ) ) ) {
-		s = hnode_get( sn );
-		ss = GetServerModValue( s );
-
-		if( ( level == 0 ) &&( s->uplinkname[0] == 0 ) ) {
-			/* its the root server */
-			if( StatServ.exclusions && IsExcluded( s ) ) {
-				get_map( s->name, level );
-			}
-			TABLE_START( opf );
-			os_fprintf( opf, "<tr><th>Server Name</th><th>Users/Max</th><th>Opers/Max</th><th>Ping/Max</th></tr>" );
+	ss = ( serverstat * ) GetServerModValue( s );
+	if( isroot )
+	{
+		/* its the root server */
+		os_fprintf( opf, "<tr><td>%s</td><td>%d/%d</td><td>%d/%d</td><td>%d/%d</td></tr>\n",
+			ss->name, s->server->users, ss->users.alltime.max, ss->opers.current, ss->opers.alltime.max,
+			(int)s->server->ping,( int )ss->highest_ping );
+	}
+	else
+	{
+		/* its not the root server */
+		if( StatServ.flatmap )
+		{
 			os_fprintf( opf, "<tr><td>%s</td><td>%d/%d</td><td>%d/%d</td><td>%d/%d</td></tr>\n",
 				ss->name, s->server->users, ss->users.alltime.max, ss->opers.current, ss->opers.alltime.max,
 				(int)s->server->ping,( int )ss->highest_ping );
-			get_map( s->name, level + 1 );
-		} else if( ( level > 0 ) && !ircstrcasecmp( uplink, s->uplinkname ) ) {
-			if( StatServ.exclusions && IsExcluded( s ) ) {
-				get_map( s->name, level );
-			}
-			/* its not the root server */
-			if( StatServ.flatmap )
-			{
-				os_fprintf( opf, "<tr><td>%s</td><td>%d/%d</td><td>%d/%d</td><td>%d/%d</td></tr>\n",
-					ss->name, s->server->users, ss->users.alltime.max, ss->opers.current, ss->opers.alltime.max,
-					(int)s->server->ping,( int )ss->highest_ping );
-			}
-			else
-			{
-				buf[0]='\0';
-				for( i = 1; i < level; i++ ) {
-					ircsnprintf( buf, MAPBUFSIZE, "%s&nbsp&nbsp&nbsp&nbsp&nbsp|", buf );
-				}
-				os_fprintf( opf, "<tr><td>%s\\_%s</td><td>%d/%d</td><td>%d/%d</td><td>%d/%d</td></tr>\n",
-					buf, ss->name, s->server->users, ss->users.alltime.max, ss->opers.current, ss->opers.alltime.max,
-					(int)s->server->ping,( int )ss->highest_ping );
-			}
-			get_map( s->name, level + 1 );
+		}
+		else
+		{
+			buf[0]='\0';
+			for( ; depth > 1; depth-- )
+				strlcat( buf, "&nbsp&nbsp&nbsp&nbsp&nbsp|", MAPBUFSIZE );
+			os_fprintf( opf, "<tr><td>%s\\_%s</td><td>%d/%d</td><td>%d/%d</td><td>%d/%d</td></tr>\n",
+				buf, ss->name, s->server->users, ss->users.alltime.max, ss->opers.current, ss->opers.alltime.max,
+				(int)s->server->ping,( int )ss->highest_ping );
 		}
 	}
 }
@@ -668,7 +655,9 @@
 
 static void html_map( void )
 {
-	get_map( "", 0 );
+	TABLE_START( opf );
+	os_fprintf( opf, "<tr><th>Server Name</th><th>Users/Max</th><th>Opers/Max</th><th>Ping/Max</th></tr>" );
+	ProcessServerMap( HTMLMapHandler, StatServ.exclusions, NULL );
 	TABLE_END( opf );
 }
 

Modified: trunk/modules/statserv/server.c
==============================================================================
--- trunk/modules/statserv/server.c	(original)
+++ trunk/modules/statserv/server.c	Thu Aug 25 05:43:09 2005
@@ -326,65 +326,51 @@
 	return NS_SUCCESS;
 }
 
-/** @brief makemap
+/** @brief MapHandler
  *
- *  MAP command handler
- *  Recursively transverse map and report results
+ *  MAP process callback
+ *  report results of map process
  *
- *  @param uplink current point in map
- *  @param u client to report to
- *  @param level in map
+ *  @param s pointer to server
+ *  @param isroot whether this server is root
+ *  @param depth of server in map
+ *  @param v user to report to
  *
- *  @return NS_SUCCESS if succeeds, else NS_FAILURE
+ *  @return none
  */
 
-static void makemap( const char *uplink, const Client * u, int level )
+static void MapHandler( const Client *s, int isroot, int depth, void *v )
 {
-	static char buf[256];
-	hscan_t hs;
-	hnode_t *sn;
-	Client *s;
+#define MAPBUFSIZE 512
+	static char buf[MAPBUFSIZE];
+	Client *u = (Client *)v;
 	serverstat *ss;
-	int i;
-	hash_scan_begin( &hs, GetServerHash() );
-	while( ( sn = hash_scan_next( &hs ) ) )
+
+	ss = ( serverstat * ) GetServerModValue( s );
+	if( isroot )
+	{
+		/* its the root server */
+		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 );
+	}
+	else
 	{
-		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 not the root server */
+		if( StatServ.flatmap )
 		{
-			/* its the root server */
-			if( StatServ.exclusions && IsExcluded( s ) )
-				makemap( s->name, u, level );
-			irc_prefmsg( ss_bot, u,
-				"\2%-45s      [ %d/%d ]   [ %d/%d ]   [ %d/%ld ]",
+			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 );
-			makemap( s->name, u, level + 1 );
-		} else if( ( level > 0 ) &&( s->uplink ) &&  !ircstrcasecmp( s->uplink->name, uplink ) )
+		}
+		else
 		{
-			if( StatServ.exclusions && IsExcluded( s ) )
-				makemap( s->name, u, level );
-			/* its not the root server */
-			if( StatServ.flatmap )
-			{
-				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 );
-			}
-			else
-			{
-				buf[0]='\0';
-				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 );
-			}
-			makemap( s->name, u, level + 1 );
+			buf[0]='\0';
+			for( ; depth > 1; depth-- )
+				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 );
 		}
 	}
 }
@@ -404,7 +390,7 @@
 	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 );
+	ProcessServerMap( MapHandler, StatServ.exclusions, (void *)cmdparams->source );
 	irc_prefmsg( ss_bot, cmdparams->source, "End of list." );
 	return NS_SUCCESS;
 }
@@ -563,7 +549,7 @@
 		/* Calculate uptime as uptime from server plus uptime of NeoStats */
 		time_t uptime;
 
-		uptime = s->server->uptime +( me.now - me.ts_boot );
+		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%%)", 

Modified: trunk/modules/statserv/server.h
==============================================================================
--- trunk/modules/statserv/server.h	(original)
+++ trunk/modules/statserv/server.h	Thu Aug 25 05:43:09 2005
@@ -41,7 +41,6 @@
 }serverstat;
 
 typedef void( *ServerStatHandler )( const serverstat *cs, const void *v );
-
 void GetServerStats( const ServerStatHandler handler, const void *v );
 
 int ss_event_server( CmdParams *cmdparams );

Modified: trunk/src/misc.c
==============================================================================
--- trunk/src/misc.c	(original)
+++ trunk/src/misc.c	Thu Aug 25 05:43:09 2005
@@ -166,7 +166,7 @@
 			argvsize += 8;
 			*argv = ns_realloc( *argv, sizeof( char * ) * argvsize );
 		}
-		if( ( *buf == ':' ) &&( colcount < 1 ) ) {
+		if( ( *buf == ':' ) && ( colcount < 1 ) ) {
 			buf++;
 			colcount++;
 			if( colon_special ) {
@@ -218,7 +218,7 @@
 			argvsize += 8;
 			*argv = ns_realloc( *argv, sizeof( char * ) * argvsize );
 		}
-		if( ( *buf == ':' ) &&( colcount < 1 ) ) {
+		if( ( *buf == ':' ) && ( colcount < 1 ) ) {
 			buf++;
 			colcount++;
 		}

Modified: trunk/src/servers.c
==============================================================================
--- trunk/src/servers.c	(original)
+++ trunk/src/servers.c	Thu Aug 25 05:43:09 2005
@@ -24,7 +24,7 @@
 */
 
 /*  TODO:
- *  - Deprecate GetServerHash()
+ *  - 
  */
 
 #include "neostats.h"
@@ -411,6 +411,66 @@
 	return NS_SUCCESS;
 }
 
+/** @brief TransverseMap
+ *
+ *  Recursively transverse map and send results to handler
+ *
+ *  @param handler to call with map entry
+ *  @param useexclusions whether to observe global exclusions
+ *  @param uplink current point in map
+ *  @param depth in map
+ *  @param v optional handler parameter
+ *
+ *  @return none
+ */
+
+static void TransverseMap( ServerMapHandler handler, int useexclusions, const char *uplink, int depth, void *v )
+{
+	hscan_t hs;
+	hnode_t *sn;
+	Client *s;
+
+	hash_scan_begin( &hs, serverhash );
+	while( ( sn = hash_scan_next( &hs ) ) )
+	{
+		s = hnode_get( sn );
+		/*printf( "%d %s %s (%s)\n", depth, s->name, s->uplink ? s->uplink->name : "", uplink );*/
+		if( ( depth == 0 ) && ( s->uplinkname[0] == 0 ) )
+		{
+			/* its the root server */
+			if( useexclusions && IsExcluded( s ) )
+				TransverseMap( handler, useexclusions, s->name, depth, v );
+			handler( s, 1, depth, v );
+			TransverseMap( handler, useexclusions, s->name, depth + 1, v );
+		}
+		else if( ( depth > 0 ) && ( s->uplink ) &&  !ircstrcasecmp( s->uplink->name, uplink ) )
+		{
+			if( useexclusions && IsExcluded( s ) )
+				TransverseMap( handler, useexclusions, s->name, depth, v );
+			/* its not the root server */
+			handler( s, 0, depth, v );
+			TransverseMap( handler, useexclusions, s->name, depth + 1, v );
+		}
+	}
+}
+
+/** @brief ProcessServerMap
+ *
+ *  Process server map
+ *  Recursively transverse map and send results to handler
+ *
+ *  @param handler to call with map entry
+ *  @param useexclusions whether to observe global exclusions
+ *  @param v optional handler parameter
+ *
+ *  @return none
+ */
+
+void ProcessServerMap( ServerMapHandler handler, int useexclusions, void *v )
+{
+	TransverseMap( handler, useexclusions, "", 0, v );
+}
+
 /** @brief RequestServerUptime
  *
  *  Request uptime of a server
@@ -443,21 +503,6 @@
 	ProcessServerList( RequestServerUptime, NULL );
 }
 
-/** @brief GetServerHash
- *
- *  GetServerHash
- *  NeoStats core use only.
- *
- *  @param none
- *
- *  @return server hash
- */
-
-hash_t *GetServerHash( void )
-{
-	return serverhash;
-}
-
 /** @brief AllocServerModPtr
  *
  *  Allocate memory for a module pointer for a server

Modified: trunk/src/users.c
==============================================================================
--- trunk/src/users.c	(original)
+++ trunk/src/users.c	Thu Aug 25 05:43:09 2005
@@ -398,13 +398,13 @@
 		u->user->awaymsg[0] = 0;
 	cmdparams = ( CmdParams* ) ns_calloc( sizeof( CmdParams ) );
 	cmdparams->source = u;
-	if( IsAway( u ) &&( !awaymsg ) )
+	if( IsAway( u ) && ( !awaymsg ) )
 	{
 		u->user->is_away = 0;
 		me.awaycount--;
 		u->uplink->server->awaycount--;
 	}
-	else if( !IsAway( u ) &&( awaymsg ) )
+	else if( !IsAway( u ) && ( awaymsg ) )
 	{
 		u->user->is_away = 1;
 		me.awaycount++;
@@ -688,7 +688,7 @@
 	if( ircd_srv.features&FEATURE_UMODECLOAK )
 	{
 		/* Do we have a hidden host any more? */
-		if( ( oldmode & UMODE_HIDE ) &&( !( u->user->Umode & UMODE_HIDE ) ) )
+		if( ( oldmode & UMODE_HIDE ) && ( !( u->user->Umode & UMODE_HIDE ) ) )
 			strlcpy( u->user->vhost, u->user->hostname, MAXHOST );
 	}
 	dlog( DEBUG1, "UserMode: modes for %s now %x", u->name, u->user->Umode );