Annotation of ircnowd/src/ngircd/log.c, Revision 1.1
1.1 ! tomglok 1: /*
! 2: * ngIRCd -- The Next Generation IRC Daemon
! 3: * Copyright (c)2001-2019 Alexander Barton (alex@barton.de) and Contributors.
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify
! 6: * it under the terms of the GNU General Public License as published by
! 7: * the Free Software Foundation; either version 2 of the License, or
! 8: * (at your option) any later version.
! 9: * Please read the file COPYING, README and AUTHORS for more information.
! 10: */
! 11:
! 12: #include "portab.h"
! 13:
! 14: /**
! 15: * @file
! 16: * Logging functions
! 17: */
! 18:
! 19: #include <assert.h>
! 20: #ifdef PROTOTYPES
! 21: # include <stdarg.h>
! 22: #else
! 23: # include <varargs.h>
! 24: #endif
! 25: #include <stdio.h>
! 26: #include <sys/types.h>
! 27: #include <time.h>
! 28: #include <unistd.h>
! 29:
! 30: #ifdef SYSLOG
! 31: # include <syslog.h>
! 32: #endif
! 33:
! 34: #include "ngircd.h"
! 35: #include "conn.h"
! 36: #include "channel.h"
! 37: #include "irc-write.h"
! 38: #include "conf.h"
! 39:
! 40: #include "log.h"
! 41:
! 42: static bool Is_Daemon;
! 43:
! 44:
! 45: static void
! 46: Log_Message(int Level, const char *msg)
! 47: {
! 48: if (!Is_Daemon) {
! 49: /* log to console */
! 50: fprintf(stdout, "[%ld:%d %4ld] %s\n", (long)getpid(), Level,
! 51: (long)(time(NULL) - NGIRCd_Start), msg);
! 52: fflush(stdout);
! 53: }
! 54: #ifdef SYSLOG
! 55: else {
! 56: syslog(Level, "%s", msg);
! 57: }
! 58: #endif
! 59: }
! 60:
! 61:
! 62: /**
! 63: * Initialitze logging.
! 64: * This function is called before the configuration file is read in.
! 65: *
! 66: * @param Daemon_Mode Set to true if ngIRCd is running as daemon.
! 67: */
! 68: GLOBAL void
! 69: Log_Init(bool Daemon_Mode)
! 70: {
! 71: Is_Daemon = Daemon_Mode;
! 72:
! 73: #ifdef SYSLOG
! 74: #ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
! 75: #define LOG_CONS 0
! 76: #endif
! 77: #ifdef LOG_DAEMON
! 78: openlog(PACKAGE, LOG_CONS|LOG_PID, LOG_DAEMON);
! 79: #else
! 80: openlog(PACKAGE, LOG_CONS|LOG_PID, 0);
! 81: #endif
! 82: #endif
! 83: Log(LOG_NOTICE, "%s starting ...", NGIRCd_Version);
! 84: } /* Log_Init */
! 85:
! 86:
! 87: /**
! 88: * Re-init logging after reading the configuration file.
! 89: */
! 90: GLOBAL void
! 91: Log_ReInit(void)
! 92: {
! 93: #ifdef SYSLOG
! 94: #ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
! 95: #define LOG_CONS 0
! 96: #endif
! 97: closelog();
! 98: openlog(PACKAGE, LOG_CONS|LOG_PID, Conf_SyslogFacility);
! 99: #endif
! 100: }
! 101:
! 102:
! 103: GLOBAL void
! 104: Log_Exit( void )
! 105: {
! 106: Log(LOG_NOTICE, "%s done%s, served %lu connection%s.", PACKAGE_NAME,
! 107: NGIRCd_SignalRestart ? " (restarting)" : "", Conn_CountAccepted(),
! 108: Conn_CountAccepted() == 1 ? "" : "s");
! 109: #ifdef SYSLOG
! 110: closelog();
! 111: #endif
! 112: } /* Log_Exit */
! 113:
! 114:
! 115: /**
! 116: * Log function for debug messages.
! 117: * This function is only functional when the program is compiled with debug
! 118: * code enabled; otherwise it is an empty function which the compiler will
! 119: * hopefully mangle down to "nothing" (see log.h). Therefore you should use
! 120: * LogDebug(...) in favor to Log(LOG_DEBUG, ...).
! 121: * @param Format Format string like printf().
! 122: * @param ... Further arguments.
! 123: */
! 124: #ifdef DEBUG
! 125: # ifdef PROTOTYPES
! 126: GLOBAL void
! 127: LogDebug( const char *Format, ... )
! 128: # else
! 129: GLOBAL void
! 130: LogDebug( Format, va_alist )
! 131: const char *Format;
! 132: va_dcl
! 133: # endif /* PROTOTYPES */
! 134: {
! 135: char msg[MAX_LOG_MSG_LEN];
! 136: va_list ap;
! 137:
! 138: if (!NGIRCd_Debug) return;
! 139: #ifdef PROTOTYPES
! 140: va_start( ap, Format );
! 141: #else
! 142: va_start( ap );
! 143: #endif
! 144: vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
! 145: va_end( ap );
! 146: Log(LOG_DEBUG, "%s", msg);
! 147: }
! 148: #endif /* DEBUG */
! 149:
! 150:
! 151: /**
! 152: * Logging function of ngIRCd.
! 153: * This function logs messages to the console and/or syslog, whichever is
! 154: * suitable for the mode ngIRCd is running in (daemon vs. non-daemon).
! 155: * If LOG_snotice is set, the log messages goes to all user with the mode +s
! 156: * set and the local &SERVER channel, too.
! 157: * Please note: you should use LogDebug(...) for debug messages!
! 158: * @param Level syslog level (LOG_xxx)
! 159: * @param Format Format string like printf().
! 160: * @param ... Further arguments.
! 161: */
! 162: #ifdef PROTOTYPES
! 163: GLOBAL void
! 164: Log( int Level, const char *Format, ... )
! 165: #else
! 166: GLOBAL void
! 167: Log( Level, Format, va_alist )
! 168: int Level;
! 169: const char *Format;
! 170: va_dcl
! 171: #endif
! 172: {
! 173: char msg[MAX_LOG_MSG_LEN];
! 174: bool snotice;
! 175: va_list ap;
! 176:
! 177: assert( Format != NULL );
! 178:
! 179: if( Level & LOG_snotice )
! 180: {
! 181: /* Notice an User mit "s" Mode */
! 182: snotice = true;
! 183: Level &= ~LOG_snotice;
! 184: }
! 185: else snotice = false;
! 186:
! 187: #ifdef DEBUG
! 188: if(( Level == LOG_DEBUG ) && ( ! NGIRCd_Debug )) return;
! 189: #else
! 190: if( Level == LOG_DEBUG ) return;
! 191: #endif
! 192:
! 193: #ifdef PROTOTYPES
! 194: va_start( ap, Format );
! 195: #else
! 196: va_start( ap );
! 197: #endif
! 198: vsnprintf( msg, MAX_LOG_MSG_LEN, Format, ap );
! 199: va_end( ap );
! 200:
! 201: Log_Message(Level, msg);
! 202:
! 203: if (snotice) {
! 204: /* Send NOTICE to all local users with mode +s and to the
! 205: * local &SERVER channel */
! 206: Log_ServerNotice('s', "%s", msg);
! 207: Channel_LogServer(msg);
! 208: }
! 209: } /* Log */
! 210:
! 211:
! 212: GLOBAL void
! 213: Log_Init_Subprocess(char UNUSED *Name)
! 214: {
! 215: #ifdef SYSLOG
! 216: openlog(PACKAGE, LOG_CONS|LOG_PID, Conf_SyslogFacility);
! 217: #endif
! 218: #ifdef DEBUG
! 219: Log_Subprocess(LOG_DEBUG, "%s sub-process starting, PID %ld.",
! 220: Name, (long)getpid());
! 221: #endif
! 222: }
! 223:
! 224:
! 225: GLOBAL void
! 226: Log_Exit_Subprocess(char UNUSED *Name)
! 227: {
! 228: #ifdef DEBUG
! 229: Log_Subprocess(LOG_DEBUG, "%s sub-process %ld done.",
! 230: Name, (long)getpid());
! 231: #endif
! 232: #ifdef SYSLOG
! 233: closelog( );
! 234: #endif
! 235: }
! 236:
! 237:
! 238: #ifdef PROTOTYPES
! 239: GLOBAL void
! 240: Log_Subprocess(const int Level, const char *Format, ...)
! 241: #else
! 242: GLOBAL void
! 243: Log_Subprocess(Level, Format, va_alist)
! 244: const int Level;
! 245: const char *Format;
! 246: va_dcl
! 247: #endif
! 248: {
! 249: char msg[MAX_LOG_MSG_LEN];
! 250: va_list ap;
! 251:
! 252: assert(Format != NULL);
! 253:
! 254: #ifdef DEBUG
! 255: if ((Level == LOG_DEBUG) && (!NGIRCd_Debug))
! 256: return;
! 257: #else
! 258: if (Level == LOG_DEBUG)
! 259: return;
! 260: #endif
! 261:
! 262: #ifdef PROTOTYPES
! 263: va_start(ap, Format);
! 264: #else
! 265: va_start(ap);
! 266: #endif
! 267: vsnprintf(msg, MAX_LOG_MSG_LEN, Format, ap);
! 268: va_end(ap);
! 269:
! 270: Log_Message(Level, msg);
! 271: }
! 272:
! 273:
! 274: /**
! 275: * Send a log message to all local users flagged with the given user mode.
! 276: * @param UserMode User mode which the target user must have set,
! 277: * @param Format The format string.
! 278: */
! 279: #ifdef PROTOTYPES
! 280: GLOBAL void
! 281: Log_ServerNotice(const char UserMode, const char *Format, ... )
! 282: #else
! 283: GLOBAL void
! 284: Log_ServerNotice(UserMode, Format, va_alist)
! 285: const char UserMode;
! 286: const char *Format;
! 287: va_dcl
! 288: #endif
! 289: {
! 290: CLIENT *c;
! 291: char msg[MAX_LOG_MSG_LEN];
! 292: va_list ap;
! 293:
! 294: assert(Format != NULL);
! 295:
! 296: #ifdef PROTOTYPES
! 297: va_start(ap, Format);
! 298: #else
! 299: va_start(ap);
! 300: #endif
! 301: vsnprintf(msg, MAX_LOG_MSG_LEN, Format, ap);
! 302: va_end(ap);
! 303:
! 304: for(c=Client_First(); c != NULL; c=Client_Next(c)) {
! 305: if (Client_Conn(c) > NONE && Client_HasMode(c, UserMode))
! 306: IRC_WriteStrClient(c, "NOTICE %s :%s%s", Client_ID(c),
! 307: NOTICE_TXTPREFIX, msg);
! 308: }
! 309: } /* Log_ServerNotice */
! 310:
! 311:
! 312: /* -eof- */
CVSweb