X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fngircd.c;h=da537055ffdd742960a425a067ddfd3a62540f98;hp=874dfa3f6bb7de2ae9a8bc632a7a65f8ce58b38e;hb=17589534d0ccff05463910d1f0ba673d7d1630fd;hpb=1bb2fbedcc975aa6e424fd201f59a178a03d45b0 diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 874dfa3f..da537055 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2013 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 @@ -255,16 +255,16 @@ main(int argc, const char *argv[]) NGIRCd_SignalRestart = false; NGIRCd_SignalQuit = false; - Random_Init(); - /* Initialize modules, part I */ Log_Init(!NGIRCd_NoDaemon); + Random_Init(); Conf_Init(); + Log_ReInit(); /* 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); } @@ -297,10 +297,10 @@ main(int argc, const char *argv[]) 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); @@ -330,6 +330,7 @@ main(int argc, const char *argv[]) Channel_Exit(); Class_Exit(); Log_Exit(); + Signals_Exit(); } Pidfile_Delete(); @@ -346,70 +347,106 @@ main(int argc, const char *argv[]) * line switch. */ static void -Fill_Version( void ) +Fill_Version(void) { NGIRCd_VersionAddition[0] = '\0'; -#ifdef SYSLOG - strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition ); +#ifdef ICONV + if (NGIRCd_VersionAddition[0]) + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "CHARCONV", + sizeof NGIRCd_VersionAddition); #endif -#ifdef ZLIB - if( NGIRCd_VersionAddition[0] ) - strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition ); +#ifdef DEBUG + if (NGIRCd_VersionAddition[0]) + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "DEBUG", + sizeof NGIRCd_VersionAddition); #endif -#ifdef SSL_SUPPORT - if ( NGIRCd_VersionAddition[0] ) strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "SSL", sizeof NGIRCd_VersionAddition ); +#ifdef IDENTAUTH + if (NGIRCd_VersionAddition[0]) + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "IDENT", + sizeof NGIRCd_VersionAddition); #endif -#ifdef TCPWRAP - if( NGIRCd_VersionAddition[0] ) - strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition ); +#ifdef WANT_IPV6 + if (NGIRCd_VersionAddition[0]) + strlcat(NGIRCd_VersionAddition, "+", + sizeof(NGIRCd_VersionAddition)); + strlcat(NGIRCd_VersionAddition, "IPv6", + sizeof(NGIRCd_VersionAddition)); #endif -#ifdef IDENTAUTH - if( NGIRCd_VersionAddition[0] ) - strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition ); +#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); + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "PAM", + sizeof NGIRCd_VersionAddition); #endif -#ifdef DEBUG - if( NGIRCd_VersionAddition[0] ) - strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition ); +#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 ); + 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 ); +#ifdef SSL_SUPPORT + if (NGIRCd_VersionAddition[0]) + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "SSL", + sizeof NGIRCd_VersionAddition); #endif -#ifdef IRCPLUS - if( NGIRCd_VersionAddition[0] ) - strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition ); +#ifdef SYSLOG + if (NGIRCd_VersionAddition[0]) + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "SYSLOG", + sizeof NGIRCd_VersionAddition); #endif -#ifdef WANT_IPV6 +#ifdef TCPWRAP if (NGIRCd_VersionAddition[0]) - strlcat(NGIRCd_VersionAddition, "+", sizeof(NGIRCd_VersionAddition)); - strlcat(NGIRCd_VersionAddition, "IPv6", sizeof(NGIRCd_VersionAddition)); + strlcat(NGIRCd_VersionAddition, "+", + sizeof NGIRCd_VersionAddition); + strlcat(NGIRCd_VersionAddition, "TCPWRAP", + 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 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); @@ -423,7 +460,7 @@ static void Show_Version( void ) { puts( NGIRCd_Version ); - puts( "Copyright (c)2001-2012 Alexander Barton () and Contributors." ); + puts( "Copyright (c)2001-2013 Alexander Barton () and Contributors." ); puts( "Homepage: \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." ); @@ -498,20 +535,23 @@ Pidfile_Create(pid_t pid) 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. */ @@ -529,6 +569,8 @@ Setup_FDStreams(int fd) } /* Setup_FDStreams */ +#if !defined(SINGLE_USER_OS) + /** * Get user and group ID of unprivileged "nobody" user. * @@ -568,7 +610,16 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid ) return true; } /* NGIRCd_getNobodyID */ +#endif + +#ifdef HAVE_ARC4RANDOM +static void +Random_Init(void) +{ + +} +#else static bool Random_Init_Kern(const char *file) { @@ -598,6 +649,7 @@ Random_Init(void) return; srand(rand() ^ (unsigned)getpid() ^ (unsigned)time(NULL)); } +#endif /** @@ -629,25 +681,24 @@ NGIRCd_Init(bool NGIRCd_NoDaemon) } /* SSL initialization */ - if (!ConnSSL_InitLibrary()) - Log(LOG_WARNING, - "Warning: Error during SSL initialization, continuing ..."); + 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) { - if (errno != EPERM) { - Log(LOG_ERR, - "Can't change root directory to \"%s\": %s", - Conf_Chroot, strerror(errno)); - goto out; - } + Log(LOG_ERR, + "Can't change root directory to \"%s\": %s!", + Conf_Chroot, strerror(errno)); + goto out; } else { chrooted = true; Log(LOG_INFO, @@ -656,6 +707,7 @@ NGIRCd_Init(bool NGIRCd_NoDaemon) } } +#if !defined(SINGLE_USER_OS) /* Check user ID */ if (Conf_UID == 0) { pwd = getpwuid(0); @@ -675,22 +727,30 @@ NGIRCd_Init(bool NGIRCd_NoDaemon) 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)); + strerror(real_errno)); if (real_errno != EPERM) goto out; } + 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; + } } +#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; } @@ -716,13 +776,13 @@ NGIRCd_Init(bool NGIRCd_NoDaemon) } /* New child process */ -#ifndef NeXT +#ifdef HAVE_SETSID (void)setsid(); #else 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 */ @@ -765,8 +825,8 @@ NGIRCd_Init(bool NGIRCd_NoDaemon) "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);