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