/* Author: Joshua Brindle * Ivan Gyurdiev * * Copyright (C) 2004-2005 Tresys Technology, LLC * Copyright (C) 2005 Red Hat 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 2.1 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include "handle.h" #include "debug.h" int semanage_msg_get_level(semanage_handle_t * handle) { return handle->msg_level; } hidden_def(semanage_msg_get_level) const char *semanage_msg_get_channel(semanage_handle_t * handle) { return handle->msg_channel; } hidden_def(semanage_msg_get_channel) const char *semanage_msg_get_fname(semanage_handle_t * handle) { return handle->msg_fname; } hidden_def(semanage_msg_get_fname) #ifdef __GNUC__ __attribute__ ((format(printf, 3, 4))) #endif void hidden semanage_msg_default_handler(void *varg __attribute__ ((unused)), semanage_handle_t * handle, const char *fmt, ...) { FILE *stream = NULL; int errsv = 0; switch (semanage_msg_get_level(handle)) { case SEMANAGE_MSG_ERR: stream = stderr; errsv = errno; break; case SEMANAGE_MSG_WARN: stream = stderr; break; default: stream = stdout; break; } fprintf(stream, "%s.%s: ", semanage_msg_get_channel(handle), semanage_msg_get_fname(handle)); va_list ap; va_start(ap, fmt); vfprintf(stream, fmt, ap); va_end(ap); if (errsv && errsv != ENOMEM) fprintf(stream, " (%s).", strerror(errsv)); fprintf(stream, "\n"); } #ifdef __GNUC__ __attribute__ ((format(printf, 3, 4))) #endif void hidden semanage_msg_relay_handler(void *varg, sepol_handle_t * sepolh, const char *fmt, ...) { va_list ap; semanage_handle_t *sh = varg; char buffer[1024]; if (!sh->msg_callback) return; va_start(ap, fmt); vsnprintf(buffer, sizeof(buffer), fmt, ap); va_end(ap); sh->msg_fname = sepol_msg_get_fname(sepolh); sh->msg_channel = sepol_msg_get_channel(sepolh); sh->msg_level = sepol_msg_get_level(sepolh); /* XXX should map values */ sh->msg_callback(sh->msg_callback_arg, sh, "%s", buffer); return; } extern void semanage_msg_set_callback(semanage_handle_t * handle, #ifdef __GNUC__ __attribute__ ((format(printf, 3, 4))) #endif void (*msg_callback) (void *varg, semanage_handle_t * handle, const char *fmt, ...), void *msg_callback_arg) { handle->msg_callback = msg_callback; handle->msg_callback_arg = msg_callback_arg; }