From 02cb69d8f3a7ba0cc51d87ee011df04992f54893 Mon Sep 17 00:00:00 2001 From: Arjan van de Ven Date: Sat, 17 Jan 2009 17:26:54 +0200 Subject: [PATCH] start adding the dbus/permission side --- Makefile | 9 ++++-- coredumper.h | 21 +++++++++++++ corewatcher.c | 49 ++++++++++++++++++++++++----- dbus.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ webinterface.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 250 insertions(+), 10 deletions(-) create mode 100644 dbus.c create mode 100644 webinterface.c diff --git a/Makefile b/Makefile index 9fccd64..e2d9d3f 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,13 @@ all: corewatcher -CFLAGS = -O2 -g -Wall -W -D_FORTIFY_SOURCE=2 -fstack-protector +CFLAGS := -O2 -g -Wall -W -D_FORTIFY_SOURCE=2 -fstack-protector -LIBS = corewatcher.o find_file.o +CFLAGS += `pkg-config --cflags glib-2.0` `pkg-config --cflags dbus-glib-1` +LINKFLAGS += `pkg-config --libs glib-2.0` `pkg-config --libs dbus-glib-1` `curl-config --libs` + +LIBS = corewatcher.o find_file.o webinterface.o dbus.o corewatcher: $(LIBS) coredumper.h Makefile - gcc $(CFLAGS) $(LIBS) -o corewatcher + gcc $(CFLAGS) $(LIBS) $(LINKFLAGS) -o corewatcher clean: rm -f *.o extract_core DEADJOE corewatcher *~ diff --git a/coredumper.h b/coredumper.h index 49c2282..881346d 100644 --- a/coredumper.h +++ b/coredumper.h @@ -10,6 +10,27 @@ #ifndef __INCLUDE_GUARD_COREDUMPER_H__ #define __INCLUDE_GUARD_COREDUMPER_H__ + +#include + +#define __unused __attribute__ ((__unused__)) + + extern char *find_executable(char *fragment); extern char *find_coredump(char *corefile); +extern void dbus_say_thanks(void); +extern GList *coredumps; +extern void submit_queue(void); +extern void clear_queue(void); + +#include +#include +#include + +extern DBusConnection *bus; +extern DBusHandlerResult got_message( + DBusConnection __unused *conn, + DBusMessage *message, + void __unused *user_data); + #endif diff --git a/corewatcher.c b/corewatcher.c index 945cc09..7af3eaf 100644 --- a/corewatcher.c +++ b/corewatcher.c @@ -23,6 +23,12 @@ #include #include +#include +#include +#include +#include + +GList *coredumps; #include "coredumper.h" @@ -98,6 +104,7 @@ void process_corefile(char *filename) if (!ptr) return; + coredumps = g_list_append(coredumps, ptr); printf("-%s-\n", ptr); unlink(filename); @@ -137,24 +144,52 @@ void clean_directory(void) closedir(dir); } -int main(int argc, char **argv) +int main(int __unused argc, char __unused **argv) { + GMainLoop *loop; + DBusError error; + GPollFD GPFD; + memset(&GPFD, 0, sizeof(GPFD)); + +/* + * Signal the kernel that we're not timing critical + */ +#ifdef PR_SET_TIMERSLACK + prctl(PR_SET_TIMERSLACK,1000*1000*1000, 0, 0, 0); +#endif + inotifd = inotify_init(); + GPFD.fd = inotifd; if (inotifd < 0) { printf("No inotify support in the kernel... aborting\n"); return EXIT_FAILURE; } inotify_descriptor = inotify_add_watch(inotifd, "/var/cores/", IN_CLOSE_WRITE); - if (argc > 1) { - process_corefile(argv[1]); - } else { - clean_directory(); - wait_for_corefile(); + + clean_directory(); + + loop = g_main_loop_new(NULL, FALSE); + dbus_error_init(&error); + bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + if (bus) { + dbus_connection_setup_with_g_main(bus, NULL); + dbus_bus_add_match(bus, "type='signal',interface='org.moblin.coredump.ping'", &error); + dbus_bus_add_match(bus, "type='signal',interface='org.moblin.coredump.permission'", &error); + dbus_connection_add_filter(bus, got_message, NULL, NULL); } + g_main_context_add_poll(NULL, &GPFD, 0); + + g_main_loop_run(loop); + dbus_bus_remove_match(bus, "type='signal',interface='org.kerneloops.submit.ping'", &error); + dbus_bus_remove_match(bus, "type='signal',interface='org.kerneloops.submit.permission'", &error); + + g_main_loop_unref(loop); inotify_rm_watch(inotifd, inotify_descriptor); close(inotifd); return EXIT_SUCCESS; -} \ No newline at end of file +} + + diff --git a/dbus.c b/dbus.c new file mode 100644 index 0000000..f451045 --- /dev/null +++ b/dbus.c @@ -0,0 +1,97 @@ +/* + * Core dump watcher & collector + * + * (C) 2009 Intel Corporation + * + * Authors: + * Arjan van de Ven + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License. + */ + +#define _BSD_SOURCE +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "coredumper.h" + +DBusConnection *bus; + +int pinged; +int opted_in = 1; + +DBusHandlerResult got_message( + DBusConnection __unused *conn, + DBusMessage *message, + void __unused *user_data) +{ + if (dbus_message_is_signal(message, + "org.moblin.coredump.ping", "ping")) { + pinged = 1; + return DBUS_HANDLER_RESULT_HANDLED; + } + + if (dbus_message_is_signal(message, + "org.moblin.coredump.permission", "yes")) { + submit_queue(); + return DBUS_HANDLER_RESULT_HANDLED; + } + if (dbus_message_is_signal(message, + "org.moblin.coredump.permission", "always")) { + submit_queue(); + opted_in = 2; + return DBUS_HANDLER_RESULT_HANDLED; + } + if (dbus_message_is_signal(message, + "org.moblin.coredump.permission", "never")) { + clear_queue(); + opted_in = 0; + return DBUS_HANDLER_RESULT_HANDLED; + } + if (dbus_message_is_signal(message, + "org.moblin.coredump.permission", "no")) { + clear_queue(); + return DBUS_HANDLER_RESULT_HANDLED; + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +void dbus_ask_permission(char * detail_file_name) +{ + DBusMessage *message; + if (!bus) + return; + message = dbus_message_new_signal("/org/moblin/coredump/permission", + "org.moblin.coredump.permission", "ask"); + if (detail_file_name) { + dbus_message_append_args(message, + DBUS_TYPE_STRING, &detail_file_name, + DBUS_TYPE_INVALID); + } + dbus_connection_send(bus, message, NULL); + dbus_message_unref(message); +} + +void dbus_say_thanks(void) +{ + DBusMessage *message; + if (!bus) + return; + + message = dbus_message_new_signal("/org/moblin/coredump/sent", + "org.moblin.coredump.sent", "sent"); + dbus_connection_send(bus, message, NULL); + dbus_message_unref(message); +} + diff --git a/webinterface.c b/webinterface.c new file mode 100644 index 0000000..2ad06d0 --- /dev/null +++ b/webinterface.c @@ -0,0 +1,84 @@ +/* + * Core dump watcher & collector + * + * (C) 2009 Intel Corporation + * + * Authors: + * Arjan van de Ven + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License. + */ + +#define _BSD_SOURCE +#include +#include +#include +#include +#include +#include + +#include + +#include "coredumper.h" + +char *submit_url = "http://localhost/submit_backtrace.php"; + +void submit_queue(void) +{ + int result; + int count = 0; + GList *entry, *next; + + entry = g_list_first(coredumps); + + while (entry) { + char *backtrace; + CURL *handle; + + backtrace = entry->data; + next = g_list_next(entry); + + coredumps = g_list_delete_link(coredumps, entry); + entry = next; + + struct curl_httppost *post = NULL; + struct curl_httppost *last = NULL; + + handle = curl_easy_init(); + + printf("DEBUG SUBMIT URL is %s \n", submit_url); + curl_easy_setopt(handle, CURLOPT_URL, submit_url); + + /* set up the POST data */ + curl_formadd(&post, &last, + CURLFORM_COPYNAME, "backtrace", + CURLFORM_COPYCONTENTS, backtrace, CURLFORM_END); + + curl_easy_setopt(handle, CURLOPT_HTTPPOST, post); + result = curl_easy_perform(handle); + + curl_formfree(post); + curl_easy_cleanup(handle); + free(backtrace); + count++; + } + + if (count) + dbus_say_thanks(); +} + +void clear_queue(void) +{ + GList *entry, *next; + + entry = g_list_first(coredumps); + + while (entry) { + next = g_list_next(entry); + coredumps = g_list_delete_link(coredumps, entry); + entry = next; + } +} + -- 2.7.4