176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <linux/list.h>
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdbool.h>
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef DYNAMIC_DEBUG
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic LIST_HEAD(debug_funcs);
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct debug_func_entry {
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char *name;
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct list_head list;
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic struct debug_func_entry *lookup_entry(const char *func)
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct debug_func_entry *e, *entry = NULL;
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    list_for_each_entry(e, &debug_funcs, list) {
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (!strcmp(e->name, func)) {
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    entry = e;
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return entry;
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanbool __syslinux_debug_enabled(const char *func)
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct debug_func_entry *entry;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    entry = lookup_entry(func);
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (entry)
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return true;
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return false;
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int __enable(const char *func)
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct debug_func_entry *entry;
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    entry = lookup_entry(func);
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (entry)
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return 0;	/* already enabled */
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    entry = malloc(sizeof(*entry));
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (!entry)
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return -1;
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    entry->name = func;
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    list_add(&entry->list, &debug_funcs);
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return 0;
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int __disable(const char *func)
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct debug_func_entry *entry;
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    entry = lookup_entry(func);
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (!entry)
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return 0;	/* already disabled */
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    list_del(&entry->list);
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    free(entry);
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return 0;
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Enable or disable debug code for function 'func'.
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint syslinux_debug(const char *func, bool enable)
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    int rv;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (enable)
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	rv = __enable(func);
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    else
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	rv = __disable(func);
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return rv;
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint syslinux_debug(const char *func, bool enable)
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (void)func;
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (void)enable;
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    printf("Dynamic debug unavailable\n");
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return -1;
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* DYNAMIC_DEBUG */
96