1*2d543d20SAndroid Build Coastguard Worker /* Author: Joshua Brindle <[email protected]
2*2d543d20SAndroid Build Coastguard Worker * Jason Tang <[email protected]>
3*2d543d20SAndroid Build Coastguard Worker * Ivan Gyurdiev <[email protected]>
4*2d543d20SAndroid Build Coastguard Worker *
5*2d543d20SAndroid Build Coastguard Worker * Copyright (C) 2004-2005 Tresys Technology, LLC
6*2d543d20SAndroid Build Coastguard Worker * Copyright (C) 2005 Red Hat Inc.
7*2d543d20SAndroid Build Coastguard Worker *
8*2d543d20SAndroid Build Coastguard Worker * This library is free software; you can redistribute it and/or
9*2d543d20SAndroid Build Coastguard Worker * modify it under the terms of the GNU Lesser General Public
10*2d543d20SAndroid Build Coastguard Worker * License as published by the Free Software Foundation; either
11*2d543d20SAndroid Build Coastguard Worker * version 2.1 of the License, or (at your option) any later version.
12*2d543d20SAndroid Build Coastguard Worker *
13*2d543d20SAndroid Build Coastguard Worker * This library is distributed in the hope that it will be useful,
14*2d543d20SAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*2d543d20SAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16*2d543d20SAndroid Build Coastguard Worker * Lesser General Public License for more details.
17*2d543d20SAndroid Build Coastguard Worker *
18*2d543d20SAndroid Build Coastguard Worker * You should have received a copy of the GNU Lesser General Public
19*2d543d20SAndroid Build Coastguard Worker * License along with this library; if not, write to the Free Software
20*2d543d20SAndroid Build Coastguard Worker * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21*2d543d20SAndroid Build Coastguard Worker */
22*2d543d20SAndroid Build Coastguard Worker
23*2d543d20SAndroid Build Coastguard Worker #include <stdarg.h>
24*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
25*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
26*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
27*2d543d20SAndroid Build Coastguard Worker #include <string.h>
28*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
29*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
30*2d543d20SAndroid Build Coastguard Worker
semanage_msg_get_level(semanage_handle_t * handle)31*2d543d20SAndroid Build Coastguard Worker int semanage_msg_get_level(semanage_handle_t * handle)
32*2d543d20SAndroid Build Coastguard Worker {
33*2d543d20SAndroid Build Coastguard Worker return handle->msg_level;
34*2d543d20SAndroid Build Coastguard Worker }
35*2d543d20SAndroid Build Coastguard Worker
36*2d543d20SAndroid Build Coastguard Worker
semanage_msg_get_channel(semanage_handle_t * handle)37*2d543d20SAndroid Build Coastguard Worker const char *semanage_msg_get_channel(semanage_handle_t * handle)
38*2d543d20SAndroid Build Coastguard Worker {
39*2d543d20SAndroid Build Coastguard Worker return handle->msg_channel;
40*2d543d20SAndroid Build Coastguard Worker }
41*2d543d20SAndroid Build Coastguard Worker
42*2d543d20SAndroid Build Coastguard Worker
semanage_msg_get_fname(semanage_handle_t * handle)43*2d543d20SAndroid Build Coastguard Worker const char *semanage_msg_get_fname(semanage_handle_t * handle)
44*2d543d20SAndroid Build Coastguard Worker {
45*2d543d20SAndroid Build Coastguard Worker return handle->msg_fname;
46*2d543d20SAndroid Build Coastguard Worker }
47*2d543d20SAndroid Build Coastguard Worker
48*2d543d20SAndroid Build Coastguard Worker #ifdef __GNUC__
49*2d543d20SAndroid Build Coastguard Worker __attribute__ ((format(printf, 3, 4)))
50*2d543d20SAndroid Build Coastguard Worker #endif
semanage_msg_default_handler(void * varg,semanage_handle_t * handle,const char * fmt,...)51*2d543d20SAndroid Build Coastguard Worker void semanage_msg_default_handler(void *varg __attribute__ ((unused)),
52*2d543d20SAndroid Build Coastguard Worker semanage_handle_t * handle,
53*2d543d20SAndroid Build Coastguard Worker const char *fmt, ...)
54*2d543d20SAndroid Build Coastguard Worker {
55*2d543d20SAndroid Build Coastguard Worker
56*2d543d20SAndroid Build Coastguard Worker FILE *stream = NULL;
57*2d543d20SAndroid Build Coastguard Worker int errsv = 0;
58*2d543d20SAndroid Build Coastguard Worker
59*2d543d20SAndroid Build Coastguard Worker switch (semanage_msg_get_level(handle)) {
60*2d543d20SAndroid Build Coastguard Worker
61*2d543d20SAndroid Build Coastguard Worker case SEMANAGE_MSG_ERR:
62*2d543d20SAndroid Build Coastguard Worker stream = stderr;
63*2d543d20SAndroid Build Coastguard Worker errsv = errno;
64*2d543d20SAndroid Build Coastguard Worker break;
65*2d543d20SAndroid Build Coastguard Worker case SEMANAGE_MSG_WARN:
66*2d543d20SAndroid Build Coastguard Worker stream = stderr;
67*2d543d20SAndroid Build Coastguard Worker break;
68*2d543d20SAndroid Build Coastguard Worker default:
69*2d543d20SAndroid Build Coastguard Worker stream = stdout;
70*2d543d20SAndroid Build Coastguard Worker break;
71*2d543d20SAndroid Build Coastguard Worker }
72*2d543d20SAndroid Build Coastguard Worker
73*2d543d20SAndroid Build Coastguard Worker fprintf(stream, "%s.%s: ",
74*2d543d20SAndroid Build Coastguard Worker semanage_msg_get_channel(handle),
75*2d543d20SAndroid Build Coastguard Worker semanage_msg_get_fname(handle));
76*2d543d20SAndroid Build Coastguard Worker
77*2d543d20SAndroid Build Coastguard Worker va_list ap;
78*2d543d20SAndroid Build Coastguard Worker va_start(ap, fmt);
79*2d543d20SAndroid Build Coastguard Worker vfprintf(stream, fmt, ap);
80*2d543d20SAndroid Build Coastguard Worker va_end(ap);
81*2d543d20SAndroid Build Coastguard Worker
82*2d543d20SAndroid Build Coastguard Worker if (errsv && errsv != ENOMEM)
83*2d543d20SAndroid Build Coastguard Worker fprintf(stream, " (%s).", strerror(errsv));
84*2d543d20SAndroid Build Coastguard Worker
85*2d543d20SAndroid Build Coastguard Worker fprintf(stream, "\n");
86*2d543d20SAndroid Build Coastguard Worker }
87*2d543d20SAndroid Build Coastguard Worker
88*2d543d20SAndroid Build Coastguard Worker #ifdef __GNUC__
89*2d543d20SAndroid Build Coastguard Worker __attribute__ ((format(printf, 3, 4)))
90*2d543d20SAndroid Build Coastguard Worker #endif
semanage_msg_relay_handler(void * varg,sepol_handle_t * sepolh,const char * fmt,...)91*2d543d20SAndroid Build Coastguard Worker void semanage_msg_relay_handler(void *varg,
92*2d543d20SAndroid Build Coastguard Worker sepol_handle_t * sepolh,
93*2d543d20SAndroid Build Coastguard Worker const char *fmt, ...)
94*2d543d20SAndroid Build Coastguard Worker {
95*2d543d20SAndroid Build Coastguard Worker va_list ap;
96*2d543d20SAndroid Build Coastguard Worker semanage_handle_t *sh = varg;
97*2d543d20SAndroid Build Coastguard Worker char buffer[1024];
98*2d543d20SAndroid Build Coastguard Worker
99*2d543d20SAndroid Build Coastguard Worker if (!sh->msg_callback)
100*2d543d20SAndroid Build Coastguard Worker return;
101*2d543d20SAndroid Build Coastguard Worker
102*2d543d20SAndroid Build Coastguard Worker va_start(ap, fmt);
103*2d543d20SAndroid Build Coastguard Worker vsnprintf(buffer, sizeof(buffer), fmt, ap);
104*2d543d20SAndroid Build Coastguard Worker va_end(ap);
105*2d543d20SAndroid Build Coastguard Worker
106*2d543d20SAndroid Build Coastguard Worker sh->msg_fname = sepol_msg_get_fname(sepolh);
107*2d543d20SAndroid Build Coastguard Worker sh->msg_channel = sepol_msg_get_channel(sepolh);
108*2d543d20SAndroid Build Coastguard Worker sh->msg_level = sepol_msg_get_level(sepolh); /* XXX should map values */
109*2d543d20SAndroid Build Coastguard Worker sh->msg_callback(sh->msg_callback_arg, sh, "%s", buffer);
110*2d543d20SAndroid Build Coastguard Worker return;
111*2d543d20SAndroid Build Coastguard Worker }
112*2d543d20SAndroid Build Coastguard Worker
semanage_msg_set_callback(semanage_handle_t * handle,void (* msg_callback)(void * varg,semanage_handle_t * handle,const char * fmt,...),void * msg_callback_arg)113*2d543d20SAndroid Build Coastguard Worker extern void semanage_msg_set_callback(semanage_handle_t * handle,
114*2d543d20SAndroid Build Coastguard Worker #ifdef __GNUC__
115*2d543d20SAndroid Build Coastguard Worker __attribute__ ((format(printf, 3, 4)))
116*2d543d20SAndroid Build Coastguard Worker #endif
117*2d543d20SAndroid Build Coastguard Worker void (*msg_callback) (void *varg,
118*2d543d20SAndroid Build Coastguard Worker semanage_handle_t *
119*2d543d20SAndroid Build Coastguard Worker handle,
120*2d543d20SAndroid Build Coastguard Worker const char *fmt,
121*2d543d20SAndroid Build Coastguard Worker ...),
122*2d543d20SAndroid Build Coastguard Worker void *msg_callback_arg)
123*2d543d20SAndroid Build Coastguard Worker {
124*2d543d20SAndroid Build Coastguard Worker
125*2d543d20SAndroid Build Coastguard Worker handle->msg_callback = msg_callback;
126*2d543d20SAndroid Build Coastguard Worker handle->msg_callback_arg = msg_callback_arg;
127*2d543d20SAndroid Build Coastguard Worker }
128