Nikola Pajkovsky 1fe8d9b
From 42953f66890978304f2b3645c378f5c87b8f2547 Mon Sep 17 00:00:00 2001
Nikola Pajkovsky 1fe8d9b
Message-Id: <42953f66890978304f2b3645c378f5c87b8f2547.1317995685.git.npajkovs@redhat.com>
Nikola Pajkovsky 1fe8d9b
From: Nikola Pajkovsky <npajkovs@redhat.com>
Nikola Pajkovsky 1fe8d9b
Date: Fri, 7 Oct 2011 15:54:38 +0200
Nikola Pajkovsky 1fe8d9b
Subject: [PATCH] refuse reporting when *not-reportable* file exist
Nikola Pajkovsky 1fe8d9b
Nikola Pajkovsky 1fe8d9b
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Nikola Pajkovsky 1fe8d9b
---
Nikola Pajkovsky 1fe8d9b
 src/cli/cli-report.c             |   20 ++++++++++++++++++++
Nikola Pajkovsky 1fe8d9b
 src/gui-wizard-gtk/wizard.c      |   38 +++++++++++++++++++++++++++++++-------
Nikola Pajkovsky 1fe8d9b
 src/include/internal_libreport.h |    3 ++-
Nikola Pajkovsky 1fe8d9b
 src/lib/kernel-tainted.c         |   26 +++++++++++++-------------
Nikola Pajkovsky 1fe8d9b
 4 files changed, 66 insertions(+), 21 deletions(-)
Nikola Pajkovsky 1fe8d9b
Nikola Pajkovsky 1fe8d9b
diff --git a/src/cli/cli-report.c b/src/cli/cli-report.c
Nikola Pajkovsky 1fe8d9b
index 49a0598..2aebc51 100644
Nikola Pajkovsky 1fe8d9b
--- a/src/cli/cli-report.c
Nikola Pajkovsky 1fe8d9b
+++ b/src/cli/cli-report.c
Nikola Pajkovsky 1fe8d9b
@@ -684,6 +684,26 @@ int report(const char *dump_dir_name, int flags)
Nikola Pajkovsky 1fe8d9b
     if (!dd)
Nikola Pajkovsky 1fe8d9b
         return -1;
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
+    char *not_reportable = dd_load_text_ext(dd, FILENAME_NOT_REPORTABLE, 0
Nikola Pajkovsky 1fe8d9b
+                                            | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
Nikola Pajkovsky 1fe8d9b
+                                            | DD_FAIL_QUIETLY_ENOENT
Nikola Pajkovsky 1fe8d9b
+                                            | DD_FAIL_QUIETLY_EACCES);
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
+    if (not_reportable)
Nikola Pajkovsky 1fe8d9b
+    {
Nikola Pajkovsky 1fe8d9b
+        char *reason = dd_load_text_ext(dd, FILENAME_REASON, 0
Nikola Pajkovsky 1fe8d9b
+                                        | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
Nikola Pajkovsky 1fe8d9b
+        char *t = xasprintf("%s%s%s",
Nikola Pajkovsky 1fe8d9b
+                            not_reportable ?: "",
Nikola Pajkovsky 1fe8d9b
+                            not_reportable ? ": " : "",
Nikola Pajkovsky 1fe8d9b
+                            reason ?: _("(no description)"));
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
+        dd_close(dd);
Nikola Pajkovsky 1fe8d9b
+        error_msg("%s", t);
Nikola Pajkovsky 1fe8d9b
+        free(t);
Nikola Pajkovsky 1fe8d9b
+        xfunc_die();
Nikola Pajkovsky 1fe8d9b
+    }
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
     if (!(flags & CLI_REPORT_ONLY))
Nikola Pajkovsky 1fe8d9b
     {
Nikola Pajkovsky 1fe8d9b
         char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
Nikola Pajkovsky 1fe8d9b
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
Nikola Pajkovsky 1fe8d9b
index 6048847..6ea0e30 100644
Nikola Pajkovsky 1fe8d9b
--- a/src/gui-wizard-gtk/wizard.c
Nikola Pajkovsky 1fe8d9b
+++ b/src/gui-wizard-gtk/wizard.c
Nikola Pajkovsky 1fe8d9b
@@ -719,7 +719,16 @@ void update_gui_state_from_problem_data(void)
Nikola Pajkovsky 1fe8d9b
     gtk_window_set_title(GTK_WINDOW(g_assistant), g_dump_dir_name);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
     const char *reason = get_problem_item_content_or_NULL(g_cd, FILENAME_REASON);
Nikola Pajkovsky 1fe8d9b
-    gtk_label_set_text(g_lbl_cd_reason, reason ? reason : _("(no description)"));
Nikola Pajkovsky 1fe8d9b
+    const char *not_reportable = get_problem_item_content_or_NULL(g_cd,
Nikola Pajkovsky 1fe8d9b
+                                                                  FILENAME_NOT_REPORTABLE);
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
+    char *t = xasprintf("%s%s%s",
Nikola Pajkovsky 1fe8d9b
+                        not_reportable ?: "",
Nikola Pajkovsky 1fe8d9b
+                        not_reportable ? ": " : "",
Nikola Pajkovsky 1fe8d9b
+                        reason ?: _("(no description)"));
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
+    gtk_label_set_text(g_lbl_cd_reason, t);
Nikola Pajkovsky 1fe8d9b
+    free(t);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
     gtk_list_store_clear(g_ls_details);
Nikola Pajkovsky 1fe8d9b
     struct cd_stats stats = { 0 };
Nikola Pajkovsky 1fe8d9b
@@ -1605,12 +1614,21 @@ static void add_pages()
Nikola Pajkovsky 1fe8d9b
             error_msg_and_die("Can't load %s: %s", g_glade_file, error->message);
Nikola Pajkovsky 1fe8d9b
     }
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
+    struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY | DD_FAIL_QUIETLY_EACCES);
Nikola Pajkovsky 1fe8d9b
+    if (!dd)
Nikola Pajkovsky 1fe8d9b
+        return;
Nikola Pajkovsky 1fe8d9b
+    char *not_reportable = dd_load_text_ext(dd, FILENAME_NOT_REPORTABLE, 0
Nikola Pajkovsky 1fe8d9b
+                                            | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
Nikola Pajkovsky 1fe8d9b
+                                            | DD_FAIL_QUIETLY_ENOENT
Nikola Pajkovsky 1fe8d9b
+                                            | DD_FAIL_QUIETLY_EACCES);
Nikola Pajkovsky 1fe8d9b
+    dd_close(dd);
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
     int i;
Nikola Pajkovsky 1fe8d9b
     int page_no = 0;
Nikola Pajkovsky 1fe8d9b
     for (i = 0; page_names[i] != NULL; i++)
Nikola Pajkovsky 1fe8d9b
     {
Nikola Pajkovsky 1fe8d9b
         char *delim = strrchr(page_names[i], '_');
Nikola Pajkovsky 1fe8d9b
-        if (delim != NULL)
Nikola Pajkovsky 1fe8d9b
+        if (!not_reportable && delim)
Nikola Pajkovsky 1fe8d9b
         {
Nikola Pajkovsky 1fe8d9b
             if (g_report_only && (strncmp(delim + 1, "report", strlen("report"))) != 0)
Nikola Pajkovsky 1fe8d9b
             {
Nikola Pajkovsky 1fe8d9b
@@ -1632,7 +1650,10 @@ static void add_pages()
Nikola Pajkovsky 1fe8d9b
         gtk_assistant_set_page_complete(g_assistant, page, true);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
         gtk_assistant_set_page_title(g_assistant, page, pages[i].title);
Nikola Pajkovsky 1fe8d9b
-        gtk_assistant_set_page_type(g_assistant, page, pages[i].type);
Nikola Pajkovsky 1fe8d9b
+        if (not_reportable && i == 0)
Nikola Pajkovsky 1fe8d9b
+            gtk_assistant_set_page_type(g_assistant, pages[i].page_widget, GTK_ASSISTANT_PAGE_SUMMARY);
Nikola Pajkovsky 1fe8d9b
+        else
Nikola Pajkovsky 1fe8d9b
+            gtk_assistant_set_page_type(g_assistant, page, pages[i].type);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
         VERB1 log("added page: %s", page_names[i]);
Nikola Pajkovsky 1fe8d9b
     }
Nikola Pajkovsky 1fe8d9b
@@ -1680,10 +1701,13 @@ static void add_pages()
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
     /* Add "Close" button */
Nikola Pajkovsky 1fe8d9b
     GtkWidget *w;
Nikola Pajkovsky 1fe8d9b
-    w = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
Nikola Pajkovsky 1fe8d9b
-    g_signal_connect(w, "clicked", G_CALLBACK(gtk_main_quit), NULL);
Nikola Pajkovsky 1fe8d9b
-    gtk_widget_show(w);
Nikola Pajkovsky 1fe8d9b
-    gtk_assistant_add_action_widget(g_assistant, w);
Nikola Pajkovsky 1fe8d9b
+    if (!not_reportable)
Nikola Pajkovsky 1fe8d9b
+    {
Nikola Pajkovsky 1fe8d9b
+        w = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
Nikola Pajkovsky 1fe8d9b
+        g_signal_connect(w, "clicked", G_CALLBACK(gtk_main_quit), NULL);
Nikola Pajkovsky 1fe8d9b
+        gtk_widget_show(w);
Nikola Pajkovsky 1fe8d9b
+        gtk_assistant_add_action_widget(g_assistant, w);
Nikola Pajkovsky 1fe8d9b
+    }
Nikola Pajkovsky 1fe8d9b
     /* and hide "Cancel" button - "Close" is a better name for what we want */
Nikola Pajkovsky 1fe8d9b
     gtk_assistant_commit(g_assistant);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h
Nikola Pajkovsky 1fe8d9b
index c7811a5..16e50bd 100644
Nikola Pajkovsky 1fe8d9b
--- a/src/include/internal_libreport.h
Nikola Pajkovsky 1fe8d9b
+++ b/src/include/internal_libreport.h
Nikola Pajkovsky 1fe8d9b
@@ -575,7 +575,7 @@ int delete_dump_dir_possibly_using_abrtd(const char *dump_dir_name);
Nikola Pajkovsky 1fe8d9b
 struct dump_dir *steal_directory(const char *base_dir, const char *dump_dir_name);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
 #define kernel_tainted_short libreport_kernel_tainted_short
Nikola Pajkovsky 1fe8d9b
-char *kernel_tainted_short(unsigned tainted);
Nikola Pajkovsky 1fe8d9b
+char *kernel_tainted_short(const char *kernel_bt);
Nikola Pajkovsky 1fe8d9b
 #define kernel_tainted_long libreport_kernel_tainted_long
Nikola Pajkovsky 1fe8d9b
 GList *kernel_tainted_long(unsigned tainted);
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
@@ -629,6 +629,7 @@ GList *kernel_tainted_long(unsigned tainted);
Nikola Pajkovsky 1fe8d9b
  */
Nikola Pajkovsky 1fe8d9b
 #define FILENAME_REPORTED_TO  "reported_to"
Nikola Pajkovsky 1fe8d9b
 #define FILENAME_EVENT_LOG    "event_log"
Nikola Pajkovsky 1fe8d9b
+#define FILENAME_NOT_REPORTABLE "not-reportable"
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
 // Not stored as files, added "on the fly":
Nikola Pajkovsky 1fe8d9b
 #define CD_DUMPDIR            "Directory"
Nikola Pajkovsky 1fe8d9b
diff --git a/src/lib/kernel-tainted.c b/src/lib/kernel-tainted.c
Nikola Pajkovsky 1fe8d9b
index 3595408..efca2c8 100644
Nikola Pajkovsky 1fe8d9b
--- a/src/lib/kernel-tainted.c
Nikola Pajkovsky 1fe8d9b
+++ b/src/lib/kernel-tainted.c
Nikola Pajkovsky 1fe8d9b
@@ -18,6 +18,12 @@
Nikola Pajkovsky 1fe8d9b
 */
Nikola Pajkovsky 1fe8d9b
 #include "internal_libreport.h"
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
+/* reading /proc/sys/kernel/tainted file after an oops is ALWAYS going
Nikola Pajkovsky 1fe8d9b
+ * to show it as tainted.
Nikola Pajkovsky 1fe8d9b
+ *
Nikola Pajkovsky 1fe8d9b
+ * https://bugzilla.redhat.com/show_bug.cgi?id=724838
Nikola Pajkovsky 1fe8d9b
+ */
Nikola Pajkovsky 1fe8d9b
+
Nikola Pajkovsky 1fe8d9b
 /* From RHEL6 kernel/panic.c: */
Nikola Pajkovsky 1fe8d9b
 static const int tnts_short[] = {
Nikola Pajkovsky 1fe8d9b
 	 'P' ,
Nikola Pajkovsky 1fe8d9b
@@ -106,21 +112,15 @@ static const char *const tnts_long[] = {
Nikola Pajkovsky 1fe8d9b
     "Tech_preview",
Nikola Pajkovsky 1fe8d9b
 };
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
-char *kernel_tainted_short(unsigned tainted)
Nikola Pajkovsky 1fe8d9b
+char *kernel_tainted_short(const char *kernel_bt)
Nikola Pajkovsky 1fe8d9b
 {
Nikola Pajkovsky 1fe8d9b
-    char *tnt = xzalloc(ARRAY_SIZE(tnts_short) + 1);
Nikola Pajkovsky 1fe8d9b
-    int i = 0;
Nikola Pajkovsky 1fe8d9b
-    while (tainted)
Nikola Pajkovsky 1fe8d9b
-    {
Nikola Pajkovsky 1fe8d9b
-        if (0x1 & tainted)
Nikola Pajkovsky 1fe8d9b
-            tnt[i] = tnts_short[i];
Nikola Pajkovsky 1fe8d9b
-        else
Nikola Pajkovsky 1fe8d9b
-            tnt[i] = '-';
Nikola Pajkovsky 1fe8d9b
-
Nikola Pajkovsky 1fe8d9b
-        ++i;
Nikola Pajkovsky 1fe8d9b
-        tainted >>= 1;
Nikola Pajkovsky 1fe8d9b
-    }
Nikola Pajkovsky 1fe8d9b
+    /* example of flags: |G    B      | */
Nikola Pajkovsky 1fe8d9b
+    char *tainted = strstr(kernel_bt, "Tainted: ");
Nikola Pajkovsky 1fe8d9b
+    if (!tainted)
Nikola Pajkovsky 1fe8d9b
+        return NULL;
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
+    /* 12 == count of flags */
Nikola Pajkovsky 1fe8d9b
+    char *tnt = xstrndup(tainted + strlen("Tainted: "), 12);
Nikola Pajkovsky 1fe8d9b
     return tnt;
Nikola Pajkovsky 1fe8d9b
 }
Nikola Pajkovsky 1fe8d9b
 
Nikola Pajkovsky 1fe8d9b
-- 
Nikola Pajkovsky 1fe8d9b
1.7.7.rc0.70.g82660
Nikola Pajkovsky 1fe8d9b