/*++ /* NAME /* msg_output 3 /* SUMMARY /* diagnostics output management /* SYNOPSIS /* #include <msg_output.h> /* /* typedef void (*MSG_OUTPUT_FN)(int level, char *text) /* /* void msg_output(output_fn) /* MSG_OUTPUT_FN output_fn; /* /* void msg_printf(level, format, ...) /* int level; /* const char *format; /* /* void msg_vprintf(level, format, ap) /* int level; /* const char *format; /* va_list ap; /* DESCRIPTION /* This module implements low-level output management for the /* msg(3) diagnostics interface. /* /* msg_output() registers an output handler for the diagnostics /* interface. An application can register multiple output handlers. /* Output handlers are called in the specified order. /* An output handler takes as arguments a severity level (MSG_INFO, /* MSG_WARN, MSG_ERROR, MSG_FATAL, MSG_PANIC, monotonically increasing /* integer values ranging from 0 to MSG_LAST) and pre-formatted, /* sanitized, text in the form of a null-terminated string. /* /* msg_printf() and msg_vprintf() format their arguments, sanitize the /* result, and call the output handlers registered with msg_output(). /* /* msg_text() copies a pre-formatted text, sanitizes the result, and /* calls the output handlers registered with msg_output(). /* REENTRANCY /* .ad /* .fi /* The above output routines are protected against ordinary /* recursive calls and against re-entry by signal /* handlers, with the following limitations: /* .IP \(bu /* The signal handlers must never return. In other words, the /* signal handlers must do one or more of the following: call /* _exit(), kill the process with a signal, and permanently /* block the process. /* .IP \(bu /* The signal handlers must call the above output routines not /* until after msg_output() completes initialization, and not /* until after the first formatted output to a VSTRING or /* VSTREAM. /* .IP \(bu /* Each msg_output() call-back function, and each Postfix or /* system function called by that call-back function, either /* must protect itself against recursive calls and re-entry /* by a terminating signal handler, or it must be called /* exclusively by functions in the msg_output(3) module. /* .PP /* When re-entrancy is detected, the requested output operation /* is skipped. This prevents memory corruption of VSTREAM_ERR /* data structures, and prevents deadlock on Linux releases /* that use mutexes within system library routines such as /* syslog(). This protection exists under the condition that /* these specific resources are accessed exclusively via /* msg_output() call-back functions. /* LICENSE /* .ad /* .fi /* The Secure Mailer license must be distributed with this software. /* AUTHOR(S) /* Wietse Venema /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA /* /* Wietse Venema /* Google, Inc. /* 111 8th Avenue /* New York, NY 10011, USA
/*--*/
va_start(ap, format);
msg_vprintf(level, format, ap);
va_end(ap);
}
/* msg_vprintf - format text and log it */
void msg_vprintf(int level, constchar *format, va_list ap)
{ int saved_errno = errno;
VSTRING *vp; int i;
if (msg_vprintf_level < MSG_OUT_NESTING_LIMIT) {
msg_vprintf_level += 1; /* On-the-fly initialization for test programs and startup errors. */ if (msg_output_fn_count == 0)
msg_vstream_init("unknown", VSTREAM_ERR);
vp = msg_buffers[msg_vprintf_level - 1]; /* OK if terminating signal handler hijacks control before next stmt. */
vstring_vsprintf(vp, format, ap);
printable(vstring_str(vp), '?'); for (i = 0; i < msg_output_fn_count; i++)
msg_output_fn[i] (level, vstring_str(vp));
msg_vprintf_level -= 1;
}
errno = saved_errno;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.