commit - 2f6d7a649cf2428991cba3b9d2250b95a5904675
commit + 22fa782be7840dae825be43e9ac8d8476d80f08c
blob - 13014d32a0fb6d8ee1afc1904ab8428db658a523
blob + 9f107a83f42e524da59a604d5879509d069a3e9f
--- doc/sample-ngircd.conf
+++ doc/sample-ngircd.conf
# Don't do any DNS lookups when a client connects to the server.
;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
# to accept (0: unlimited):
;MaxConnections = 0
blob - 3a6b7d56176af3d1d46e826afb9942b3e7e242ef
blob + cd5922afd9ab4071e8852c397eb4f0f6e1803d74
--- man/ngircd.conf.5.tmpl
+++ man/ngircd.conf.5.tmpl
If you configure ngircd to connect to other servers, ngircd may still
perform a DNS lookup if required.
Default: No.
+.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
Maximum number of simultaneous connection the server is allowed to accept
(0: unlimited). Default: 0.
blob - 0f6686221696f463eccd11097aa488fd8121bcbc
blob + ad2baa9ef2a73fe6b424b1832f871c94f38407b4
--- src/ngircd/conf.c
+++ src/ngircd/conf.c
} /* Config_Rehash */
+static const char*
+yesno_to_str(int boolean_value)
+{
+ if (boolean_value)
+ return "yes";
+ return "no";
+}
+
+
GLOBAL int
Conf_Test( void )
{
printf( " PingTimeout = %d\n", Conf_PingTimeout );
printf( " PongTimeout = %d\n", Conf_PongTimeout );
printf( " ConnectRetry = %d\n", Conf_ConnectRetry );
- printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true ? "yes" : "no" );
- printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" );
- printf( " PredefChannelsOnly = %s\n", Conf_PredefChannelsOnly == true ? "yes" : "no" );
- printf( " NoDNS = %s\n", Conf_NoDNS ? "yes" : "no");
+ printf( " OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
+ printf( " OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
+ printf( " PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
+ 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( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf( " MaxJoins = %d\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1);
Conf_NoDNS = false;
Conf_PredefChannelsOnly = false;
Conf_OperServerMode = false;
+
+ Conf_ConnectIPv4 = true;
+ Conf_ListenIPv4 = true;
+ Conf_ConnectIPv6 = true;
+ Conf_ListenIPv6 = true;
Conf_MaxConnections = 0;
Conf_MaxConnectionsIP = 5;
if( strcasecmp( Var, "NoDNS" ) == 0 ) {
/* don't do reverse dns lookups when clients connect? */
Conf_NoDNS = Check_ArgIsTrue( Arg );
+ 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 ) {
/* Are IRC operators allowed to use MODE in channels they aren't Op in? */
Conf_OperCanMode = Check_ArgIsTrue( Arg );
"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
servers = servers_once = 0;
for (i = 0; i < MAX_SERVERS; i++) {
blob - d505f3390db01625f259d565bf7c9dffc4cc26dd
blob + 3bc206605e208d40b78cd02c1cab05fcb9eeb8cb
--- src/ngircd/conf.h
+++ src/ngircd/conf.h
/* Disable all DNS functions? */
GLOBAL bool Conf_NoDNS;
-/* don't listen for incoming ipv6 connections, even if OS supports it? */
-GLOBAL bool Conf_NoListenIpv6;
+/* listen for incoming ipv6 connections if OS supports it (default: yes)? */
+GLOBAL bool Conf_ListenIPv6;
-/* don't connect to remote systems unsign ipv6? */
-GLOBAL bool Conf_NoConnectIpv6;
+/* listen for incoming ipv4 connections if OS supports it (default: yes)? */
+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,
* ircd2 will ignore the command. This enables a workaround:
* It masks the command as coming from the server */
blob - 9e31e4eec576e7c3a747e0c97d65ed790911b5da
blob + 1696d5c5f62968d8d495576b4e1bc67947db66ee
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
}
#ifdef WANT_IPV6
- if (!Conf_NoListenIpv6)
+ if (Conf_ListenIPv6)
created = ports_initlisteners(&Conf_ListenPorts, AF_INET6, cb_listen);
#endif
- created += ports_initlisteners(&Conf_ListenPorts, AF_INET, cb_listen);
+ if (Conf_ListenIPv4)
+ created += ports_initlisteners(&Conf_ListenPorts, AF_INET, cb_listen);
return created;
} /* Conn_InitListeners */
blob - a128694bab19f06033dff4da93737f32bb0094b6
blob + 041c15620b1585c56f84dd45c8fa7a17f55b0c1a
--- src/ngircd/resolve.c
+++ src/ngircd/resolve.c
static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
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
Resolver_fork(int *pipefds)
#ifdef HAVE_GETADDRINFO
int res;
struct addrinfo *a, *ai_results;
- static const struct addrinfo hints = {
+ static struct addrinfo hints = {
#ifndef WANT_IPV6
.ai_family = AF_INET,
#endif
.ai_socktype = SOCK_STREAM,
.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);
switch (res) {
case 0: break;