+/**
+ * Generate ngIRCd "version string".
+ * This string is generated once and then stored in NGIRCd_Version for
+ * further usage, for example by the IRC command VERSION and the --version
+ * command line switch.
+ */
+LOCAL void
+Fill_Version( void )
+{
+ NGIRCd_VersionAddition[0] = '\0';
+
+#ifdef SYSLOG
+ strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef ZLIB
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef TCPWRAP
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef ZEROCONF
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef IDENTAUTH
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef DEBUG
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef SNIFFER
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef STRICT_RFC
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
+#endif
+#ifdef IRCPLUS
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
+
+ strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
+#endif
+
+ if( NGIRCd_VersionAddition[0] )
+ strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition ));
+
+ strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition ));
+ strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
+ strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition ));
+ strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
+ strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition ));
+
+#ifdef CVSDATE
+ snprintf( NGIRCd_Version, sizeof NGIRCd_Version,"%s %s(%s)-%s", PACKAGE_NAME, PACKAGE_VERSION, CVSDATE, NGIRCd_VersionAddition);
+#else
+ snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
+#endif
+} /* Fill_Version */
+
+
+/**
+ * Reload the server configuration file.
+ */
+GLOBAL void
+NGIRCd_Rehash( void )
+{
+ char old_name[CLIENT_ID_LEN];
+
+ Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" );
+ NGIRCd_SignalRehash = false;
+
+ /* Close down all listening sockets */
+ Conn_ExitListeners( );
+
+ /* Remember old server name */
+ strlcpy( old_name, Conf_ServerName, sizeof old_name );
+
+ /* Re-read configuration ... */
+ Conf_Rehash( );
+
+ /* Recover old server name: it can't be changed during run-time */
+ if( strcmp( old_name, Conf_ServerName ) != 0 )
+ {
+ strcpy( Conf_ServerName, old_name );
+ Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." );
+ }
+
+ /* Create new pre-defined channels */
+ Channel_InitPredefined( );
+
+ /* Start listening on sockets */
+ Conn_InitListeners( );
+
+ /* Sync configuration with established connections */
+ Conn_SyncServerStruct( );
+
+ Log( LOG_NOTICE|LOG_snotice, "Re-reading of configuration done." );
+} /* NGIRCd_Rehash */
+
+
+/**
+ * Initialize the signal handler.
+ */
+LOCAL void
+Initialize_Signal_Handler( void )