debug.c revision 255e72915d4cbddceb435e13d81601755714e9f3
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <stdarg.h>
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <stdlib.h>
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <stdio.h>
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "handle.h"
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner#include "debug.h"
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/* Deprecated */
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstruct sepol_handle sepol_compat_handle = {
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer	.msg_callback = sepol_msg_default_handler,
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer	.msg_callback_arg = NULL,
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid sepol_debug(int on)
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer{
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth	sepol_compat_handle.msg_callback = (on) ?
162fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer	    sepol_msg_default_handler : NULL;
172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer}
18bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck
192fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer/* End deprecated */
20aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
2149aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidisint sepol_msg_get_level(sepol_handle_t * handle)
22980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff{
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor	return handle->msg_level;
24e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar}
25ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorhidden_def(sepol_msg_get_level)
2714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
282fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramerconst char *sepol_msg_get_channel(sepol_handle_t * handle)
292fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer{
301b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner	return handle->msg_channel;
31a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner}
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
33f5942a44880be26878592eb052b737579349411eBenjamin Kramerhidden_def(sepol_msg_get_channel)
3485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
352fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramerconst char *sepol_msg_get_fname(sepol_handle_t * handle)
366fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman{
37f5942a44880be26878592eb052b737579349411eBenjamin Kramer	return handle->msg_fname;
382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis}
3929445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerhidden_def(sepol_msg_get_fname)
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifdef __GNUC__
421827403a7138946305c0058f262e02b595cf882fDouglas Gregor    __attribute__ ((format(printf, 3, 4)))
431827403a7138946305c0058f262e02b595cf882fDouglas Gregor#endif
44225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorvoid hidden sepol_msg_default_handler(void *varg __attribute__ ((unused)),
45225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregor				      sepol_handle_t * handle,
46ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt				      const char *fmt, ...)
47ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt{
48a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregor
49a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregor	FILE *stream = NULL;
50ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
51ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt	switch (sepol_msg_get_level(handle)) {
524923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor
534923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor	case SEPOL_MSG_ERR:
544923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor	case SEPOL_MSG_WARN:
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer		stream = stderr;
56aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov		break;
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer	case SEPOL_MSG_INFO:
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer	default:
59a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko		stream = stdout;
60aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko		break;
61aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko	}
62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko	fprintf(stream, "%s.%s: ",
64aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko		sepol_msg_get_channel(handle), sepol_msg_get_fname(handle));
65aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
66aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko	va_list ap;
67c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko	va_start(ap, fmt);
68c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko	vfprintf(stream, fmt, ap);
69c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko	va_end(ap);
70c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko
71c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko	fprintf(stream, "\n");
72c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
73c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko	varg = NULL;
74c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko}
75c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
76c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenkoextern void sepol_msg_set_callback(sepol_handle_t * handle,
77dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko#ifdef __GNUC__
78dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko				   __attribute__ ((format(printf, 3, 4)))
79dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko#endif
80dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko				   void (*msg_callback) (void *varg,
81dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko							 sepol_handle_t *
82dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko							 handle,
83dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko							 const char *fmt, ...),
84dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko				   void *msg_callback_arg)
85dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko{
86dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
87dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko	handle->msg_callback = msg_callback;
88dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko	handle->msg_callback_arg = msg_callback_arg;
89dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko}
90dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko