#include <fcntl.h>
#include <string.h>
#include <libbugreport.h>
+#include <bundle.h>
+#include <diagnostics.h>
#include "utils.h"
#include "log.h"
struct action_data {
- int stdout_fd;
- int stderr_fd;
-
struct data_source *ds;
enum limit_type lt;
GVariant *actual_value;
char format[20];
GVariantBuilder builder;
GVariant *signal_params = NULL;
+ bundle *event_data = NULL;
+ int killed = false;
+ int ret;
+ /* Kill the process */
+ if (ad->ds->process->kill) {
+ _I_PROC(ad->ds->process, "Killing process");
+ if (kill(ad->ds->process->pid, SIGKILL))
+ _E("Unable to kill process %s(%d): %m", ad->ds->process->name, ad->ds->process->pid);
+ else
+ killed = true;
+ }
+
+ /* Prepare dbus signal data */
if (snprintf(format, 20, "(is@%s@%s@a{sv})", g_variant_get_type_string(ad->actual_value),
g_variant_get_type_string(ad->allowed_value)) == -1) {
_E("Couldn't print dbus variant format: %m");
g_variant_builder_add(&builder, "{sv}",
"killed",
- g_variant_new_boolean(ad->ds->process->kill));
+ g_variant_new_boolean(killed));
g_variant_builder_add(&builder, "{sv}",
"process_name",
ad->allowed_value,
g_variant_builder_end(&builder));
-skip_dbus_signal:
+ /* Send DBus signal */
+ dbus_send_signal(objpath, interface, "AbnormalityDetected", signal_params);
- /* Kill the process */
- if (ad->ds->process->kill) {
- _I_PROC(ad->ds->process, "Killing process");
- if (kill(ad->ds->process->pid, SIGKILL))
- _E("Unable to kill process %s(%d): %m",
- ad->ds->process->name,
- ad->ds->process->pid);
- }
+ _I_PROC(ad->ds->process, "Sent D-Bus signal (%s, %s)",
+ limit_type_to_string(ad->lt),
+ ad->ds->param_name);
- /* Send signal */
- if (signal_params) {
- dbus_send_signal(objpath, interface, "AbnormalityDetected", signal_params);
+skip_dbus_signal:
- _I_PROC(ad->ds->process, "Sent D-Bus signal (%s, %s)",
- limit_type_to_string(ad->lt),
- ad->ds->param_name);
- } else {
- _E("Skipping D-Bus signal due to errors");
- }
+ /* Prepare diagnostic event data */
+ event_data = bundle_create();
+ bundle_add_str(event_data, "process_name", ad->ds->process->name);
+ bundle_add_byte(event_data, "pid", &ad->ds->process->pid, sizeof(int));
+ bundle_add_byte(event_data, "killed", &killed, sizeof(int));
+ bundle_add_str(event_data, "exceeded_parameter", ad->ds->param_name);
+ bundle_add_str(event_data, "process_state", process_is_foreground(ad->ds->process) ?
+ "foreground" : "background");
+
+ /* Send diagnostic event */
+ ret = diagnostics_send_event("AbnormalityDetected", event_data);
+ if (ret)
+ _E("Unable to send diagnostic event: %d", ret);
ad->ds->action_in_progress = 0;
+ bundle_free(event_data);
process_unref(ad->ds->process);
- close(ad->stdout_fd);
- close(ad->stderr_fd);
free(ad->report_path);
free(ad);
}