#include "imp.h"
#include <assert.h>
+#include <ctype.h>
#include <errno.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>
-#ifdef HAVE_CTYPE_H
-# include <ctype.h>
-#endif
#include "array.h"
#include "ngircd.h"
free(Conf_SSLOptions.DHFile);
Conf_SSLOptions.DHFile = NULL;
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
+
+ array_free(&Conf_SSLOptions.ListenPorts);
}
/**
puts("[LIMITS]");
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
- printf(" MaxConnections = %ld\n", Conf_MaxConnections);
+ printf(" MaxConnections = %d\n", Conf_MaxConnections);
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1);
printf(" MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
printf(" NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
printf(" OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
+ printf(" OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp));
printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
#ifdef PAM
printf(" PAM = %s\n", yesno_to_str(Conf_PAM));
}
/**
- * Check if the given nick name is an service.
+ * Check if the given nick name is reserved for services on a particular server.
+ *
+ * @param ConfServer The server index to check.
+ * @param Nick The nick name to check.
+ * @returns true if the given nick name belongs to an "IRC service".
+ */
+GLOBAL bool
+Conf_NickIsService(int ConfServer, const char *Nick)
+{
+ assert (ConfServer >= 0);
+ assert (ConfServer < MAX_SERVERS);
+
+ return MatchCaseInsensitiveList(Conf_Server[ConfServer].svs_mask,
+ Nick, ",");
+}
+
+/**
+ * Check if the given nick name is blocked for "normal client" use.
*
+ * @param ConfServer The server index or NONE to check all configured servers.
+ * @param Nick The nick name to check.
* @returns true if the given nick name belongs to an "IRC service".
*/
GLOBAL bool
-Conf_IsService(int ConfServer, const char *Nick)
+Conf_NickIsBlocked(const char *Nick)
{
- return MatchCaseInsensitive(Conf_Server[ConfServer].svs_mask, Nick);
+ int i;
+
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (!Conf_Server[i].name[0])
+ continue;
+ if (Conf_NickIsService(i, Nick))
+ return true;
+ }
+ return false;
}
/**
PACKAGE_NAME, PACKAGE_VERSION);
free(Conf_ListenAddress);
Conf_ListenAddress = NULL;
+ array_free(&Conf_ListenPorts);
array_free(&Conf_Motd);
strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
Conf_MorePrivacy = false;
Conf_NoticeAuth = false;
Conf_OperCanMode = false;
+ Conf_OperChanPAutoOp = true;
Conf_OperServerMode = false;
#ifdef PAM
Conf_PAM = true;
|| strcasecmp(Var, "ConnectIPv4") == 0
|| strcasecmp(Var, "ConnectIPv6") == 0
|| strcasecmp(Var, "OperCanUseMode") == 0
+ || strcasecmp(Var, "OperChanPAutoOp") == 0
|| strcasecmp(Var, "OperServerMode") == 0
|| strcasecmp(Var, "PredefChannelsOnly") == 0
|| strcasecmp(Var, "SyslogFacility") == 0
return;
}
if (strcasecmp(Var, "MaxConnections") == 0) {
- Conf_MaxConnections = atol(Arg);
+ Conf_MaxConnections = atoi(Arg);
if (!Conf_MaxConnections && strcmp(Arg, "0"))
Config_Error_NaN(Line, Var);
return;
Conf_OperCanMode = Check_ArgIsTrue(Arg);
return;
}
+ if (strcasecmp(Var, "OperChanPAutoOp") == 0) {
+ Conf_OperChanPAutoOp = Check_ArgIsTrue(Arg);
+ return;
+ }
if (strcasecmp(Var, "OperServerMode") == 0) {
Conf_OperServerMode = Check_ArgIsTrue(Arg);
return;
bool config_valid = true;
char *ptr;
+ /* Emit a warning when the config file is not a full path name */
+ if (NGIRCd_ConfFile[0] && NGIRCd_ConfFile[0] != '/') {
+ Config_Error(LOG_WARNING,
+ "Not specifying a full path name to \"%s\" can cause problems when rehashing the server!",
+ NGIRCd_ConfFile);
+ }
+
/* Validate configured server name, see RFC 2812 section 2.3.1 */
ptr = Conf_ServerName;
do {