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 20805160 : static void samba_tevent_debug(void *context, 31 : enum tevent_debug_level level, 32 : const char *fmt, 33 : va_list ap) 34 : { 35 20805160 : int samba_level = -1; 36 : 37 20805160 : switch (level) { 38 0 : case TEVENT_DEBUG_FATAL: 39 0 : samba_level = 0; 40 0 : break; 41 39 : case TEVENT_DEBUG_ERROR: 42 39 : samba_level = 1; 43 39 : break; 44 0 : case TEVENT_DEBUG_WARNING: 45 0 : samba_level = 2; 46 0 : break; 47 20805121 : case TEVENT_DEBUG_TRACE: 48 20805121 : samba_level = 50; 49 20805121 : break; 50 : }; 51 : 52 20805160 : if (CHECK_DEBUGLVL(samba_level)) { 53 39 : const char *name = (const char *)context; 54 39 : char *message = NULL; 55 : int ret; 56 : 57 39 : ret = vasprintf(&message, fmt, ap); 58 39 : if (ret == -1) { 59 0 : return; 60 : } 61 : 62 39 : if (name == NULL) { 63 0 : name = "samba_tevent"; 64 : } 65 : 66 39 : DEBUG(samba_level, ("%s: %s", name, message)); 67 39 : 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 1263071 : static void samba_tevent_setup_abort_fn(void) 77 : { 78 : static bool abort_fn_done; 79 : 80 1263071 : if (!abort_fn_done) { 81 8195 : tevent_set_abort_fn(samba_tevent_abort_fn); 82 8195 : abort_fn_done = true; 83 : } 84 1263071 : } 85 : 86 781165 : void samba_tevent_set_debug(struct tevent_context *ev, const char *name) 87 : { 88 781165 : void *p = discard_const(name); 89 781165 : samba_tevent_setup_abort_fn(); 90 781165 : tevent_set_debug(ev, samba_tevent_debug, p); 91 781165 : } 92 : 93 481906 : struct tevent_context *samba_tevent_context_init(TALLOC_CTX *mem_ctx) 94 : { 95 : struct tevent_context *ev; 96 : 97 481906 : samba_tevent_setup_abort_fn(); 98 : 99 481906 : ev = tevent_context_init(mem_ctx); 100 481906 : if (ev) { 101 481906 : samba_tevent_set_debug(ev, NULL); 102 : } 103 : 104 481906 : return ev; 105 : }