382 lines
11 KiB
Diff
382 lines
11 KiB
Diff
include/events.h | 2 +
|
|
include/iServer.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++-
|
|
libircu/msg_CM.cc | 18 +++++++++++++++
|
|
libircu/msg_M.cc | 13 +++++++++++
|
|
libircu/msg_S.cc | 9 +++++--
|
|
libircu/msg_Server.cc | 3 ++
|
|
src/Network.cc | 10 +++-----
|
|
src/iServer.cc | 37 ++++++++++++++++++++++++++++++++
|
|
src/main.cc | 4 +--
|
|
src/server.cc | 2 -
|
|
src/server_connection.cc | 3 ++
|
|
11 files changed, 142 insertions(+), 13 deletions(-)
|
|
|
|
Index: include/events.h
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/include/events.h,v
|
|
retrieving revision 1.19
|
|
diff -u -r1.19 events.h
|
|
--- include/events.h 29 Sep 2005 17:40:06 -0000 1.19
|
|
+++ include/events.h 27 Sep 2006 02:56:56 -0000
|
|
@@ -74,6 +74,7 @@
|
|
{
|
|
EVT_JOIN = EVT_NOOP,
|
|
EVT_PART,
|
|
+ EVT_SERVERMODE, // when servers perform modes.
|
|
EVT_TOPIC, // passed even if TRACK_TOPIC is disabled
|
|
EVT_KICK, // moved to xClient::OnNetworkKick()
|
|
EVT_CREATE
|
|
@@ -150,6 +151,7 @@
|
|
"Channel Topic Change", /* EVT_TOPIC */
|
|
"Channel Kick", /* EVT_KICK */
|
|
"Channel Create" /* EVT_CREATE */
|
|
+ "Channel Mode By Server" /* EVT_SERVERMODE */
|
|
} ;
|
|
|
|
} // namespace gnuworld
|
|
Index: include/iServer.h
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/include/iServer.h,v
|
|
retrieving revision 1.14
|
|
diff -u -r1.14 iServer.h
|
|
--- include/iServer.h 29 Dec 2003 23:59:36 -0000 1.14
|
|
+++ include/iServer.h 27 Sep 2006 02:56:57 -0000
|
|
@@ -60,8 +60,17 @@
|
|
/// Type used to hold flags
|
|
typedef unsigned int flagType ;
|
|
|
|
- /// Set if this iServer is juped, false otherwise
|
|
+ /**
|
|
+ * Flags that iServers may have.
|
|
+ */
|
|
+ /* Set if this iServer is juped, false otherwise */
|
|
static const flagType FLAG_JUPE ;
|
|
+ /* Set if this iServer is a hub (+h) */
|
|
+ static const flagType FLAG_HUB ;
|
|
+ /* Set if this iServer is a service (+s) */
|
|
+ static const flagType FLAG_SERVICE ;
|
|
+ /* Set if this iServer is IPv6-compatible (+6) */
|
|
+ static const flagType FLAG_IPV6 ;
|
|
|
|
/**
|
|
* Construct an iServer given its vital state variables
|
|
@@ -117,6 +126,42 @@
|
|
{ setFlag( FLAG_JUPE ) ; }
|
|
|
|
/**
|
|
+ * Return true if this server is a hub.
|
|
+ */
|
|
+ inline bool isHub() const
|
|
+ { return getFlag( FLAG_HUB ) ; }
|
|
+
|
|
+ /**
|
|
+ * Set this iServer as a hub.
|
|
+ */
|
|
+ inline void setHub()
|
|
+ { setFlag( FLAG_HUB ) ; }
|
|
+
|
|
+ /**
|
|
+ * Return true if this server is a service.
|
|
+ */
|
|
+ inline bool isService() const
|
|
+ { return getFlag( FLAG_SERVICE ) ; }
|
|
+
|
|
+ /**
|
|
+ * Set this iServer as a service.
|
|
+ */
|
|
+ inline void setService()
|
|
+ { setFlag( FLAG_SERVICE ) ; }
|
|
+
|
|
+ /**
|
|
+ * Return true if this server is IPv6-compatible.
|
|
+ */
|
|
+ inline bool isIPv6() const
|
|
+ { return getFlag( FLAG_IPV6 ) ; }
|
|
+
|
|
+ /**
|
|
+ * Set this iServer as IPv6-compatible.
|
|
+ */
|
|
+ inline void setIPv6()
|
|
+ { setFlag( FLAG_IPV6 ) ; }
|
|
+
|
|
+ /**
|
|
* Return the server numeric of this server's uplink.
|
|
*/
|
|
inline const unsigned int& getUplinkIntYY() const
|
|
@@ -212,6 +257,13 @@
|
|
return out ;
|
|
}
|
|
|
|
+ /* Mutator methods */
|
|
+
|
|
+ /**
|
|
+ * Interpret a server's flags.
|
|
+ */
|
|
+ void setFlags( const std::string& ) ;
|
|
+
|
|
protected:
|
|
|
|
/**
|
|
Index: libircu/msg_CM.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/libircu/msg_CM.cc,v
|
|
retrieving revision 1.9
|
|
diff -u -r1.9 msg_CM.cc
|
|
--- libircu/msg_CM.cc 24 Jun 2005 22:48:59 -0000 1.9
|
|
+++ libircu/msg_CM.cc 27 Sep 2006 02:56:57 -0000
|
|
@@ -81,6 +81,24 @@
|
|
bool clearVoice = false ;
|
|
bool clearBans = false ;
|
|
|
|
+// Go ahead and post the server mode event
|
|
+iServer* serverSource = 0 ;
|
|
+
|
|
+if( NULL != strchr( Param[ 0 ], '.' ) )
|
|
+ {
|
|
+ // Server, by name
|
|
+ serverSource = Network->findServerName( Param[ 0 ] ) ;
|
|
+ }
|
|
+else if( strlen( Param[ 0 ] ) < 3 )
|
|
+ {
|
|
+ // 1 or 2 char numeric, server
|
|
+ serverSource = Network->findServer( Param[ 0 ] ) ;
|
|
+ }
|
|
+
|
|
+if (serverSource != 0)
|
|
+ theServer->PostChannelEvent( EVT_SERVERMODE, tmpChan,
|
|
+ static_cast< void* >( serverSource ));
|
|
+
|
|
xServer::modeVectorType modeVector ;
|
|
|
|
for( std::string::size_type i = 0 ; i < Modes.size() ; i++ )
|
|
Index: libircu/msg_M.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/libircu/msg_M.cc,v
|
|
retrieving revision 1.12
|
|
diff -u -r1.12 msg_M.cc
|
|
--- libircu/msg_M.cc 29 Sep 2005 17:40:06 -0000 1.12
|
|
+++ libircu/msg_M.cc 27 Sep 2006 02:56:58 -0000
|
|
@@ -129,6 +129,19 @@
|
|
return false ;
|
|
}
|
|
|
|
+if( serverSource != 0 )
|
|
+ {
|
|
+// elog << "msg_M ("
|
|
+// << theChan->getName()
|
|
+// << ") server "
|
|
+// << serverSource->getName()
|
|
+// << " performed a mode"
|
|
+// << endl;
|
|
+ theServer->PostChannelEvent( EVT_SERVERMODE, theChan,
|
|
+ static_cast< void* >( serverSource ));
|
|
+ }
|
|
+
|
|
+/* XXX OPMODE FAILS HERE */
|
|
// Find the ChannelUser of the source client
|
|
// It is possible that the ChannelUser will be NULL, in the
|
|
// case that a server is setting the mode(s)
|
|
Index: libircu/msg_S.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/libircu/msg_S.cc,v
|
|
retrieving revision 1.5
|
|
diff -u -r1.5 msg_S.cc
|
|
--- libircu/msg_S.cc 25 Mar 2005 03:07:29 -0000 1.5
|
|
+++ libircu/msg_S.cc 27 Sep 2006 02:56:58 -0000
|
|
@@ -47,10 +47,10 @@
|
|
|
|
/**
|
|
* New server joined the network.
|
|
- * Q S irc.dynmc.net 2 0 948159347 P10 BD] 0 :[209.0.37.10]
|
|
+ * Q S irc.dynmc.net 2 0 948159347 P10 BD] +h :[209.0.37.10]
|
|
* [209.0.37.10] Dynamic Networking Solutions
|
|
*
|
|
- * B S EUWorld1.test.net 3 0 947284938 P10 OD] 0 :[128.227.184.152]
|
|
+ * B S EUWorld1.test.net 3 0 947284938 P10 OD] +s :[128.227.184.152]
|
|
* EUWorld Undernet Service
|
|
* B: Uplink Server numeric
|
|
* S: SERVER message
|
|
@@ -61,7 +61,7 @@
|
|
* P10: Protocol
|
|
* B: Server numeric
|
|
* D]: Last used nick number for clients
|
|
- * 0: Unused
|
|
+ * +h/+s: server flags
|
|
* EUWorld Undernet Server: description
|
|
* As always, the second token, the command, is not
|
|
* included in the xParameters passed here.
|
|
@@ -128,6 +128,9 @@
|
|
newServer->setBursting( true ) ;
|
|
}
|
|
|
|
+// Set any appropriate server flags
|
|
+newServer->setFlags( params[ 7 ] ) ;
|
|
+
|
|
Network->addServer( newServer ) ;
|
|
//elog << "msg_S> Added server: "
|
|
// << *newServer
|
|
Index: libircu/msg_Server.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/libircu/msg_Server.cc,v
|
|
retrieving revision 1.6
|
|
diff -u -r1.6 msg_Server.cc
|
|
--- libircu/msg_Server.cc 25 Mar 2005 03:07:29 -0000 1.6
|
|
+++ libircu/msg_Server.cc 27 Sep 2006 02:56:58 -0000
|
|
@@ -107,6 +107,9 @@
|
|
tmpUplink->setBursting( true ) ;
|
|
}
|
|
|
|
+ // Set any appropriate server flags
|
|
+ tmpUplink->setFlags( Param[ 6 ] ) ;
|
|
+
|
|
theServer->setUplink( tmpUplink ) ;
|
|
|
|
// Find this server (me)
|
|
Index: src/Network.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/src/Network.cc,v
|
|
retrieving revision 1.73
|
|
diff -u -r1.73 Network.cc
|
|
--- src/Network.cc 4 Oct 2005 17:45:01 -0000 1.73
|
|
+++ src/Network.cc 27 Sep 2006 02:57:03 -0000
|
|
@@ -1040,8 +1040,6 @@
|
|
bool xNetwork::allocateClientNumeric( unsigned int intYY,
|
|
unsigned int& newIntXXX )
|
|
{
|
|
-newIntXXX = 0 ;
|
|
-
|
|
// First verify that the given intYY corresponds to a
|
|
// fake server (including the xServer).
|
|
reservedNumeric_iterator rsItr = reservedNumericMap.find( intYY ) ;
|
|
@@ -1060,7 +1058,8 @@
|
|
// If the for loop traverses all possible values of
|
|
// unsigned int, it will eventually hit 0 again, and
|
|
// the loop will terminate.
|
|
-for( newIntXXX = 1 ; newIntXXX != 0 ; ++newIntXXX )
|
|
+unsigned int maxIntXXX = base64toint("]]]", 3);
|
|
+for( newIntXXX = 0 ; newIntXXX <= maxIntXXX ; ++newIntXXX )
|
|
{
|
|
// elog << "xNetwork::allocateClientNumeric> Checking: "
|
|
// << newIntXXX
|
|
@@ -1079,10 +1078,9 @@
|
|
}
|
|
|
|
// Check if all values were examined
|
|
-if( 0 == newIntXXX )
|
|
+if( newIntXXX > maxIntXXX )
|
|
{
|
|
- elog << "xNetwork::allocateClientNumeric> Looped unsigned "
|
|
- << "int"
|
|
+ elog << "xNetwork::allocateClientNumeric> Exceeded maxIntXXX"
|
|
<< endl ;
|
|
return false ;
|
|
}
|
|
Index: src/iServer.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/src/iServer.cc,v
|
|
retrieving revision 1.10
|
|
diff -u -r1.10 iServer.cc
|
|
--- src/iServer.cc 12 Jan 2005 03:50:38 -0000 1.10
|
|
+++ src/iServer.cc 27 Sep 2006 02:57:05 -0000
|
|
@@ -38,6 +38,9 @@
|
|
using std::string ;
|
|
|
|
const iServer::flagType iServer::FLAG_JUPE = 0x01 ;
|
|
+const iServer::flagType iServer::FLAG_HUB = 0x02 ;
|
|
+const iServer::flagType iServer::FLAG_SERVICE = 0x04 ;
|
|
+const iServer::flagType iServer::FLAG_IPV6 = 0x08 ;
|
|
|
|
iServer::iServer( const unsigned int& _uplink,
|
|
const string& _yyxxx,
|
|
@@ -57,4 +60,38 @@
|
|
iServer::~iServer()
|
|
{}
|
|
|
|
+/**
|
|
+ * Interpret a server's flags.
|
|
+ *
|
|
+ * @param[in] newFlags String listing server's P10 flags.
|
|
+ */
|
|
+void iServer::setFlags( const string& newFlags )
|
|
+{
|
|
+for( string::size_type i = 0 ; i < newFlags.size() ; i++ )
|
|
+ {
|
|
+ switch( newFlags[ i ] )
|
|
+ {
|
|
+ case 'h':
|
|
+ setHub() ;
|
|
+ break ;
|
|
+ case 's':
|
|
+ setService() ;
|
|
+ break ;
|
|
+ case '6':
|
|
+ setIPv6() ;
|
|
+ break ;
|
|
+ case '+':
|
|
+ break ;
|
|
+ default:
|
|
+ // Unknown flag
|
|
+ elog << "iServer> Unknown server flag: "
|
|
+ << newFlags[ i ]
|
|
+ << ", in flags string: "
|
|
+ << newFlags
|
|
+ << std::endl ;
|
|
+ break ;
|
|
+ } // switch
|
|
+ } // for
|
|
+} // setFlags()
|
|
+
|
|
} // namespace gnuworld
|
|
Index: src/main.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/src/main.cc,v
|
|
retrieving revision 1.65
|
|
diff -u -r1.65 main.cc
|
|
--- src/main.cc 12 Jan 2005 03:50:38 -0000 1.65
|
|
+++ src/main.cc 27 Sep 2006 02:57:06 -0000
|
|
@@ -369,9 +369,9 @@
|
|
// All output for the xClients should be in the
|
|
// output buffer by now, go ahead and put the
|
|
// server's SQ message there as well
|
|
- Write( "%s SQ %s :%s",
|
|
- getCharYY().c_str(),
|
|
+ Write( "%s SQ %s 0 :%s",
|
|
getCharYY().c_str(),
|
|
+ getName().c_str(),
|
|
getShutDownReason().c_str() ) ;
|
|
|
|
// Make sure the SQ and all previous data are flushed
|
|
Index: src/server.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/src/server.cc,v
|
|
retrieving revision 1.219
|
|
diff -u -r1.219 server.cc
|
|
--- src/server.cc 2 Jan 2006 22:29:33 -0000 1.219
|
|
+++ src/server.cc 27 Sep 2006 02:57:08 -0000
|
|
@@ -2899,7 +2899,7 @@
|
|
{
|
|
Write( "%s SQ %s %d :Unloading server",
|
|
getCharYY().c_str(),
|
|
- fakeServer->getCharYY().c_str(),
|
|
+ fakeServer->getName().c_str(),
|
|
fakeServer->getConnectTime() ) ;
|
|
}
|
|
|
|
Index: src/server_connection.cc
|
|
===================================================================
|
|
RCS file: /cvsroot/gnuworld/gnuworld/src/server_connection.cc,v
|
|
retrieving revision 1.3
|
|
diff -u -r1.3 server_connection.cc
|
|
--- src/server_connection.cc 25 Mar 2005 03:07:30 -0000 1.3
|
|
+++ src/server_connection.cc 27 Sep 2006 02:57:08 -0000
|
|
@@ -91,6 +91,9 @@
|
|
// P10 version information, bogus.
|
|
Version = 10 ;
|
|
|
|
+// Set ourselves as a service.
|
|
+me->setService() ;
|
|
+
|
|
// Initialize the connection time variable to current time.
|
|
ConnectionTime = ::time( NULL ) ;
|
|
|