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