16cd6a6acSopenharmony_ci#include <stdarg.h> 26cd6a6acSopenharmony_ci#include <stdlib.h> 36cd6a6acSopenharmony_ci#include <stdio.h> 46cd6a6acSopenharmony_ci#include "handle.h" 56cd6a6acSopenharmony_ci#include "debug.h" 66cd6a6acSopenharmony_ci 76cd6a6acSopenharmony_ci/* Deprecated */ 86cd6a6acSopenharmony_cistruct sepol_handle sepol_compat_handle = { 96cd6a6acSopenharmony_ci .msg_callback = sepol_msg_default_handler, 106cd6a6acSopenharmony_ci .msg_callback_arg = NULL, 116cd6a6acSopenharmony_ci}; 126cd6a6acSopenharmony_ci 136cd6a6acSopenharmony_civoid sepol_debug(int on) 146cd6a6acSopenharmony_ci{ 156cd6a6acSopenharmony_ci sepol_compat_handle.msg_callback = (on) ? 166cd6a6acSopenharmony_ci sepol_msg_default_handler : NULL; 176cd6a6acSopenharmony_ci} 186cd6a6acSopenharmony_ci 196cd6a6acSopenharmony_ci/* End deprecated */ 206cd6a6acSopenharmony_ci 216cd6a6acSopenharmony_ciint sepol_msg_get_level(sepol_handle_t * handle) 226cd6a6acSopenharmony_ci{ 236cd6a6acSopenharmony_ci return handle->msg_level; 246cd6a6acSopenharmony_ci} 256cd6a6acSopenharmony_ci 266cd6a6acSopenharmony_ci 276cd6a6acSopenharmony_ciconst char *sepol_msg_get_channel(sepol_handle_t * handle) 286cd6a6acSopenharmony_ci{ 296cd6a6acSopenharmony_ci return handle->msg_channel; 306cd6a6acSopenharmony_ci} 316cd6a6acSopenharmony_ci 326cd6a6acSopenharmony_ci 336cd6a6acSopenharmony_ciconst char *sepol_msg_get_fname(sepol_handle_t * handle) 346cd6a6acSopenharmony_ci{ 356cd6a6acSopenharmony_ci return handle->msg_fname; 366cd6a6acSopenharmony_ci} 376cd6a6acSopenharmony_ci 386cd6a6acSopenharmony_ci#ifdef __GNUC__ 396cd6a6acSopenharmony_ci __attribute__ ((format(printf, 3, 4))) 406cd6a6acSopenharmony_ci#endif 416cd6a6acSopenharmony_civoid sepol_msg_default_handler(void *varg __attribute__ ((unused)), 426cd6a6acSopenharmony_ci sepol_handle_t * handle, 436cd6a6acSopenharmony_ci const char *fmt, ...) 446cd6a6acSopenharmony_ci{ 456cd6a6acSopenharmony_ci 466cd6a6acSopenharmony_ci FILE *stream = NULL; 476cd6a6acSopenharmony_ci va_list ap; 486cd6a6acSopenharmony_ci 496cd6a6acSopenharmony_ci switch (sepol_msg_get_level(handle)) { 506cd6a6acSopenharmony_ci 516cd6a6acSopenharmony_ci case SEPOL_MSG_ERR: 526cd6a6acSopenharmony_ci case SEPOL_MSG_WARN: 536cd6a6acSopenharmony_ci stream = stderr; 546cd6a6acSopenharmony_ci break; 556cd6a6acSopenharmony_ci case SEPOL_MSG_INFO: 566cd6a6acSopenharmony_ci default: 576cd6a6acSopenharmony_ci stream = stdout; 586cd6a6acSopenharmony_ci break; 596cd6a6acSopenharmony_ci } 606cd6a6acSopenharmony_ci 616cd6a6acSopenharmony_ci fprintf(stream, "%s.%s: ", 626cd6a6acSopenharmony_ci sepol_msg_get_channel(handle), sepol_msg_get_fname(handle)); 636cd6a6acSopenharmony_ci 646cd6a6acSopenharmony_ci va_start(ap, fmt); 656cd6a6acSopenharmony_ci vfprintf(stream, fmt, ap); 666cd6a6acSopenharmony_ci va_end(ap); 676cd6a6acSopenharmony_ci 686cd6a6acSopenharmony_ci fprintf(stream, "\n"); 696cd6a6acSopenharmony_ci} 706cd6a6acSopenharmony_ci 716cd6a6acSopenharmony_ciextern void sepol_msg_set_callback(sepol_handle_t * handle, 726cd6a6acSopenharmony_ci#ifdef __GNUC__ 736cd6a6acSopenharmony_ci __attribute__ ((format(printf, 3, 4))) 746cd6a6acSopenharmony_ci#endif 756cd6a6acSopenharmony_ci void (*msg_callback) (void *varg, 766cd6a6acSopenharmony_ci sepol_handle_t * 776cd6a6acSopenharmony_ci handle, 786cd6a6acSopenharmony_ci const char *fmt, ...), 796cd6a6acSopenharmony_ci void *msg_callback_arg) 806cd6a6acSopenharmony_ci{ 816cd6a6acSopenharmony_ci 826cd6a6acSopenharmony_ci handle->msg_callback = msg_callback; 836cd6a6acSopenharmony_ci handle->msg_callback_arg = msg_callback_arg; 846cd6a6acSopenharmony_ci} 85