/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2016 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
* by the loader of the operating system.
*/
-#include "imp.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
-#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <mcheck.h>
#endif
-#include "defines.h"
#include "conn.h"
#include "class.h"
-#include "conf-ssl.h"
#include "channel.h"
#include "conf.h"
-#include "lists.h"
#include "log.h"
-#include "parse.h"
#include "sighandlers.h"
#include "io.h"
-#include "irc.h"
-#include "exp.h"
#include "ngircd.h"
-
static void Show_Version PARAMS(( void ));
static void Show_Help PARAMS(( void ));
/* Initialize the "main program": chroot environment, user and
* group ID, ... */
if (!NGIRCd_Init(NGIRCd_NoDaemon)) {
- Log(LOG_ALERT, "Fatal: Initialization failed");
+ Log(LOG_ALERT, "Fatal: Initialization failed, exiting!");
exit(1);
}
PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION,
IRCPLUSFLAGS);
#ifdef ZLIB
- strcat(NGIRCd_ProtoID, "Z");
+ strlcat(NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID);
#endif
if (Conf_OperCanMode)
- strcat(NGIRCd_ProtoID, "o");
+ strlcat(NGIRCd_ProtoID, "o", sizeof NGIRCd_ProtoID);
#else /* IRCPLUS */
snprintf(NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s",
PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION);
{
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, "+",
Show_Version( void )
{
puts( NGIRCd_Version );
- puts( "Copyright (c)2001-2012 Alexander Barton (<alex@barton.de>) and Contributors." );
+ puts( "Copyright (c)2001-2016 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." );
len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
if (len < 0 || len >= (int)sizeof pidbuf) {
- Log(LOG_ERR, "Error converting pid");
+ Log(LOG_ERR, "Error converting process ID!");
close(pidfd);
return;
}
-
+
if (write(pidfd, pidbuf, (size_t)len) != (ssize_t)len)
- Log( LOG_ERR, "Can't write PID file (%s): %s", Conf_PidFile, strerror( errno ));
+ Log(LOG_ERR, "Can't write PID file (%s): %s!", Conf_PidFile,
+ strerror(errno));
- if( close(pidfd) != 0 )
- Log( LOG_ERR, "Error closing PID file (%s): %s", Conf_PidFile, strerror( errno ));
+ if (close(pidfd) != 0)
+ Log(LOG_ERR, "Error closing PID file (%s): %s!", Conf_PidFile,
+ strerror(errno));
} /* Pidfile_Create */
/**
- * Redirect stdin, stdout and stderr to apropriate file handles.
+ * Redirect stdin, stdout and stderr to appropriate file handles.
*
* @param fd The file handle stdin, stdout and stderr should be redirected to.
*/
} /* Setup_FDStreams */
+#if !defined(SINGLE_USER_OS)
+
/**
* Get user and group ID of unprivileged "nobody" user.
*
return true;
} /* NGIRCd_getNobodyID */
+#endif
+
+
+#ifdef HAVE_ARC4RANDOM
+static void
+Random_Init(void)
+{
+}
+#else
static bool
Random_Init_Kern(const char *file)
{
return;
srand(rand() ^ (unsigned)getpid() ^ (unsigned)time(NULL));
}
+#endif
/**
}
/* SSL initialization */
- if (!ConnSSL_InitLibrary())
- Log(LOG_WARNING,
- "Error during SSL initialization, continuing without SSL ...");
+ if (!ConnSSL_InitLibrary()) {
+ Log(LOG_ERR, "Error during SSL initialization!");
+ goto out;
+ }
/* Change root */
if (Conf_Chroot[0]) {
if (chdir(Conf_Chroot) != 0) {
- Log(LOG_ERR, "Can't chdir() in ChrootDir (%s): %s",
+ Log(LOG_ERR, "Can't chdir() in ChrootDir (%s): %s!",
Conf_Chroot, strerror(errno));
goto out;
}
if (chroot(Conf_Chroot) != 0) {
Log(LOG_ERR,
- "Can't change root directory to \"%s\": %s",
+ "Can't change root directory to \"%s\": %s!",
Conf_Chroot, strerror(errno));
goto out;
} else {
}
}
+#if !defined(SINGLE_USER_OS)
/* Check user ID */
if (Conf_UID == 0) {
pwd = getpwuid(0);
if (setgid(Conf_GID) != 0) {
real_errno = errno;
grp = getgrgid(Conf_GID);
- Log(LOG_ERR, "Can't change group ID to %s(%u): %s",
+ Log(LOG_ERR, "Can't change group ID to %s(%u): %s!",
grp ? grp->gr_name : "?", Conf_GID,
- strerror(errno));
- if (real_errno != EPERM)
+ strerror(real_errno));
+ if (real_errno != EPERM)
+ goto out;
+ }
+#ifdef HAVE_SETGROUPS
+ if (setgroups(0, NULL) != 0) {
+ real_errno = errno;
+ Log(LOG_ERR, "Can't drop supplementary group IDs: %s!",
+ strerror(errno));
+ if (real_errno != EPERM)
goto out;
}
+#else
+ Log(LOG_WARNING,
+ "Can't drop supplementary group IDs: setgroups(3) missing!");
+#endif
}
+#endif
/* Change user ID */
if (getuid() != Conf_UID) {
if (setuid(Conf_UID) != 0) {
real_errno = errno;
pwd = getpwuid(Conf_UID);
- Log(LOG_ERR, "Can't change user ID to %s(%u): %s",
+ Log(LOG_ERR, "Can't change user ID to %s(%u): %s!",
pwd ? pwd->pw_name : "?", Conf_UID,
- strerror(errno));
+ strerror(real_errno));
if (real_errno != EPERM)
goto out;
}
setpgrp(0, getpid());
#endif
if (chdir("/") != 0)
- Log(LOG_ERR, "Can't change directory to '/': %s",
+ Log(LOG_ERR, "Can't change directory to '/': %s!",
strerror(errno));
/* Detach stdin, stdout and stderr */
"Changed working directory to \"%s\" ...",
pwd->pw_dir);
else
- Log(LOG_INFO,
- "Notice: Can't change working directory to \"%s\": %s",
+ Log(LOG_ERR,
+ "Can't change working directory to \"%s\": %s!",
pwd->pw_dir, strerror(errno));
} else
Log(LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID);