mirror of git://git.sysmocom.de/ofono
Add support for dynamic debug feature
This commit is contained in:
parent
b334372ef8
commit
e4850f2eeb
|
@ -41,6 +41,14 @@ extern void ofono_error(const char *format, ...)
|
||||||
extern void ofono_debug(const char *format, ...)
|
extern void ofono_debug(const char *format, ...)
|
||||||
__attribute__((format(printf, 1, 2)));
|
__attribute__((format(printf, 1, 2)));
|
||||||
|
|
||||||
|
struct ofono_debug_desc {
|
||||||
|
const char *name;
|
||||||
|
const char *file;
|
||||||
|
#define OFONO_DEBUG_FLAG_DEFAULT (0)
|
||||||
|
#define OFONO_DEBUG_FLAG_PRINT (1 << 0)
|
||||||
|
unsigned int flags;
|
||||||
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DBG:
|
* DBG:
|
||||||
* @fmt: format string
|
* @fmt: format string
|
||||||
|
@ -49,7 +57,15 @@ extern void ofono_debug(const char *format, ...)
|
||||||
* Simple macro around ofono_debug() which also include the function
|
* Simple macro around ofono_debug() which also include the function
|
||||||
* name it is called in.
|
* name it is called in.
|
||||||
*/
|
*/
|
||||||
#define DBG(fmt, arg...) ofono_debug("%s:%s() " fmt, __FILE__, __FUNCTION__ , ## arg)
|
#define DBG(fmt, arg...) do { \
|
||||||
|
static struct ofono_debug_desc __ofono_debug_desc \
|
||||||
|
__attribute__((used, section("__debug"), aligned(8))) = { \
|
||||||
|
.file = __FILE__, .flags = OFONO_DEBUG_FLAG_DEFAULT, \
|
||||||
|
}; \
|
||||||
|
if (__ofono_debug_desc.flags & OFONO_DEBUG_FLAG_PRINT) \
|
||||||
|
ofono_debug("%s:%s() " fmt, \
|
||||||
|
__FILE__, __FUNCTION__ , ## arg); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
55
src/log.c
55
src/log.c
|
@ -28,8 +28,6 @@
|
||||||
|
|
||||||
#include "ofono.h"
|
#include "ofono.h"
|
||||||
|
|
||||||
static volatile gboolean debug_enabled = FALSE;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ofono_info:
|
* ofono_info:
|
||||||
* @format: format string
|
* @format: format string
|
||||||
|
@ -98,9 +96,6 @@ void ofono_debug(const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
if (debug_enabled == FALSE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
|
|
||||||
vsyslog(LOG_DEBUG, format, ap);
|
vsyslog(LOG_DEBUG, format, ap);
|
||||||
|
@ -108,17 +103,51 @@ void ofono_debug(const char *format, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __ofono_toggle_debug(void)
|
extern struct ofono_debug_desc __start___debug[];
|
||||||
|
extern struct ofono_debug_desc __stop___debug[];
|
||||||
|
|
||||||
|
static gchar **enabled = NULL;
|
||||||
|
|
||||||
|
static ofono_bool_t is_enabled(struct ofono_debug_desc *desc)
|
||||||
{
|
{
|
||||||
if (debug_enabled == TRUE)
|
int i;
|
||||||
debug_enabled = FALSE;
|
|
||||||
else
|
if (enabled == NULL)
|
||||||
debug_enabled = TRUE;
|
return FALSE;
|
||||||
|
|
||||||
|
for (i = 0; enabled[i] != NULL; i++) {
|
||||||
|
if (desc->name != NULL && g_pattern_match_simple(enabled[i],
|
||||||
|
desc->name) == TRUE)
|
||||||
|
return TRUE;
|
||||||
|
if (desc->file != NULL && g_pattern_match_simple(enabled[i],
|
||||||
|
desc->file) == TRUE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __ofono_log_init(gboolean detach, gboolean debug)
|
int __ofono_log_init(const char *debug, ofono_bool_t detach)
|
||||||
{
|
{
|
||||||
int option = LOG_NDELAY | LOG_PID;
|
int option = LOG_NDELAY | LOG_PID;
|
||||||
|
struct ofono_debug_desc *desc;
|
||||||
|
const char *name = NULL, *file = NULL;
|
||||||
|
|
||||||
|
if (debug != NULL)
|
||||||
|
enabled = g_strsplit_set(debug, ":, ", 0);
|
||||||
|
|
||||||
|
for (desc = __start___debug; desc < __stop___debug; desc++) {
|
||||||
|
if (file != NULL || name != NULL) {
|
||||||
|
if (g_strcmp0(desc->file, file) == 0) {
|
||||||
|
if (desc->name == NULL)
|
||||||
|
desc->name = name;
|
||||||
|
} else
|
||||||
|
file = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_enabled(desc) == TRUE)
|
||||||
|
desc->flags |= OFONO_DEBUG_FLAG_PRINT;
|
||||||
|
}
|
||||||
|
|
||||||
if (detach == FALSE)
|
if (detach == FALSE)
|
||||||
option |= LOG_PERROR;
|
option |= LOG_PERROR;
|
||||||
|
@ -127,8 +156,6 @@ int __ofono_log_init(gboolean detach, gboolean debug)
|
||||||
|
|
||||||
syslog(LOG_INFO, "oFono version %s", VERSION);
|
syslog(LOG_INFO, "oFono version %s", VERSION);
|
||||||
|
|
||||||
debug_enabled = debug;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,4 +164,6 @@ void __ofono_log_cleanup(void)
|
||||||
syslog(LOG_INFO, "Exit");
|
syslog(LOG_INFO, "Exit");
|
||||||
|
|
||||||
closelog();
|
closelog();
|
||||||
|
|
||||||
|
g_strfreev(enabled);
|
||||||
}
|
}
|
||||||
|
|
12
src/main.c
12
src/main.c
|
@ -74,9 +74,6 @@ static gboolean signal_cb(GIOChannel *channel, GIOCondition cond, gpointer data)
|
||||||
|
|
||||||
terminated++;
|
terminated++;
|
||||||
break;
|
break;
|
||||||
case SIGUSR2:
|
|
||||||
__ofono_toggle_debug();
|
|
||||||
break;
|
|
||||||
case SIGPIPE:
|
case SIGPIPE:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -93,13 +90,13 @@ static void system_bus_disconnected(DBusConnection *conn, void *user_data)
|
||||||
g_main_loop_quit(event_loop);
|
g_main_loop_quit(event_loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean option_debug = FALSE;
|
static gchar *option_debug = NULL;
|
||||||
static gboolean option_detach = TRUE;
|
static gboolean option_detach = TRUE;
|
||||||
static gboolean option_version = FALSE;
|
static gboolean option_version = FALSE;
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "debug", 'd', 0, G_OPTION_ARG_NONE, &option_debug,
|
{ "debug", 'd', 0, G_OPTION_ARG_STRING, &option_debug,
|
||||||
"Enable debug information output" },
|
"Specify debug options to enable", "DEBUG" },
|
||||||
{ "nodetach", 'n', G_OPTION_FLAG_REVERSE,
|
{ "nodetach", 'n', G_OPTION_FLAG_REVERSE,
|
||||||
G_OPTION_ARG_NONE, &option_detach,
|
G_OPTION_ARG_NONE, &option_detach,
|
||||||
"Don't run as daemon in background" },
|
"Don't run as daemon in background" },
|
||||||
|
@ -122,7 +119,6 @@ int main(int argc, char **argv)
|
||||||
sigemptyset(&mask);
|
sigemptyset(&mask);
|
||||||
sigaddset(&mask, SIGTERM);
|
sigaddset(&mask, SIGTERM);
|
||||||
sigaddset(&mask, SIGINT);
|
sigaddset(&mask, SIGINT);
|
||||||
sigaddset(&mask, SIGUSR2);
|
|
||||||
sigaddset(&mask, SIGPIPE);
|
sigaddset(&mask, SIGPIPE);
|
||||||
|
|
||||||
if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
|
if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
|
||||||
|
@ -185,7 +181,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__ofono_log_init(option_detach, option_debug);
|
__ofono_log_init(option_debug, option_detach);
|
||||||
|
|
||||||
dbus_error_init(&error);
|
dbus_error_init(&error);
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
|
|
||||||
#define OFONO_API_SUBJECT_TO_CHANGE
|
#define OFONO_API_SUBJECT_TO_CHANGE
|
||||||
|
|
||||||
|
#include <ofono/types.h>
|
||||||
|
|
||||||
void __ofono_exit();
|
void __ofono_exit();
|
||||||
|
|
||||||
int __ofono_manager_init();
|
int __ofono_manager_init();
|
||||||
|
@ -33,11 +35,9 @@ void __ofono_modem_shutdown();
|
||||||
|
|
||||||
#include <ofono/log.h>
|
#include <ofono/log.h>
|
||||||
|
|
||||||
int __ofono_log_init(gboolean detach, gboolean debug);
|
int __ofono_log_init(const char *debug, ofono_bool_t detach);
|
||||||
void __ofono_log_cleanup(void);
|
void __ofono_log_cleanup(void);
|
||||||
|
|
||||||
void __ofono_toggle_debug(void);
|
|
||||||
|
|
||||||
#include <ofono/dbus.h>
|
#include <ofono/dbus.h>
|
||||||
|
|
||||||
int __ofono_dbus_init(DBusConnection *conn);
|
int __ofono_dbus_init(DBusConnection *conn);
|
||||||
|
@ -61,8 +61,6 @@ void __ofono_dbus_pending_reply(DBusMessage **msg, DBusMessage *reply);
|
||||||
|
|
||||||
gboolean __ofono_dbus_valid_object_path(const char *path);
|
gboolean __ofono_dbus_valid_object_path(const char *path);
|
||||||
|
|
||||||
#include <ofono/types.h>
|
|
||||||
|
|
||||||
struct ofono_watchlist_item {
|
struct ofono_watchlist_item {
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
void *notify;
|
void *notify;
|
||||||
|
|
Loading…
Reference in New Issue