1255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdarg.h>
2255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdlib.h>
3255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdio.h>
4255e72915d4cbddceb435e13d81601755714e9fSE Android#include "handle.h"
5255e72915d4cbddceb435e13d81601755714e9fSE Android#include "debug.h"
6255e72915d4cbddceb435e13d81601755714e9fSE Android
7255e72915d4cbddceb435e13d81601755714e9fSE Android/* Deprecated */
8255e72915d4cbddceb435e13d81601755714e9fSE Androidstruct sepol_handle sepol_compat_handle = {
9255e72915d4cbddceb435e13d81601755714e9fSE Android	.msg_callback = sepol_msg_default_handler,
10255e72915d4cbddceb435e13d81601755714e9fSE Android	.msg_callback_arg = NULL,
11255e72915d4cbddceb435e13d81601755714e9fSE Android};
12255e72915d4cbddceb435e13d81601755714e9fSE Android
13255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_debug(int on)
14255e72915d4cbddceb435e13d81601755714e9fSE Android{
15255e72915d4cbddceb435e13d81601755714e9fSE Android	sepol_compat_handle.msg_callback = (on) ?
16255e72915d4cbddceb435e13d81601755714e9fSE Android	    sepol_msg_default_handler : NULL;
17255e72915d4cbddceb435e13d81601755714e9fSE Android}
18255e72915d4cbddceb435e13d81601755714e9fSE Android
19255e72915d4cbddceb435e13d81601755714e9fSE Android/* End deprecated */
20255e72915d4cbddceb435e13d81601755714e9fSE Android
21255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_msg_get_level(sepol_handle_t * handle)
22255e72915d4cbddceb435e13d81601755714e9fSE Android{
23255e72915d4cbddceb435e13d81601755714e9fSE Android	return handle->msg_level;
24255e72915d4cbddceb435e13d81601755714e9fSE Android}
25255e72915d4cbddceb435e13d81601755714e9fSE Android
26255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_msg_get_level)
27255e72915d4cbddceb435e13d81601755714e9fSE Android
28255e72915d4cbddceb435e13d81601755714e9fSE Androidconst char *sepol_msg_get_channel(sepol_handle_t * handle)
29255e72915d4cbddceb435e13d81601755714e9fSE Android{
30255e72915d4cbddceb435e13d81601755714e9fSE Android	return handle->msg_channel;
31255e72915d4cbddceb435e13d81601755714e9fSE Android}
32255e72915d4cbddceb435e13d81601755714e9fSE Android
33255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_msg_get_channel)
34255e72915d4cbddceb435e13d81601755714e9fSE Android
35255e72915d4cbddceb435e13d81601755714e9fSE Androidconst char *sepol_msg_get_fname(sepol_handle_t * handle)
36255e72915d4cbddceb435e13d81601755714e9fSE Android{
37255e72915d4cbddceb435e13d81601755714e9fSE Android	return handle->msg_fname;
38255e72915d4cbddceb435e13d81601755714e9fSE Android}
39255e72915d4cbddceb435e13d81601755714e9fSE Android
40255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_msg_get_fname)
41255e72915d4cbddceb435e13d81601755714e9fSE Android#ifdef __GNUC__
42255e72915d4cbddceb435e13d81601755714e9fSE Android    __attribute__ ((format(printf, 3, 4)))
43255e72915d4cbddceb435e13d81601755714e9fSE Android#endif
44255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid hidden sepol_msg_default_handler(void *varg __attribute__ ((unused)),
45255e72915d4cbddceb435e13d81601755714e9fSE Android				      sepol_handle_t * handle,
46255e72915d4cbddceb435e13d81601755714e9fSE Android				      const char *fmt, ...)
47255e72915d4cbddceb435e13d81601755714e9fSE Android{
48255e72915d4cbddceb435e13d81601755714e9fSE Android
49255e72915d4cbddceb435e13d81601755714e9fSE Android	FILE *stream = NULL;
50255e72915d4cbddceb435e13d81601755714e9fSE Android
51255e72915d4cbddceb435e13d81601755714e9fSE Android	switch (sepol_msg_get_level(handle)) {
52255e72915d4cbddceb435e13d81601755714e9fSE Android
53255e72915d4cbddceb435e13d81601755714e9fSE Android	case SEPOL_MSG_ERR:
54255e72915d4cbddceb435e13d81601755714e9fSE Android	case SEPOL_MSG_WARN:
55255e72915d4cbddceb435e13d81601755714e9fSE Android		stream = stderr;
56255e72915d4cbddceb435e13d81601755714e9fSE Android		break;
57255e72915d4cbddceb435e13d81601755714e9fSE Android	case SEPOL_MSG_INFO:
58255e72915d4cbddceb435e13d81601755714e9fSE Android	default:
59255e72915d4cbddceb435e13d81601755714e9fSE Android		stream = stdout;
60255e72915d4cbddceb435e13d81601755714e9fSE Android		break;
61255e72915d4cbddceb435e13d81601755714e9fSE Android	}
62255e72915d4cbddceb435e13d81601755714e9fSE Android
63255e72915d4cbddceb435e13d81601755714e9fSE Android	fprintf(stream, "%s.%s: ",
64255e72915d4cbddceb435e13d81601755714e9fSE Android		sepol_msg_get_channel(handle), sepol_msg_get_fname(handle));
65255e72915d4cbddceb435e13d81601755714e9fSE Android
66255e72915d4cbddceb435e13d81601755714e9fSE Android	va_list ap;
67255e72915d4cbddceb435e13d81601755714e9fSE Android	va_start(ap, fmt);
68255e72915d4cbddceb435e13d81601755714e9fSE Android	vfprintf(stream, fmt, ap);
69255e72915d4cbddceb435e13d81601755714e9fSE Android	va_end(ap);
70255e72915d4cbddceb435e13d81601755714e9fSE Android
71255e72915d4cbddceb435e13d81601755714e9fSE Android	fprintf(stream, "\n");
72255e72915d4cbddceb435e13d81601755714e9fSE Android
73255e72915d4cbddceb435e13d81601755714e9fSE Android	varg = NULL;
74255e72915d4cbddceb435e13d81601755714e9fSE Android}
75255e72915d4cbddceb435e13d81601755714e9fSE Android
76255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void sepol_msg_set_callback(sepol_handle_t * handle,
77255e72915d4cbddceb435e13d81601755714e9fSE Android#ifdef __GNUC__
78255e72915d4cbddceb435e13d81601755714e9fSE Android				   __attribute__ ((format(printf, 3, 4)))
79255e72915d4cbddceb435e13d81601755714e9fSE Android#endif
80255e72915d4cbddceb435e13d81601755714e9fSE Android				   void (*msg_callback) (void *varg,
81255e72915d4cbddceb435e13d81601755714e9fSE Android							 sepol_handle_t *
82255e72915d4cbddceb435e13d81601755714e9fSE Android							 handle,
83255e72915d4cbddceb435e13d81601755714e9fSE Android							 const char *fmt, ...),
84255e72915d4cbddceb435e13d81601755714e9fSE Android				   void *msg_callback_arg)
85255e72915d4cbddceb435e13d81601755714e9fSE Android{
86255e72915d4cbddceb435e13d81601755714e9fSE Android
87255e72915d4cbddceb435e13d81601755714e9fSE Android	handle->msg_callback = msg_callback;
88255e72915d4cbddceb435e13d81601755714e9fSE Android	handle->msg_callback_arg = msg_callback_arg;
89255e72915d4cbddceb435e13d81601755714e9fSE Android}
90