Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : Copyright (C) Andrew Tridgell 2003 4 : 5 : This program is free software; you can redistribute it and/or modify 6 : it under the terms of the GNU General Public License as published by 7 : the Free Software Foundation; either version 3 of the License, or 8 : (at your option) any later version. 9 : 10 : This program is distributed in the hope that it will be useful, 11 : but WITHOUT ANY WARRANTY; without even the implied warranty of 12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 : GNU General Public License for more details. 14 : 15 : You should have received a copy of the GNU General Public License 16 : along with this program. If not, see <http://www.gnu.org/licenses/>. 17 : */ 18 : 19 : #include "includes.h" 20 : #include <tevent.h> 21 : 22 : #undef DBGC_CLASS 23 : #define DBGC_CLASS DBGC_TEVENT 24 : 25 : static void samba_tevent_debug(void *context, 26 : enum tevent_debug_level level, 27 : const char *fmt, 28 : va_list ap) PRINTF_ATTRIBUTE(3,0); 29 : 30 59 : static void samba_tevent_debug(void *context, 31 : enum tevent_debug_level level, 32 : const char *fmt, 33 : va_list ap) 34 : { 35 59 : int samba_level = -1; 36 : 37 59 : switch (level) { 38 0 : case TEVENT_DEBUG_FATAL: 39 0 : samba_level = 0; 40 0 : break; 41 59 : case TEVENT_DEBUG_ERROR: 42 59 : samba_level = 1; 43 59 : break; 44 0 : case TEVENT_DEBUG_WARNING: 45 0 : samba_level = 2; 46 0 : break; 47 0 : case TEVENT_DEBUG_TRACE: 48 0 : samba_level = 50; 49 0 : break; 50 : }; 51 : 52 59 : if (CHECK_DEBUGLVL(samba_level)) { 53 59 : const char *name = (const char *)context; 54 59 : char *message = NULL; 55 0 : int ret; 56 : 57 59 : ret = vasprintf(&message, fmt, ap); 58 59 : if (ret == -1) { 59 0 : return; 60 : } 61 : 62 59 : if (name == NULL) { 63 0 : name = "samba_tevent"; 64 : } 65 : 66 59 : DEBUG(samba_level, ("%s: %s", name, message)); 67 59 : free(message); 68 : } 69 : } 70 : 71 0 : static void samba_tevent_abort_fn(const char *reason) 72 : { 73 0 : smb_panic(reason); 74 : } 75 : 76 4032303 : static void samba_tevent_setup_abort_fn(void) 77 : { 78 23567 : static bool abort_fn_done; 79 : 80 4032303 : if (!abort_fn_done) { 81 27165 : tevent_set_abort_fn(samba_tevent_abort_fn); 82 27165 : abort_fn_done = true; 83 : } 84 4008736 : } 85 : 86 2228774 : void samba_tevent_set_debug(struct tevent_context *ev, const char *name) 87 : { 88 2228774 : void *p = discard_const(name); 89 2228774 : samba_tevent_setup_abort_fn(); 90 2228774 : tevent_set_debug(ev, samba_tevent_debug, p); 91 : 92 : /* these values should match samba_tevent_debug() */ 93 2228774 : if (CHECK_DEBUGLVL(50)) { 94 0 : tevent_set_max_debug_level(ev, TEVENT_DEBUG_TRACE); 95 2228774 : } else if (CHECK_DEBUGLVL(2)) { 96 138 : tevent_set_max_debug_level(ev, TEVENT_DEBUG_WARNING); 97 2228636 : } else if (CHECK_DEBUGLVL(1)) { 98 2116428 : tevent_set_max_debug_level(ev, TEVENT_DEBUG_ERROR); 99 : } else { 100 112208 : tevent_set_max_debug_level(ev, TEVENT_DEBUG_FATAL); 101 : } 102 2228774 : } 103 : 104 1803529 : struct tevent_context *samba_tevent_context_init(TALLOC_CTX *mem_ctx) 105 : { 106 8666 : struct tevent_context *ev; 107 : 108 1803529 : samba_tevent_setup_abort_fn(); 109 : 110 1803529 : ev = tevent_context_init(mem_ctx); 111 1803529 : if (ev) { 112 1803529 : samba_tevent_set_debug(ev, NULL); 113 : } 114 : 115 1803529 : return ev; 116 : }