1#include <linux/list.h> 2#include <string.h> 3#include <stdbool.h> 4 5#ifdef DYNAMIC_DEBUG 6 7static LIST_HEAD(debug_funcs); 8 9struct debug_func_entry { 10 const char *name; 11 struct list_head list; 12}; 13 14static struct debug_func_entry *lookup_entry(const char *func) 15{ 16 struct debug_func_entry *e, *entry = NULL; 17 18 list_for_each_entry(e, &debug_funcs, list) { 19 if (!strcmp(e->name, func)) { 20 entry = e; 21 break; 22 } 23 } 24 25 return entry; 26} 27 28bool __syslinux_debug_enabled(const char *func) 29{ 30 struct debug_func_entry *entry; 31 32 entry = lookup_entry(func); 33 if (entry) 34 return true; 35 36 return false; 37} 38 39static int __enable(const char *func) 40{ 41 struct debug_func_entry *entry; 42 43 entry = lookup_entry(func); 44 if (entry) 45 return 0; /* already enabled */ 46 47 entry = malloc(sizeof(*entry)); 48 if (!entry) 49 return -1; 50 51 entry->name = func; 52 list_add(&entry->list, &debug_funcs); 53 return 0; 54} 55 56static int __disable(const char *func) 57{ 58 struct debug_func_entry *entry; 59 60 entry = lookup_entry(func); 61 if (!entry) 62 return 0; /* already disabled */ 63 64 list_del(&entry->list); 65 free(entry); 66 return 0; 67} 68 69/* 70 * Enable or disable debug code for function 'func'. 71 */ 72int syslinux_debug(const char *func, bool enable) 73{ 74 int rv; 75 76 if (enable) 77 rv = __enable(func); 78 else 79 rv = __disable(func); 80 81 return rv; 82} 83 84#else 85 86int syslinux_debug(const char *func, bool enable) 87{ 88 (void)func; 89 (void)enable; 90 91 printf("Dynamic debug unavailable\n"); 92 return -1; 93} 94 95#endif /* DYNAMIC_DEBUG */ 96