+#ifdef WANT_IPV6
+#define DEFAULT_LISTEN_ADDRSTR "::,0.0.0.0"
+#else
+#define DEFAULT_LISTEN_ADDRSTR "0.0.0.0"
+#endif
+
+#ifdef SSL_SUPPORT
+struct SSLOptions Conf_SSLOptions;
+
+static void
+ConfSSL_Init(void)
+{
+ free(Conf_SSLOptions.KeyFile);
+ Conf_SSLOptions.KeyFile = NULL;
+
+ free(Conf_SSLOptions.CertFile);
+ Conf_SSLOptions.CertFile = NULL;
+
+ free(Conf_SSLOptions.DHFile);
+ Conf_SSLOptions.DHFile = NULL;
+ array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
+}
+
+static bool
+ssl_print_configvar(const char *name, const char *file)
+{
+ FILE *fp;
+
+ if (!file) {
+ printf(" %s =\n", name);
+ return true;
+ }
+
+ fp = fopen(file, "r");
+ if (fp)
+ fclose(fp);
+ else
+ fprintf(stderr, "ERROR: %s \"%s\": %s\n",
+ name, file, strerror(errno));
+
+ printf(" %s = %s\n", name, file);
+ return fp != NULL;
+}
+
+static bool
+ConfSSL_Puts(void)
+{
+ bool ret;
+
+ ret = ssl_print_configvar("SSLKeyFile", Conf_SSLOptions.KeyFile);
+
+ if (!ssl_print_configvar("SSLCertFile", Conf_SSLOptions.CertFile))
+ ret = false;
+
+ if (!ssl_print_configvar("SSLDHFile", Conf_SSLOptions.DHFile))
+ ret = false;
+
+ if (array_bytes(&Conf_SSLOptions.KeyFilePassword))
+ puts(" SSLKeyFilePassword = <secret>");
+
+ array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
+
+ return ret;
+}
+#endif
+
+static char *
+strdup_warn(const char *str)
+{
+ char *ptr = strdup(str);
+ if (!ptr)
+ Config_Error(LOG_ERR, "Could not allocate mem for string: %s", str);
+ return ptr;
+}
+
+
+static void
+ports_puts(array *a)
+{
+ size_t len;
+ UINT16 *ports;
+ len = array_length(a, sizeof(UINT16));
+ if (len--) {
+ ports = (UINT16*) array_start(a);
+ printf("%u", (unsigned int) *ports);
+ while (len--) {
+ ports++;
+ printf(", %u", (unsigned int) *ports);
+ }
+ }
+ putc('\n', stdout);
+}
+
+
+static void
+ports_parse(array *a, int Line, char *Arg)
+{
+ char *ptr;
+ int port;
+ UINT16 port16;
+
+ array_trunc(a);
+
+ /* Ports on that the server should listen. More port numbers
+ * must be separated by "," */
+ ptr = strtok( Arg, "," );
+ while (ptr) {
+ ngt_TrimStr(ptr);
+ port = atoi(ptr);
+ if (port > 0 && port < 0xFFFF) {
+ port16 = (UINT16) port;
+ if (!array_catb(a, (char*)&port16, sizeof port16))
+ Config_Error(LOG_ERR, "%s, line %d Could not add port number %ld: %s",
+ NGIRCd_ConfFile, Line, port, strerror(errno));
+ } else {
+ Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!",
+ NGIRCd_ConfFile, Line, port );
+ }
+
+ ptr = strtok( NULL, "," );
+ }
+}