mirror of
https://github.com/osmarks/ngircd.git
synced 2024-12-12 09:50:29 +00:00
IPv6: Add config options to disabe ipv4/ipv6 support.
This also enables ipv6-only setups.
This commit is contained in:
parent
2f6d7a649c
commit
22fa782be7
@ -103,6 +103,15 @@
|
|||||||
# Don't do any DNS lookups when a client connects to the server.
|
# Don't do any DNS lookups when a client connects to the server.
|
||||||
;NoDNS = no
|
;NoDNS = no
|
||||||
|
|
||||||
|
# allow both ipv4 and ipv6 clients to connect by opening both
|
||||||
|
# ipv4 and ipv6 sockets
|
||||||
|
;ListenIPv6 = yes
|
||||||
|
;ListenIPv4 = yes
|
||||||
|
|
||||||
|
# try to connect to other irc servers using ipv4 and ipv6, if possible
|
||||||
|
;ConnectIPv6 = yes
|
||||||
|
;ConnectIPv4 = yes
|
||||||
|
|
||||||
# Maximum number of simultaneous connection the server is allowed
|
# Maximum number of simultaneous connection the server is allowed
|
||||||
# to accept (0: unlimited):
|
# to accept (0: unlimited):
|
||||||
;MaxConnections = 0
|
;MaxConnections = 0
|
||||||
|
@ -158,6 +158,24 @@ If you configure ngircd to connect to other servers, ngircd may still
|
|||||||
perform a DNS lookup if required.
|
perform a DNS lookup if required.
|
||||||
Default: No.
|
Default: No.
|
||||||
.TP
|
.TP
|
||||||
|
\fBListenIPv4\fR
|
||||||
|
Set this to no if you do not want ngircd to accept clients using the standard internet protocol, ipv4.
|
||||||
|
This allows use of ngircd in ipv6-only setups.
|
||||||
|
Default: Yes.
|
||||||
|
.TP
|
||||||
|
\fBListenIPv6\fR
|
||||||
|
Set this to no if you do not want ngircd to accept clients using the new internet protocol, ipv6.
|
||||||
|
Default: Yes.
|
||||||
|
.TP
|
||||||
|
\fBConnectIPv4\fR
|
||||||
|
Set this to no if you do not want ngircd to connect to other irc servers using ipv4.
|
||||||
|
This allows use of ngircd in ipv6-only setups.
|
||||||
|
Default: Yes.
|
||||||
|
.TP
|
||||||
|
\fBConnectIPv6\fR
|
||||||
|
Set this to no if you do not want ngircd to connect to other irc servers using ipv6.
|
||||||
|
Default: Yes.
|
||||||
|
.TP
|
||||||
\fBMaxConnections\fR
|
\fBMaxConnections\fR
|
||||||
Maximum number of simultaneous connection the server is allowed to accept
|
Maximum number of simultaneous connection the server is allowed to accept
|
||||||
(0: unlimited). Default: 0.
|
(0: unlimited). Default: 0.
|
||||||
|
@ -152,6 +152,15 @@ Conf_Rehash( void )
|
|||||||
} /* Config_Rehash */
|
} /* Config_Rehash */
|
||||||
|
|
||||||
|
|
||||||
|
static const char*
|
||||||
|
yesno_to_str(int boolean_value)
|
||||||
|
{
|
||||||
|
if (boolean_value)
|
||||||
|
return "yes";
|
||||||
|
return "no";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL int
|
GLOBAL int
|
||||||
Conf_Test( void )
|
Conf_Test( void )
|
||||||
{
|
{
|
||||||
@ -201,10 +210,17 @@ Conf_Test( void )
|
|||||||
printf( " PingTimeout = %d\n", Conf_PingTimeout );
|
printf( " PingTimeout = %d\n", Conf_PingTimeout );
|
||||||
printf( " PongTimeout = %d\n", Conf_PongTimeout );
|
printf( " PongTimeout = %d\n", Conf_PongTimeout );
|
||||||
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
|
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
|
||||||
printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true ? "yes" : "no" );
|
printf( " OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
|
||||||
printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" );
|
printf( " OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
|
||||||
printf( " PredefChannelsOnly = %s\n", Conf_PredefChannelsOnly == true ? "yes" : "no" );
|
printf( " PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
|
||||||
printf( " NoDNS = %s\n", Conf_NoDNS ? "yes" : "no");
|
printf( " NoDNS = %s\n", yesno_to_str(Conf_NoDNS));
|
||||||
|
|
||||||
|
#ifdef WANT_IPV6
|
||||||
|
printf(" ListenIPv6 = %s\n", yesno_to_str(Conf_ListenIPv6));
|
||||||
|
printf(" ListenIPv4 = %s\n", yesno_to_str(Conf_ListenIPv4));
|
||||||
|
printf(" ConnectIPv4= %s\n", yesno_to_str(Conf_ConnectIPv6));
|
||||||
|
printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
|
||||||
|
#endif
|
||||||
printf( " MaxConnections = %ld\n", Conf_MaxConnections);
|
printf( " MaxConnections = %ld\n", Conf_MaxConnections);
|
||||||
printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
||||||
printf( " MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
|
printf( " MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
|
||||||
@ -449,6 +465,11 @@ Set_Defaults( bool InitServers )
|
|||||||
Conf_PredefChannelsOnly = false;
|
Conf_PredefChannelsOnly = false;
|
||||||
Conf_OperServerMode = false;
|
Conf_OperServerMode = false;
|
||||||
|
|
||||||
|
Conf_ConnectIPv4 = true;
|
||||||
|
Conf_ListenIPv4 = true;
|
||||||
|
Conf_ConnectIPv6 = true;
|
||||||
|
Conf_ListenIPv6 = true;
|
||||||
|
|
||||||
Conf_MaxConnections = 0;
|
Conf_MaxConnections = 0;
|
||||||
Conf_MaxConnectionsIP = 5;
|
Conf_MaxConnectionsIP = 5;
|
||||||
Conf_MaxJoins = 10;
|
Conf_MaxJoins = 10;
|
||||||
@ -817,6 +838,33 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
Conf_NoDNS = Check_ArgIsTrue( Arg );
|
Conf_NoDNS = Check_ArgIsTrue( Arg );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#ifdef WANT_IPV6
|
||||||
|
/* the default setting for all the WANT_IPV6 special options is 'true' */
|
||||||
|
if( strcasecmp( Var, "ListenIPv6" ) == 0 ) {
|
||||||
|
/* listen on ipv6 sockets, if available? */
|
||||||
|
Conf_ListenIPv6 = Check_ArgIsTrue( Arg );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( strcasecmp( Var, "ListenIPv4" ) == 0 ) {
|
||||||
|
/*
|
||||||
|
* listen on ipv4 sockets, if available?
|
||||||
|
* this allows "ipv6-only" setups.
|
||||||
|
*/
|
||||||
|
Conf_ListenIPv4 = Check_ArgIsTrue( Arg );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( strcasecmp( Var, "ConnectIPv6" ) == 0 ) {
|
||||||
|
/* connect to other hosts using ipv6, if they have an AAAA record? */
|
||||||
|
Conf_ConnectIPv6 = Check_ArgIsTrue( Arg );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( strcasecmp( Var, "ConnectIPv4" ) == 0 ) {
|
||||||
|
/* connect to other hosts using ipv4.
|
||||||
|
* again, this can be used for ipv6-only setups */
|
||||||
|
Conf_ConnectIPv4 = Check_ArgIsTrue( Arg );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) {
|
if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) {
|
||||||
/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
|
/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
|
||||||
Conf_OperCanMode = Check_ArgIsTrue( Arg );
|
Conf_OperCanMode = Check_ArgIsTrue( Arg );
|
||||||
@ -1138,6 +1186,16 @@ Validate_Config(bool Configtest, bool Rehash)
|
|||||||
"No administrative information configured but required by RFC!");
|
"No administrative information configured but required by RFC!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WANT_IPV6
|
||||||
|
if (!Conf_ListenIPv4 && !Conf_ListenIPv6)
|
||||||
|
Config_Error(LOG_ALERT,
|
||||||
|
"Both \"ListenIPv4\" and \"ListenIPv6\" are set to 'no'; no network protocol available!");
|
||||||
|
|
||||||
|
if (!Conf_ConnectIPv4 && !Conf_ConnectIPv6)
|
||||||
|
Config_Error(LOG_ALERT,
|
||||||
|
"Both \"ConnectIPv4\" and \"ConnectIPv6\" are set to 'no'; ngircd will fail to connect to other irc servers");
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
servers = servers_once = 0;
|
servers = servers_once = 0;
|
||||||
for (i = 0; i < MAX_SERVERS; i++) {
|
for (i = 0; i < MAX_SERVERS; i++) {
|
||||||
|
@ -124,11 +124,20 @@ GLOBAL bool Conf_OperCanMode;
|
|||||||
/* Disable all DNS functions? */
|
/* Disable all DNS functions? */
|
||||||
GLOBAL bool Conf_NoDNS;
|
GLOBAL bool Conf_NoDNS;
|
||||||
|
|
||||||
/* don't listen for incoming ipv6 connections, even if OS supports it? */
|
/* listen for incoming ipv6 connections if OS supports it (default: yes)? */
|
||||||
GLOBAL bool Conf_NoListenIpv6;
|
GLOBAL bool Conf_ListenIPv6;
|
||||||
|
|
||||||
/* don't connect to remote systems unsign ipv6? */
|
/* listen for incoming ipv4 connections if OS supports it (default: yes)? */
|
||||||
GLOBAL bool Conf_NoConnectIpv6;
|
GLOBAL bool Conf_ListenIPv4;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* try to connect to remote systems using the ipv6 protocol,
|
||||||
|
* if they have an ipv6 address? (default yes)
|
||||||
|
*/
|
||||||
|
GLOBAL bool Conf_ConnectIPv6;
|
||||||
|
|
||||||
|
/* same as above, but for ipv4 hosts, default: yes */
|
||||||
|
GLOBAL bool Conf_ConnectIPv4;
|
||||||
|
|
||||||
/* If an IRC op gives chanop privileges without being a chanop,
|
/* If an IRC op gives chanop privileges without being a chanop,
|
||||||
* ircd2 will ignore the command. This enables a workaround:
|
* ircd2 will ignore the command. This enables a workaround:
|
||||||
|
@ -315,9 +315,10 @@ Conn_InitListeners( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
if (!Conf_NoListenIpv6)
|
if (Conf_ListenIPv6)
|
||||||
created = ports_initlisteners(&Conf_ListenPorts, AF_INET6, cb_listen);
|
created = ports_initlisteners(&Conf_ListenPorts, AF_INET6, cb_listen);
|
||||||
#endif
|
#endif
|
||||||
|
if (Conf_ListenIPv4)
|
||||||
created += ports_initlisteners(&Conf_ListenPorts, AF_INET, cb_listen);
|
created += ports_initlisteners(&Conf_ListenPorts, AF_INET, cb_listen);
|
||||||
|
|
||||||
return created;
|
return created;
|
||||||
|
@ -45,6 +45,10 @@ static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd
|
|||||||
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
|
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
|
||||||
static bool register_callback PARAMS((RES_STAT *s, void (*cbfunc)(int, short)));
|
static bool register_callback PARAMS((RES_STAT *s, void (*cbfunc)(int, short)));
|
||||||
|
|
||||||
|
#ifdef WANT_IPV6
|
||||||
|
extern bool Conf_ConnectIPv4;
|
||||||
|
extern bool Conf_ConnectIPv6;
|
||||||
|
#endif
|
||||||
|
|
||||||
static pid_t
|
static pid_t
|
||||||
Resolver_fork(int *pipefds)
|
Resolver_fork(int *pipefds)
|
||||||
@ -270,7 +274,7 @@ ForwardLookup(const char *hostname, array *IpAddr)
|
|||||||
#ifdef HAVE_GETADDRINFO
|
#ifdef HAVE_GETADDRINFO
|
||||||
int res;
|
int res;
|
||||||
struct addrinfo *a, *ai_results;
|
struct addrinfo *a, *ai_results;
|
||||||
static const struct addrinfo hints = {
|
static struct addrinfo hints = {
|
||||||
#ifndef WANT_IPV6
|
#ifndef WANT_IPV6
|
||||||
.ai_family = AF_INET,
|
.ai_family = AF_INET,
|
||||||
#endif
|
#endif
|
||||||
@ -280,6 +284,14 @@ ForwardLookup(const char *hostname, array *IpAddr)
|
|||||||
.ai_socktype = SOCK_STREAM,
|
.ai_socktype = SOCK_STREAM,
|
||||||
.ai_protocol = IPPROTO_TCP
|
.ai_protocol = IPPROTO_TCP
|
||||||
};
|
};
|
||||||
|
#ifdef WANT_IPV6
|
||||||
|
assert(Conf_ConnectIPv6 || Conf_ConnectIPv4);
|
||||||
|
|
||||||
|
if (!Conf_ConnectIPv6)
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
if (!Conf_ConnectIPv4)
|
||||||
|
hints.ai_family = AF_INET6;
|
||||||
|
#endif
|
||||||
res = getaddrinfo(hostname, NULL, &hints, &ai_results);
|
res = getaddrinfo(hostname, NULL, &hints, &ai_results);
|
||||||
switch (res) {
|
switch (res) {
|
||||||
case 0: break;
|
case 0: break;
|
||||||
|
Loading…
Reference in New Issue
Block a user