# to not yet (or no longer) connected servers.
;ConnectRetry = 60
+ # Number of seconds after which the whole daemon should shutdown when
+ # no connections are left active after handling at least one client
+ # (0: never, which is the default).
+ # This can be useful for testing or when ngIRCd is started using
+ # "socket activation" with systemd(8), for example.
+ ;IdleTimeout = 0
+
# Maximum number of simultaneous in- and outbound connections the
# server is allowed to accept (0: unlimited):
;MaxConnections = 0
.\"
.\" ngircd.conf(5) manual page template
.\"
-.TH ngircd.conf 5 "Nov 2012" ngIRCd "ngIRCd Manual"
+.TH ngircd.conf 5 "Feb 2013" ngIRCd "ngIRCd Manual"
.SH NAME
ngircd.conf \- configuration file of ngIRCd
.SH SYNOPSIS
The server tries every <ConnectRetry> seconds to establish a link to not yet
(or no longer) connected servers. Default: 60.
.TP
+\fBIdleTimeout\fR (number)
+Number of seconds after which the whole daemon should shutdown when no
+connections are left active after handling at least one client (0: never). This
+can be useful for testing or when ngIRCd is started using "socket activation"
+with systemd(8), for example. Default: 0.
+.TP
\fBMaxConnections\fR (number)
Maximum number of simultaneous in- and outbound connections the server is
allowed to accept (0: unlimited). Default: 0.
puts("[LIMITS]");
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
+ printf(" IdleTimeout = %d\n", Conf_IdleTimeout);
printf(" MaxConnections = %d\n", Conf_MaxConnections);
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
/* Limits */
Conf_ConnectRetry = 60;
+ Conf_IdleTimeout = 0;
Conf_MaxConnections = 0;
Conf_MaxConnectionsIP = 5;
Conf_MaxJoins = 10;
return "[Options]";
}
if (strcasecmp(Var, "ConnectRetry") == 0
+ || strcasecmp(Var, "IdleTimeout") == 0
|| strcasecmp(Var, "MaxConnections") == 0
|| strcasecmp(Var, "MaxConnectionsIP") == 0
|| strcasecmp(Var, "MaxJoins") == 0
}
return;
}
+ if (strcasecmp(Var, "IdleTimeout") == 0) {
+ Conf_IdleTimeout = atoi(Arg);
+ if (!Conf_IdleTimeout && strcmp(Arg, "0"))
+ Config_Error_NaN(Line, Var);
+ return;
+ }
if (strcasecmp(Var, "MaxConnections") == 0) {
Conf_MaxConnections = atoi(Arg);
if (!Conf_MaxConnections && strcmp(Arg, "0"))
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
/** Try to connect to remote systems using the IPv4 protocol (true) */
GLOBAL bool Conf_ConnectIPv4;
+/** Idle timout (seconds), after which the daemon should exit */
+GLOBAL int Conf_IdleTimeout;
+
/** Maximum number of simultaneous connections to this server */
GLOBAL int Conf_MaxConnections;
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static void cb_Connect_to_Server PARAMS((int sock, UNUSED short what));
static void cb_clientserver PARAMS((int sock, short what));
+time_t idle_t = 0;
+
/**
* Get number of sockets available from systemd(8).
PACKAGE_NAME);
exit(1);
}
+
+ /* Should ngIRCd timeout when idle? */
+ if (Conf_IdleTimeout > 0 && NumConnectionsAccepted > 0
+ && idle_t > 0 && time(NULL) - idle_t >= Conf_IdleTimeout) {
+ LogDebug("Server idle timeout reached: %d second%s. Initiating shutdown ...",
+ Conf_IdleTimeout,
+ Conf_IdleTimeout == 1 ? "" : "s");
+ NGIRCd_SignalQuit = true;
+ }
}
if (NGIRCd_SignalQuit)
NumConnections--;
LogDebug("Shutdown of connection %d completed, %ld connection%s left.",
Idx, NumConnections, NumConnections != 1 ? "s" : "");
+
+ idle_t = NumConnections > 0 ? 0 : time(NULL);
} /* Conn_Close */
Account_Connection(void)
{
NumConnections++;
+ idle_t = 0;
if (NumConnections > NumConnectionsMax)
NumConnectionsMax = NumConnections;
LogDebug("Total number of connections now %lu (max %lu).",