+/**
+ * Generate ngIRCd "version strings".
+ *
+ * The ngIRCd version information is generated once and then stored in the
+ * NGIRCd_Version and NGIRCd_VersionAddition string variables for further
+ * usage, for example by the IRC command "VERSION" and the --version command
+ * line switch.
+ */
+static void
+Fill_Version(void)
+{
+ NGIRCd_VersionAddition[0] = '\0';
+
+#ifdef ICONV
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "CHARCONV",
+ 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 IDENTAUTH
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "IDENT",
+ sizeof NGIRCd_VersionAddition);
+#endif
+#ifdef WANT_IPV6
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof(NGIRCd_VersionAddition));
+ strlcat(NGIRCd_VersionAddition, "IPv6",
+ sizeof(NGIRCd_VersionAddition));
+#endif
+#ifdef IRCPLUS
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "IRCPLUS",
+ sizeof NGIRCd_VersionAddition);
+#endif
+#ifdef PAM
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "PAM",
+ 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 SNIFFER
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "SNIFFER",
+ sizeof NGIRCd_VersionAddition);
+#endif
+#ifdef SSL_SUPPORT
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "SSL",
+ sizeof NGIRCd_VersionAddition);
+#endif
+#ifdef SYSLOG
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "SYSLOG",
+ 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 ZLIB
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "+",
+ sizeof NGIRCd_VersionAddition);
+ strlcat(NGIRCd_VersionAddition, "ZLIB",
+ sizeof NGIRCd_VersionAddition);
+#endif
+ if (NGIRCd_VersionAddition[0])
+ strlcat(NGIRCd_VersionAddition, "-",
+ sizeof(NGIRCd_VersionAddition));
+
+ strlcat(NGIRCd_VersionAddition, HOST_CPU,
+ sizeof(NGIRCd_VersionAddition));
+ strlcat(NGIRCd_VersionAddition, "/", sizeof(NGIRCd_VersionAddition));
+ strlcat(NGIRCd_VersionAddition, HOST_VENDOR,
+ sizeof(NGIRCd_VersionAddition));
+ strlcat(NGIRCd_VersionAddition, "/", sizeof(NGIRCd_VersionAddition));
+ strlcat(NGIRCd_VersionAddition, HOST_OS,
+ sizeof(NGIRCd_VersionAddition));
+
+ snprintf(NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s",
+ PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
+} /* Fill_Version */
+
+
+/**
+ * Display copyright and version information of ngIRCd on the console.
+ */
+static void
+Show_Version( void )
+{
+ puts( NGIRCd_Version );
+ puts( "Copyright (c)2001-2014 Alexander Barton (<alex@barton.de>) and Contributors." );
+ puts( "Homepage: <http://ngircd.barton.de/>\n" );
+ puts( "This is free software; see the source for copying conditions. There is NO" );
+ puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
+} /* Show_Version */
+
+
+/**
+ * Display a short help text on the console.
+ * This help depends on the configuration of the executable and only shows
+ * options that are actually enabled.
+ */
+static void
+Show_Help( void )
+{
+#ifdef DEBUG
+ puts( " -d, --debug log extra debug messages" );
+#endif
+ puts( " -f, --config <f> use file <f> as configuration file" );
+ puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" );
+ puts( " -p, --passive disable automatic connections to other servers" );
+#ifdef SNIFFER
+ puts( " -s, --sniffer enable network sniffer and display all IRC traffic" );
+#endif
+ puts( " -t, --configtest read, validate and display configuration; then exit" );
+ puts( " -V, --version output version information and exit" );
+ puts( " -h, --help display this help and exit" );
+} /* Show_Help */
+
+
+/**
+ * Delete the file containing the process ID (PID).
+ */
+static void
+Pidfile_Delete( void )
+{
+ /* Pidfile configured? */
+ if( ! Conf_PidFile[0] ) return;
+
+#ifdef DEBUG
+ Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile );
+#endif
+
+ if( unlink( Conf_PidFile ))
+ Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno ));
+} /* Pidfile_Delete */
+
+
+/**
+ * Create the file containing the process ID of ngIRCd ("PID file").
+ *
+ * @param pid The process ID to be stored in this file.
+ */
+static void
+Pidfile_Create(pid_t pid)