mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	- New commands CONNECT and DISCONNECT.
- Validate operator status before syntax checks.
This commit is contained in:
		| @@ -14,10 +14,11 @@ | |||||||
|  |  | ||||||
| #include "portab.h" | #include "portab.h" | ||||||
|  |  | ||||||
| static char UNUSED id[] = "$Id: irc-oper.c,v 1.16 2002/12/30 00:01:45 alex Exp $"; | static char UNUSED id[] = "$Id: irc-oper.c,v 1.17 2002/12/31 16:10:55 alex Exp $"; | ||||||
|  |  | ||||||
| #include "imp.h" | #include "imp.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
|  | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| #include "ngircd.h" | #include "ngircd.h" | ||||||
| @@ -82,14 +83,17 @@ IRC_OPER( CLIENT *Client, REQUEST *Req ) | |||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| IRC_DIE( CLIENT *Client, REQUEST *Req ) | IRC_DIE( CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
|  | 	/* Shut down server */ | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
| 	assert( Req != NULL ); | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ | 	/* Not a local IRC operator? */ | ||||||
| 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||||
| 	 | 	 | ||||||
|  | 	/* Bad number of parameters? */ | ||||||
|  | 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client )); | 	Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client )); | ||||||
| 	NGIRCd_SignalQuit = TRUE; | 	NGIRCd_SignalQuit = TRUE; | ||||||
| 	return CONNECTED; | 	return CONNECTED; | ||||||
| @@ -99,14 +103,17 @@ IRC_DIE( CLIENT *Client, REQUEST *Req ) | |||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| IRC_REHASH( CLIENT *Client, REQUEST *Req ) | IRC_REHASH( CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
|  | 	/* Reload configuration file */ | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
| 	assert( Req != NULL ); | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ | 	/* Not a local IRC operator? */ | ||||||
| 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||||
|  |  | ||||||
|  | 	/* Bad number of parameters? */ | ||||||
|  | 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client )); | 	Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client )); | ||||||
| 	NGIRCd_SignalRehash = TRUE; | 	NGIRCd_SignalRehash = TRUE; | ||||||
| 	 | 	 | ||||||
| @@ -117,14 +124,17 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req ) | |||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| IRC_RESTART( CLIENT *Client, REQUEST *Req ) | IRC_RESTART( CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
|  | 	/* Restart IRC server (fork a new process) */ | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
| 	assert( Req != NULL ); | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ | 	/* Not a local IRC operator? */ | ||||||
| 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
|  |  | ||||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||||
|  |  | ||||||
|  | 	/* Bad number of parameters? */ | ||||||
|  | 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client )); | 	Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client )); | ||||||
| 	NGIRCd_SignalRestart = TRUE; | 	NGIRCd_SignalRestart = TRUE; | ||||||
| 	return CONNECTED; | 	return CONNECTED; | ||||||
| @@ -134,20 +144,64 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req ) | |||||||
| GLOBAL BOOLEAN | GLOBAL BOOLEAN | ||||||
| IRC_CONNECT(CLIENT *Client, REQUEST *Req ) | IRC_CONNECT(CLIENT *Client, REQUEST *Req ) | ||||||
| { | { | ||||||
| 	/* Vorlaeufige Version zu Debug-Zwecken: es wird einfach | 	/* Connect configured or new server */ | ||||||
| 	 * der "passive mode" aufgehoben, mehr passiert nicht ... */ |  | ||||||
|  |  | ||||||
| 	assert( Client != NULL ); | 	assert( Client != NULL ); | ||||||
| 	assert( Req != NULL ); | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
| 	/* Falsche Anzahl Parameter? */ | 	/* Not a local IRC operator? */ | ||||||
| 	if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); |  | ||||||
| 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||||
|  |  | ||||||
| 	Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\".", Client_Mask( Client )); | 	/* Bad number of parameters? */ | ||||||
| 	NGIRCd_Passive = FALSE; | 	if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	/* Invalid port number? */ | ||||||
|  | 	if( atoi( Req->argv[1] ) < 1 )  return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]); | ||||||
|  |  | ||||||
|  | 	if( Req->argc == 2 ) | ||||||
|  | 	{ | ||||||
|  | 		/* Connect configured server */ | ||||||
|  | 		if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		/* Add server */ | ||||||
|  | 		if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  | 	} | ||||||
| 	return CONNECTED; | 	return CONNECTED; | ||||||
| } /* IRC_CONNECT */ | } /* IRC_CONNECT */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | GLOBAL BOOLEAN | ||||||
|  | IRC_DISCONNECT(CLIENT *Client, REQUEST *Req ) | ||||||
|  | { | ||||||
|  | 	/* Disconnect and disable configured server */ | ||||||
|  |  | ||||||
|  | 	CONN_ID my_conn; | ||||||
|  |  | ||||||
|  | 	assert( Client != NULL ); | ||||||
|  | 	assert( Req != NULL ); | ||||||
|  |  | ||||||
|  | 	/* Not a local IRC operator? */ | ||||||
|  | 	if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client )); | ||||||
|  |  | ||||||
|  | 	/* Bad number of parameters? */ | ||||||
|  | 	if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); | ||||||
|  |  | ||||||
|  | 	Log( LOG_NOTICE|LOG_snotice, "Got DISCONNECT command from \"%s\" for0 \"%s\".", Client_Mask( Client ), Req->argv[0]); | ||||||
|  |  | ||||||
|  | 	/* Save ID of this connection */ | ||||||
|  | 	my_conn = Client_Conn( Client ); | ||||||
|  |  | ||||||
|  | 	/* Connect configured server */ | ||||||
|  | 	if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); | ||||||
|  |  | ||||||
|  | 	/* Are we still connected or were we killed, too? */ | ||||||
|  | 	if( Client_GetFromConn( my_conn )) return CONNECTED; | ||||||
|  | 	else return DISCONNECTED; | ||||||
|  | } /* IRC_CONNECT */ | ||||||
|  |  | ||||||
|  |  | ||||||
| /* -eof- */ | /* -eof- */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton