/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 1999-2021 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include void mu_diag_init () { if (!mu_strerr) mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); } void mu_diag_voutput (int level, const char *fmt, va_list ap) { mu_diag_init (); mu_stream_printf (mu_strerr, "\033s<%d>", level); mu_stream_vprintf (mu_strerr, fmt, ap); mu_stream_write (mu_strerr, "\n", 1, NULL); } void mu_diag_output (int level, const char *fmt, ...) { va_list ap; va_start (ap, fmt); mu_diag_voutput (level, fmt, ap); va_end (ap); } void mu_vdiag_at_locus_range (int level, struct mu_locus_range const *loc, const char *fmt, va_list ap) { struct mu_locus_range old_loc = MU_LOCUS_RANGE_INITIALIZER; int old_mode; int restore = 0; if (loc) { if (mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, MU_IOCTL_LOGSTREAM_GET_LOCUS_RANGE, &old_loc) == 0) { if (mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, MU_IOCTL_LOGSTREAM_GET_MODE, &old_mode) == 0) { int mode = old_mode | MU_LOGMODE_LOCUS; mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, MU_IOCTL_LOGSTREAM_SET_MODE, &mode); mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE, (void*) loc); restore = 1; } } } mu_diag_voutput (level, fmt, ap); if (restore) { mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE, &old_loc); mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, MU_IOCTL_LOGSTREAM_SET_MODE, &old_mode); mu_locus_range_deinit (&old_loc); } } void mu_diag_at_locus_range (int level, struct mu_locus_range const *loc, const char *fmt, ...) { va_list ap; va_start (ap, fmt); mu_vdiag_at_locus_range (level, loc, fmt, ap); va_end (ap); } void mu_diag_at_locus_point (int level, struct mu_locus_point const *loc, const char *fmt, ...) { va_list ap; struct mu_locus_range lr = MU_LOCUS_RANGE_INITIALIZER; lr.beg = *loc; va_start (ap, fmt); mu_vdiag_at_locus_range (level, &lr, fmt, ap); va_end (ap); } void mu_diag_vprintf (int level, const char *fmt, va_list ap) { mu_diag_init (); mu_stream_printf (mu_strerr, "\033s<%d>", level); mu_stream_vprintf (mu_strerr, fmt, ap); } void mu_diag_cont_vprintf (const char *fmt, va_list ap) { mu_diag_init (); mu_stream_vprintf (mu_strerr, fmt, ap); } void mu_diag_printf (int level, const char *fmt, ...) { va_list ap; va_start (ap, fmt); mu_diag_vprintf (level, fmt, ap); va_end (ap); } void mu_diag_cont_printf (const char *fmt, ...) { va_list ap; va_start (ap, fmt); mu_diag_cont_vprintf (fmt, ap); va_end (ap); } const char * mu_diag_level_to_string (int level) { switch (level) { case MU_DIAG_EMERG: return _("emergency"); case MU_DIAG_ALERT: return _("alert"); case MU_DIAG_CRIT: return _("critical"); case MU_DIAG_ERROR: return _("error"); case MU_DIAG_WARNING: return _("warning"); case MU_DIAG_NOTICE: return _("notice"); case MU_DIAG_INFO: return _("info"); case MU_DIAG_DEBUG: return _("debug"); } return _("unknown"); } void mu_diag_funcall (mu_log_level_t level, const char *func, const char *arg, int err) { if (err) /* TRANSLATORS: First %s stands for function name, second for its arguments, third one for the actual error message. */ mu_diag_output (level, _("%s(%s) failed: %s"), func, mu_prstr (arg), mu_strerror (err)); else /* TRANSLATORS: First %s stands for function name, second for its arguments. */ mu_diag_output (level, _("%s(%s) failed"), func, mu_prstr (arg)); }