3 Copyright 1987, 1998 The Open Group
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
11 The above copyright notice and this permission notice shall be included
12 in all copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 OTHER DEALINGS IN THE SOFTWARE.
22 Except as contained in this notice, the name of The Open Group shall
23 not be used in advertising or otherwise to promote the sale, use or
24 other dealings in this Software without prior written authorization
27 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
28 Copyright 1994 Quarterdeck Office Systems.
32 Permission to use, copy, modify, and distribute this software and its
33 documentation for any purpose and without fee is hereby granted,
34 provided that the above copyright notice appear in all copies and that
35 both that copyright notice and this permission notice appear in
36 supporting documentation, and that the names of Digital and
37 Quarterdeck not be used in advertising or publicity pertaining to
38 distribution of the software without specific, written prior
41 DIGITAL AND QUARTERDECK DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
42 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
43 FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT
44 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
45 OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
46 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
47 OR PERFORMANCE OF THIS SOFTWARE.
52 * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
54 * Permission is hereby granted, free of charge, to any person obtaining a
55 * copy of this software and associated documentation files (the "Software"),
56 * to deal in the Software without restriction, including without limitation
57 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
58 * and/or sell copies of the Software, and to permit persons to whom the
59 * Software is furnished to do so, subject to the following conditions:
61 * The above copyright notice and this permission notice shall be included in
62 * all copies or substantial portions of the Software.
64 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
65 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
67 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
68 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
69 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
70 * OTHER DEALINGS IN THE SOFTWARE.
72 * Except as contained in this notice, the name of the copyright holder(s)
73 * and author(s) shall not be used in advertising or otherwise to promote
74 * the sale, use or other dealings in this Software without prior written
75 * authorization from the copyright holder(s) and author(s).
78 #ifdef HAVE_DIX_CONFIG_H
79 #include <dix-config.h>
87 #include <stdlib.h> /* for malloc() */
95 #define getpid(x) _getpid(x)
99 #include "xf86bigfontsrv.h"
103 #pragma clang diagnostic ignored "-Wformat-nonliteral"
107 void (*OsVendorVErrorFProc
) (const char *, va_list args
) = NULL
;
110 static FILE *logFile
= NULL
;
111 static int logFileFd
= -1;
112 static Bool logFlush
= FALSE
;
113 static Bool logSync
= FALSE
;
114 static int logVerbosity
= DEFAULT_LOG_VERBOSITY
;
115 static int logFileVerbosity
= DEFAULT_LOG_FILE_VERBOSITY
;
117 /* Buffer to information logged before the log file is opened. */
118 static char *saveBuffer
= NULL
;
119 static int bufferSize
= 0, bufferUnused
= 0, bufferPos
= 0;
120 static Bool needBuffer
= TRUE
;
123 #include <AvailabilityMacros.h>
125 static char __crashreporter_info_buff__
[4096] = { 0 };
127 static const char *__crashreporter_info__
__attribute__ ((__used__
)) =
128 &__crashreporter_info_buff__
[0];
129 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
130 // This is actually a toolchain requirement, but I'm not sure the correct check,
131 // but it should be fine to just only include it for Leopard and later. This line
132 // just tells the linker to never strip this symbol (such as for space optimization)
133 asm(".desc ___crashreporter_info__, 0x10");
137 /* Prefix strings for log messages. */
138 #ifndef X_UNKNOWN_STRING
139 #define X_UNKNOWN_STRING "(\?\?)"
141 #ifndef X_PROBE_STRING
142 #define X_PROBE_STRING "(--)"
144 #ifndef X_CONFIG_STRING
145 #define X_CONFIG_STRING "(**)"
147 #ifndef X_DEFAULT_STRING
148 #define X_DEFAULT_STRING "(==)"
150 #ifndef X_CMDLINE_STRING
151 #define X_CMDLINE_STRING "(++)"
153 #ifndef X_NOTICE_STRING
154 #define X_NOTICE_STRING "(!!)"
156 #ifndef X_ERROR_STRING
157 #define X_ERROR_STRING "(EE)"
159 #ifndef X_WARNING_STRING
160 #define X_WARNING_STRING "(WW)"
162 #ifndef X_INFO_STRING
163 #define X_INFO_STRING "(II)"
165 #ifndef X_NOT_IMPLEMENTED_STRING
166 #define X_NOT_IMPLEMENTED_STRING "(NI)"
168 #ifndef X_DEBUG_STRING
169 #define X_DEBUG_STRING "(DB)"
171 #ifndef X_NONE_STRING
172 #define X_NONE_STRING ""
176 strlen_sigsafe(const char *s
)
179 for (len
= 0; s
[len
]; len
++);
184 * LogInit is called to start logging to a file. It is also called (with
185 * NULL arguments) when logging to a file is not wanted. It must always be
186 * called, otherwise log messages will continue to accumulate in a buffer.
188 * %s, if present in the fname or backup strings, is expanded to the display
193 LogInit(const char *fname
, const char *backup
)
195 char *logFileName
= NULL
;
197 if (fname
&& *fname
) {
198 if (asprintf(&logFileName
, fname
, display
) == -1)
199 FatalError("Cannot allocate space for the log file name\n");
201 if (backup
&& *backup
) {
204 if (!stat(logFileName
, &buf
) && S_ISREG(buf
.st_mode
)) {
208 if ((asprintf(&suffix
, backup
, display
) == -1) ||
209 (asprintf(&oldLog
, "%s%s", logFileName
, suffix
) == -1))
210 FatalError("Cannot allocate space for the log file name\n");
212 if (rename(logFileName
, oldLog
) == -1) {
213 FatalError("Cannot move old log file \"%s\" to \"%s\"\n",
214 logFileName
, oldLog
);
222 if ((logFile
= fopen(logFileName
, "w")) == NULL
)
223 FatalError("Cannot open log file \"%s\"\n", logFileName
);
224 setvbuf(logFile
, NULL
, _IONBF
, 0);
226 logFileFd
= fileno(logFile
);
228 /* Flush saved log information. */
229 if (saveBuffer
&& bufferSize
> 0) {
230 fwrite(saveBuffer
, bufferPos
, 1, logFile
);
233 fsync(fileno(logFile
));
239 * Unconditionally free the buffer, and flag that the buffer is no longer
242 if (saveBuffer
&& bufferSize
> 0) {
253 LogClose(enum ExitCode error
)
256 ErrorFSigSafe("Server terminated %s (%d). Closing log file.\n",
257 (error
== EXIT_NO_ERROR
) ? "successfully" : "with error", error
);
265 LogSetParameter(LogParameter param
, int value
)
269 logFlush
= value
? TRUE
: FALSE
;
272 logSync
= value
? TRUE
: FALSE
;
275 logVerbosity
= value
;
277 case XLOG_FILE_VERBOSITY
:
278 logFileVerbosity
= value
;
293 * Parse non-digit length modifiers and set the corresponding flag in
296 * @return the number of bytes parsed
298 static int parse_length_modifier(const char *format
, size_t len
, int *flags_return
)
301 int length_modifier
= 0;
304 switch (format
[idx
]) {
306 BUG_RETURN_VAL(length_modifier
& LMOD_SHORT
, 0);
308 if (length_modifier
& LMOD_LONG
)
309 length_modifier
|= LMOD_LONGLONG
;
311 length_modifier
|= LMOD_LONG
;
314 BUG_RETURN_VAL(length_modifier
& (LMOD_LONG
|LMOD_LONGLONG
), 0);
315 length_modifier
|= LMOD_SHORT
;
316 /* gcc says 'short int' is promoted to 'int' when
317 * passed through '...', so ignored during
321 length_modifier
|= LMOD_SIZET
;
330 *flags_return
= length_modifier
;
335 * Signal-safe snprintf, with some limitations over snprintf. Be careful
336 * which directives you use.
339 pnprintf(char *string
, size_t size
, const char *f
, va_list args
)
343 int f_len
= strlen_sigsafe(f
);
351 for (; f_idx
< f_len
&& s_idx
< size
- 1; f_idx
++) {
352 int length_modifier
= 0;
353 if (f
[f_idx
] != '%') {
354 string
[s_idx
++] = f
[f_idx
];
360 /* silently swallow digit length modifiers */
361 while (f_idx
< f_len
&& ((f
[f_idx
] >= '0' && f
[f_idx
] <= '9') || f
[f_idx
] == '.'))
364 /* non-digit length modifiers */
366 int parsed_bytes
= parse_length_modifier(&f
[f_idx
], f_len
- f_idx
, &length_modifier
);
367 if (parsed_bytes
< 0)
369 f_idx
+= parsed_bytes
;
377 string_arg
= va_arg(args
, char*);
378 p_len
= strlen_sigsafe(string_arg
);
380 for (i
= 0; i
< p_len
&& s_idx
< size
- 1; i
++)
381 string
[s_idx
++] = string_arg
[i
];
385 if (length_modifier
& LMOD_LONGLONG
)
386 ui
= va_arg(args
, unsigned long long);
387 else if (length_modifier
& LMOD_LONG
)
388 ui
= va_arg(args
, unsigned long);
389 else if (length_modifier
& LMOD_SIZET
)
390 ui
= va_arg(args
, size_t);
392 ui
= va_arg(args
, unsigned);
394 FormatUInt64(ui
, number
);
395 p_len
= strlen_sigsafe(number
);
397 for (i
= 0; i
< p_len
&& s_idx
< size
- 1; i
++)
398 string
[s_idx
++] = number
[i
];
402 if (length_modifier
& LMOD_LONGLONG
)
403 si
= va_arg(args
, long long);
404 else if (length_modifier
& LMOD_LONG
)
405 si
= va_arg(args
, long);
406 else if (length_modifier
& LMOD_SIZET
)
407 si
= va_arg(args
, ssize_t
);
409 si
= va_arg(args
, int);
411 FormatInt64(si
, number
);
412 p_len
= strlen_sigsafe(number
);
414 for (i
= 0; i
< p_len
&& s_idx
< size
- 1; i
++)
415 string
[s_idx
++] = number
[i
];
419 string
[s_idx
++] = '0';
420 if (s_idx
< size
- 1)
421 string
[s_idx
++] = 'x';
422 ui
= (uintptr_t)va_arg(args
, void*);
423 FormatUInt64Hex(ui
, number
);
424 p_len
= strlen_sigsafe(number
);
426 for (i
= 0; i
< p_len
&& s_idx
< size
- 1; i
++)
427 string
[s_idx
++] = number
[i
];
431 if (length_modifier
& LMOD_LONGLONG
)
432 ui
= va_arg(args
, unsigned long long);
433 else if (length_modifier
& LMOD_LONG
)
434 ui
= va_arg(args
, unsigned long);
435 else if (length_modifier
& LMOD_SIZET
)
436 ui
= va_arg(args
, size_t);
438 ui
= va_arg(args
, unsigned);
440 FormatUInt64Hex(ui
, number
);
441 p_len
= strlen_sigsafe(number
);
443 for (i
= 0; i
< p_len
&& s_idx
< size
- 1; i
++)
444 string
[s_idx
++] = number
[i
];
448 double d
= va_arg(args
, double);
449 FormatDouble(d
, number
);
450 p_len
= strlen_sigsafe(number
);
452 for (i
= 0; i
< p_len
&& s_idx
< size
- 1; i
++)
453 string
[s_idx
++] = number
[i
];
458 char c
= va_arg(args
, int);
459 if (s_idx
< size
- 1)
464 string
[s_idx
++] = '%';
467 BUG_WARN_MSG(f
[f_idx
], "Unsupported printf directive '%c'\n", f
[f_idx
]);
469 string
[s_idx
++] = '%';
470 if (s_idx
< size
- 1)
471 string
[s_idx
++] = f
[f_idx
];
476 string
[s_idx
] = '\0';
481 /* This function does the actual log message writes. It must be signal safe.
482 * When attempting to call non-signal-safe functions, guard them with a check
483 * of the inSignalContext global variable. */
485 LogSWrite(int verb
, const char *buf
, size_t len
, Bool end_line
)
487 static Bool newline
= TRUE
;
489 if (verb
< 0 || logVerbosity
>= verb
)
492 if (verb
< 0 || logFileVerbosity
>= verb
) {
493 if (inSignalContext
&& logFileFd
>= 0) {
494 write(logFileFd
, buf
, len
);
496 if (logFlush
&& logSync
)
500 else if (!inSignalContext
&& logFile
) {
502 fprintf(logFile
, "[%10.3f] ", GetTimeInMillis() / 1000.0);
504 fwrite(buf
, len
, 1, logFile
);
509 fsync(fileno(logFile
));
513 else if (!inSignalContext
&& needBuffer
) {
514 if (len
> bufferUnused
) {
516 bufferUnused
+= 1024;
517 saveBuffer
= realloc(saveBuffer
, bufferSize
);
519 FatalError("realloc() failed while saving log messages\n");
522 memcpy(saveBuffer
+ bufferPos
, buf
, len
);
529 LogVWrite(int verb
, const char *f
, va_list args
)
531 return LogVMessageVerb(X_NONE
, verb
, f
, args
);
535 LogWrite(int verb
, const char *f
, ...)
540 LogVWrite(verb
, f
, args
);
544 /* Returns the Message Type string to prepend to a logging message, or NULL
545 * if the message will be dropped due to insufficient verbosity. */
547 LogMessageTypeVerbString(MessageType type
, int verb
)
552 if (logVerbosity
< verb
&& logFileVerbosity
< verb
)
557 return X_PROBE_STRING
;
559 return X_CONFIG_STRING
;
561 return X_DEFAULT_STRING
;
563 return X_CMDLINE_STRING
;
565 return X_NOTICE_STRING
;
567 return X_ERROR_STRING
;
569 return X_WARNING_STRING
;
571 return X_INFO_STRING
;
572 case X_NOT_IMPLEMENTED
:
573 return X_NOT_IMPLEMENTED_STRING
;
575 return X_UNKNOWN_STRING
;
577 return X_NONE_STRING
;
579 return X_DEBUG_STRING
;
581 return X_UNKNOWN_STRING
;
586 LogVMessageVerb(MessageType type
, int verb
, const char *format
, va_list args
)
588 static unsigned int warned
;
589 const char *type_str
;
591 const size_t size
= sizeof(buf
);
595 if (inSignalContext
) {
597 BUG_WARN_MSG(inSignalContext
,
598 "Warning: attempting to log data in a signal unsafe "
599 "manner while in signal context.\nPlease update to check "
600 "inSignalContext and/or use LogMessageVerbSigSafe() or "
601 "ErrorFSigSafe().\nThe offending log format message is:\n"
605 LogMessageVerbSigSafe(X_WARNING
, -1, "Warned %u times about sigsafe logging. Will be quiet now.\n", warned
);
609 type_str
= LogMessageTypeVerbString(type
, verb
);
613 /* if type_str is not "", prepend it and ' ', to message */
614 if (type_str
[0] != '\0')
615 len
+= Xscnprintf(&buf
[len
], size
- len
, "%s ", type_str
);
618 len
+= Xvscnprintf(&buf
[len
], size
- len
, format
, args
);
620 /* Force '\n' at end of truncated line */
624 newline
= (buf
[len
- 1] == '\n');
625 LogSWrite(verb
, buf
, len
, newline
);
628 /* Log message with verbosity level specified. */
630 LogMessageVerb(MessageType type
, int verb
, const char *format
, ...)
634 va_start(ap
, format
);
635 LogVMessageVerb(type
, verb
, format
, ap
);
639 /* Log a message with the standard verbosity level of 1. */
641 LogMessage(MessageType type
, const char *format
, ...)
645 va_start(ap
, format
);
646 LogVMessageVerb(type
, 1, format
, ap
);
650 /* Log a message using only signal safe functions. */
652 LogMessageVerbSigSafe(MessageType type
, int verb
, const char *format
, ...)
655 va_start(ap
, format
);
656 LogVMessageVerbSigSafe(type
, verb
, format
, ap
);
661 LogVMessageVerbSigSafe(MessageType type
, int verb
, const char *format
, va_list args
)
663 const char *type_str
;
668 type_str
= LogMessageTypeVerbString(type
, verb
);
672 /* if type_str is not "", prepend it and ' ', to message */
673 if (type_str
[0] != '\0') {
674 LogSWrite(verb
, type_str
, strlen_sigsafe(type_str
), FALSE
);
675 LogSWrite(verb
, " ", 1, FALSE
);
678 len
= pnprintf(buf
, sizeof(buf
), format
, args
);
680 /* Force '\n' at end of truncated line */
681 if (sizeof(buf
) - len
== 1)
684 newline
= (buf
[len
- 1] == '\n');
685 LogSWrite(verb
, buf
, len
, newline
);
689 LogVHdrMessageVerb(MessageType type
, int verb
, const char *msg_format
,
690 va_list msg_args
, const char *hdr_format
, va_list hdr_args
)
692 static unsigned int warned
;
693 const char *type_str
;
695 const size_t size
= sizeof(buf
);
699 if (inSignalContext
) {
701 BUG_WARN_MSG(inSignalContext
,
702 "Warning: attempting to log data in a signal unsafe "
703 "manner while in signal context.\nPlease update to check "
704 "inSignalContext and/or use LogMessageVerbSigSafe().\nThe "
705 "offending header and log message formats are:\n%s %s\n",
706 hdr_format
, msg_format
);
709 LogMessageVerbSigSafe(X_WARNING
, -1, "Warned %u times about sigsafe logging. Will be quiet now.\n", warned
);
713 type_str
= LogMessageTypeVerbString(type
, verb
);
717 /* if type_str is not "", prepend it and ' ', to message */
718 if (type_str
[0] != '\0')
719 len
+= Xscnprintf(&buf
[len
], size
- len
, "%s ", type_str
);
721 if (hdr_format
&& size
- len
> 1)
722 len
+= Xvscnprintf(&buf
[len
], size
- len
, hdr_format
, hdr_args
);
724 if (msg_format
&& size
- len
> 1)
725 len
+= Xvscnprintf(&buf
[len
], size
- len
, msg_format
, msg_args
);
727 /* Force '\n' at end of truncated line */
731 newline
= (buf
[len
- 1] == '\n');
732 LogSWrite(verb
, buf
, len
, newline
);
736 LogHdrMessageVerb(MessageType type
, int verb
, const char *msg_format
,
737 va_list msg_args
, const char *hdr_format
, ...)
741 va_start(hdr_args
, hdr_format
);
742 LogVHdrMessageVerb(type
, verb
, msg_format
, msg_args
, hdr_format
, hdr_args
);
747 LogHdrMessage(MessageType type
, const char *msg_format
, va_list msg_args
,
748 const char *hdr_format
, ...)
752 va_start(hdr_args
, hdr_format
);
753 LogVHdrMessageVerb(type
, 1, msg_format
, msg_args
, hdr_format
, hdr_args
);
765 XF86BigfontCleanup();
767 CloseWellKnownConnections();
770 AbortDDX(EXIT_ERR_ABORT
);
777 #define AUDIT_PREFIX "AUDIT: %s: %ld: "
778 #ifndef AUDIT_TIMEOUT
779 #define AUDIT_TIMEOUT ((CARD32)(120 * 1000)) /* 2 mn */
782 static int nrepeat
= 0;
783 static int oldlen
= -1;
784 static OsTimerPtr auditTimer
= NULL
;
789 if (auditTimer
!= NULL
) {
790 /* Force output of pending messages */
791 TimerForce(auditTimer
);
792 TimerFree(auditTimer
);
807 if ((s
= strchr(autime
, '\n')))
809 len
= strlen(AUDIT_PREFIX
) + strlen(autime
) + 10 + 1;
810 tmpBuf
= malloc(len
);
813 snprintf(tmpBuf
, len
, AUDIT_PREFIX
, autime
, (unsigned long) getpid());
818 AuditF(const char *f
, ...)
829 AuditFlush(OsTimerPtr timer
, CARD32 now
, pointer arg
)
834 prefix
= AuditPrefix();
835 ErrorF("%slast message repeated %d times\n",
836 prefix
!= NULL
? prefix
: "", nrepeat
);
839 return AUDIT_TIMEOUT
;
842 /* if the timer expires without anything to print, flush the message */
849 VAuditF(const char *f
, va_list args
)
854 static char oldbuf
[1024];
856 prefix
= AuditPrefix();
857 len
= vsnprintf(buf
, sizeof(buf
), f
, args
);
859 if (len
== oldlen
&& strcmp(buf
, oldbuf
) == 0) {
860 /* Message already seen */
865 if (auditTimer
!= NULL
)
866 TimerForce(auditTimer
);
867 ErrorF("%s%s", prefix
!= NULL
? prefix
: "", buf
);
868 strlcpy(oldbuf
, buf
, sizeof(oldbuf
));
871 auditTimer
= TimerSet(auditTimer
, 0, AUDIT_TIMEOUT
, AuditFlush
, NULL
);
877 FatalError(const char *f
, ...)
881 static Bool beenhere
= FALSE
;
884 ErrorFSigSafe("\nFatalError re-entered, aborting\n");
886 ErrorFSigSafe("\nFatal server error:\n");
890 /* Make a copy for OsVendorFatalError */
891 va_copy(args2
, args
);
897 va_copy(apple_args
, args
);
898 (void)vsnprintf(__crashreporter_info_buff__
,
899 sizeof(__crashreporter_info_buff__
), f
, apple_args
);
903 VErrorFSigSafe(f
, args
);
907 OsVendorFatalError(f
, args2
);
918 VErrorF(const char *f
, va_list args
)
921 if (OsVendorVErrorFProc
)
922 OsVendorVErrorFProc(f
, args
);
924 LogVWrite(-1, f
, args
);
926 LogVWrite(-1, f
, args
);
931 ErrorF(const char *f
, ...)
941 VErrorFSigSafe(const char *f
, va_list args
)
943 LogVMessageVerbSigSafe(X_ERROR
, -1, f
, args
);
947 ErrorFSigSafe(const char *f
, ...)
952 VErrorFSigSafe(f
, args
);
957 LogPrintMarkers(void)
959 /* Show what the message marker symbols mean. */
960 LogWrite(0, "Markers: ");
961 LogMessageVerb(X_PROBED
, 0, "probed, ");
962 LogMessageVerb(X_CONFIG
, 0, "from config file, ");
963 LogMessageVerb(X_DEFAULT
, 0, "default setting,\n\t");
964 LogMessageVerb(X_CMDLINE
, 0, "from command line, ");
965 LogMessageVerb(X_NOTICE
, 0, "notice, ");
966 LogMessageVerb(X_INFO
, 0, "informational,\n\t");
967 LogMessageVerb(X_WARNING
, 0, "warning, ");
968 LogMessageVerb(X_ERROR
, 0, "error, ");
969 LogMessageVerb(X_NOT_IMPLEMENTED
, 0, "not implemented, ");
970 LogMessageVerb(X_UNKNOWN
, 0, "unknown.\n");