Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- src/cli/cli.c | 34 +++++++++++++++- src/cli/report.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++---- src/cli/report.h | 3 +- src/plugins/Makefile.am | 4 +- 4 files changed, 122 insertions(+), 15 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..a9e70bc 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
+ /* Get settings */ + load_event_config_data(); + /* Do the selected operation. */ int exitcode = 0; switch (op) @@ -409,15 +412,40 @@ int main(int argc, char** argv) } case OPT_INFO: { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1; + + char *events_as_lines = list_possible_events(dd, NULL, "analyze"); crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); + + GList *list_events = NULL; + if (events_as_lines && *events_as_lines) + { + char *events = events_as_lines; + while (*events) + { + char *end = strchrnul(events, '\n'); + char *tmp = xstrndup(events, end - events); + list_events = g_list_append(list_events, tmp); + events = end; + if (!*events) + break; + events++; + } + + char *event = select_event_option(list_events); + list_free_with_free(list_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..f1836b4 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0 && run_state->children_count == 0) { - l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str()); + l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", + event.c_str()); r = -1; } if (r == 0) @@ -585,33 +586,110 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name) + +int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log; - int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB"); + int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{ + if (!list_options) + return NULL; + + unsigned count = g_list_length(list_options) - 1; + if (!count) + return NULL; + + int pos = -1; + fprintf(stdout, "Select how you would like to analyze the problem:\n"); + for (GList *li = list_options; li; li = li->next) + { + char *opt = (char*)li->data; + event_config_t *config = get_event_config(opt); + if (config) + { + ++pos; + printf(" %i) %s\n", pos, config->screen_name); + } + } + + unsigned picked; + unsigned ii; + for (ii = 0; ii < 3; ++ii) + { + fprintf(stdout, "Choose option [0 - %u]: ", count); + fflush(NULL); + + char answer[16]; + if (!fgets(answer, sizeof(answer), stdin)) + continue; + + answer[strlen(answer) - 1] = '\0'; + if (!*answer) + continue; + + picked = xatou(answer); + if (picked > count) + { + log(_("You have chosen number out of range")); + continue; + } + + break; + } + + if (ii == 3) + error_msg_and_die(_("Invalid input, porgram exiting...")); + + GList *choosen = g_list_nth(list_options, picked); + return xstrdup((char*)choosen->data); +}
/* Report the crash */ int report(const char *dump_dir_name, int flags) { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); - char *events_as_lines = list_possible_events(dd, NULL, ""); + char *events_as_lines = list_possible_events(dd, NULL, "analyze"); dd_close(dd);
+ GList *list_events = NULL; + if (events_as_lines && *events_as_lines) + { + char *events = events_as_lines; + while (*events) + { + char *end = strchrnul(events, '\n'); + char *tmp = xstrndup(events, end - events); + list_events = g_list_append(list_events, tmp); + events = end; + if (!*events) + break; + events++; + } + + char *event = select_event_option(list_events); + list_free_with_free(list_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + if (!(flags & CLI_REPORT_BATCH)) { /* Open text editor and give a chance to review the backtrace etc */ diff --git a/src/cli/report.h b/src/cli/report.h index 58b8c25..28485d7 100644 --- a/src/cli/report.h +++ b/src/cli/report.h @@ -22,7 +22,8 @@ extern "C" { #endif
-int run_analyze_event(const char *dump_dir_name); +int run_analyze_event(const char *dump_dir_name, const char *analyzer); +char *select_event_option(GList *list_options);
/* Report the crash */ enum { diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5344cdb..7468188 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR): $(mkdir_p) '$@'
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR) - $(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml - $(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml + $(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml + $(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
abrt_dump_oops_SOURCES = \ abrt-dump-oops.c
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- src/cli/cli.c | 40 +++++++++++++++++- src/cli/report.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++---- src/cli/report.h | 3 +- src/plugins/Makefile.am | 4 +- 4 files changed, 135 insertions(+), 15 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..5cffc03 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
+ /* Get settings */ + load_event_config_data(); + /* Do the selected operation. */ int exitcode = 0; switch (op) @@ -409,15 +412,46 @@ int main(int argc, char** argv) } case OPT_INFO: { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1; + + char *events_as_lines = list_possible_events(dd, NULL, "analyze"); + dd_close(dd); + + GList *list_events = NULL; + if (events_as_lines && *events_as_lines) + { + char *events = events_as_lines; + while (*events) + { + char *end = strchrnul(events, '\n'); + char *tmp = xstrndup(events, end - events); + list_events = g_list_append(list_events, tmp); + events = end; + if (!*events) + break; + events++; + } + + char *event = select_event_option(list_events); + list_free_with_free(list_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + /* Load crash_data from (possibly updated by analyze) dump dir */ + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return -1; + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); + add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..dfec62b 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0 && run_state->children_count == 0) { - l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str()); + l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", + event.c_str()); r = -1; } if (r == 0) @@ -585,33 +586,117 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name) + +int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log; - int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB"); + int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{ + if (!list_options) + return NULL; + + unsigned count = g_list_length(list_options) - 1; + if (!count) + return NULL; + + int pos = -1; + fprintf(stdout, "Select how you would like to analyze the problem:\n"); + for (GList *li = list_options; li; li = li->next) + { + char *opt = (char*)li->data; + event_config_t *config = get_event_config(opt); + if (config) + { + ++pos; + printf(" %i) %s\n", pos, config->screen_name); + } + } + + unsigned picked; + unsigned ii; + for (ii = 0; ii < 3; ++ii) + { + fprintf(stdout, "Choose option [0 - %u]: ", count); + fflush(NULL); + + char answer[16]; + if (!fgets(answer, sizeof(answer), stdin)) + continue; + + answer[strlen(answer) - 1] = '\0'; + if (!*answer) + continue; + + picked = xatou(answer); + if (picked > count) + { + log(_("You have chosen number out of range")); + continue; + } + + break; + } + + if (ii == 3) + error_msg_and_die(_("Invalid input, porgram exiting...")); + + GList *choosen = g_list_nth(list_options, picked); + return xstrdup((char*)choosen->data); +}
/* Report the crash */ int report(const char *dump_dir_name, int flags) { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
+ char *events_as_lines = list_possible_events(dd, NULL, "analyze"); + dd_close(dd); + + GList *list_events = NULL; + if (events_as_lines && *events_as_lines) + { + char *events = events_as_lines; + while (*events) + { + char *end = strchrnul(events, '\n'); + char *tmp = xstrndup(events, end - events); + list_events = g_list_append(list_events, tmp); + events = end; + if (!*events) + break; + events++; + } + + char *event = select_event_option(list_events); + list_free_with_free(list_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + /* Load crash_data from (possibly updated by analyze) dump dir */ + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return -1; + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); - char *events_as_lines = list_possible_events(dd, NULL, ""); dd_close(dd);
+ if (!(flags & CLI_REPORT_BATCH)) { /* Open text editor and give a chance to review the backtrace etc */ diff --git a/src/cli/report.h b/src/cli/report.h index 58b8c25..28485d7 100644 --- a/src/cli/report.h +++ b/src/cli/report.h @@ -22,7 +22,8 @@ extern "C" { #endif
-int run_analyze_event(const char *dump_dir_name); +int run_analyze_event(const char *dump_dir_name, const char *analyzer); +char *select_event_option(GList *list_options);
/* Report the crash */ enum { diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5344cdb..7468188 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR): $(mkdir_p) '$@'
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR) - $(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml - $(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml + $(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml + $(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
abrt_dump_oops_SOURCES = \ abrt-dump-oops.c
On 03/28/2011 04:29 PM, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovskynpajkovs@redhat.com
src/cli/cli.c | 40 +++++++++++++++++- src/cli/report.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++---- src/cli/report.h | 3 +- src/plugins/Makefile.am | 4 +- 4 files changed, 135 insertions(+), 15 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..5cffc03 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
- /* Get settings */
- load_event_config_data();
/* Do the selected operation. */ int exitcode = 0; switch (op)
@@ -409,15 +412,46 @@ int main(int argc, char** argv) } case OPT_INFO: {
if (run_analyze_event(dump_dir_name) != 0)
return 1;
/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
===== start here ===
char *events_as_lines = list_possible_events(dd, NULL, "analyze");
dd_close(dd);
GList *list_events = NULL;
if (events_as_lines&& *events_as_lines)
{
char *events = events_as_lines;
while (*events)
{
char *end = strchrnul(events, '\n');
char *tmp = xstrndup(events, end - events);
list_events = g_list_append(list_events, tmp);
events = end;
if (!*events)
break;
events++;
}
char *event = select_event_option(list_events);
list_free_with_free(list_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
}
/* Load crash_data from (possibly updated by analyze) dump dir */
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return -1;
crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd);
add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
- this code ^ is used in cli.c and report.cpp, how about make it into a function?
the rest seems ok - maybe we can make crash_data a global variable and share it between report.cpp and cli.c ?
Jirka
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- src/cli/cli.c | 31 ++++++++++- src/cli/report.cpp | 135 ++++++++++++++++++++++++++++++++++++++++------- src/cli/report.h | 4 +- src/plugins/Makefile.am | 4 +- 4 files changed, 148 insertions(+), 26 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..4e0042f 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
+ /* Get settings */ + load_event_config_data(); + /* Do the selected operation. */ int exitcode = 0; switch (op) @@ -409,15 +412,37 @@ int main(int argc, char** argv) } case OPT_INFO: { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1; + + char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze"); + dd_close(dd); + + if (analyze_events_as_lines && *analyze_events_as_lines) + { + GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n'); + free(analyze_events_as_lines); + + char *event = select_event_option(list_analyze_events); + list_free_with_free(list_analyze_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + + /* Load crash_data from (possibly updated by analyze) dump dir */ + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return -1; + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); + add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..ef101b8 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0 && run_state->children_count == 0) { - l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str()); + l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", + event.c_str()); r = -1; } if (r == 0) @@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name) + +int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log; - int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB"); + int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{ + if (!list_options) + return NULL; + + unsigned count = g_list_length(list_options) - 1; + if (!count) + return NULL; + + int pos = -1; + fprintf(stdout, "Select how you would like to analyze the problem:\n"); + for (GList *li = list_options; li; li = li->next) + { + char *opt = (char*)li->data; + event_config_t *config = get_event_config(opt); + if (config) + { + ++pos; + printf(" %i) %s\n", pos, config->screen_name); + } + } + + unsigned picked; + unsigned ii; + for (ii = 0; ii < 3; ++ii) + { + fprintf(stdout, "Choose option [0 - %u]: ", count); + fflush(NULL); + + char answer[16]; + if (!fgets(answer, sizeof(answer), stdin)) + continue; + + answer[strlen(answer) - 1] = '\0'; + if (!*answer) + continue; + + picked = xatou(answer); + if (picked > count) + { + log(_("You have chosen number out of range")); + continue; + } + + break; + } + + if (ii == 3) + error_msg_and_die(_("Invalid input, porgram exiting...")); + + GList *choosen = g_list_nth(list_options, picked); + return xstrdup((char*)choosen->data); +} + +GList *str_to_glist(char *str, int delim) +{ + GList *list = NULL; + while (*str) + { + char *end = strchrnul(str, delim); + char *tmp = xstrndup(str, end - str); + if (*tmp) + list = g_list_append(list, tmp); + + str = end; + if (!*str) + break; + str++; + } + + if (!list && !g_list_length(list)) + return NULL; + + return list; +}
/* Report the crash */ int report(const char *dump_dir_name, int flags) { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
+ char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze"); + dd_close(dd); + + if (analyze_events_as_lines && *analyze_events_as_lines) + { + GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n'); + free(analyze_events_as_lines); + + char *event = select_event_option(list_analyze_events); + list_free_with_free(list_analyze_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + + /* Load crash_data from (possibly updated by analyze) dump dir */ + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return -1; + + char *report_events_as_lines = list_possible_events(dd, NULL, "report"); crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); - char *events_as_lines = list_possible_events(dd, NULL, ""); dd_close(dd);
if (!(flags & CLI_REPORT_BATCH)) @@ -620,7 +718,7 @@ int report(const char *dump_dir_name, int flags) if (result != 0) { free_crash_data(crash_data); - free(events_as_lines); + free(report_events_as_lines); return 1; } /* Save comment, backtrace */ @@ -639,26 +737,24 @@ int report(const char *dump_dir_name, int flags) }
/* Get possible reporters associated with this particular crash */ + /* TODO: npajkovs: remove this annoying c++ vector_string_t */ vector_string_t report_events; - if (events_as_lines) + if (report_events_as_lines && *report_events_as_lines) { - char *events = events_as_lines; + char *events = report_events_as_lines; while (*events) { char *end = strchrnul(events, '\n'); - if (strncmp(events, "report", 6) == 0 - && (events[6] == '\0' || events[6] == '_') - ) { - char *tmp = xstrndup(events, end - events); - report_events.push_back(tmp); - free(tmp); - } + char *tmp = xstrndup(events, end - events); + report_events.push_back(tmp); + free(tmp); events = end; if (!*events) break; events++; } } + free(report_events_as_lines);
/* Get settings */ load_event_config_data(); @@ -723,6 +819,5 @@ int report(const char *dump_dir_name, int flags)
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors); free_crash_data(crash_data); - free(events_as_lines); return errors; } diff --git a/src/cli/report.h b/src/cli/report.h index 58b8c25..a393784 100644 --- a/src/cli/report.h +++ b/src/cli/report.h @@ -22,7 +22,9 @@ extern "C" { #endif
-int run_analyze_event(const char *dump_dir_name); +int run_analyze_event(const char *dump_dir_name, const char *analyzer); +char *select_event_option(GList *list_options); +GList *str_to_glist(char *str, int delim);
/* Report the crash */ enum { diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5344cdb..7468188 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR): $(mkdir_p) '$@'
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR) - $(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml - $(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml + $(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml + $(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
abrt_dump_oops_SOURCES = \ abrt-dump-oops.c
On 03/29/2011 10:44 AM, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovskynpajkovs@redhat.com
src/cli/cli.c | 31 ++++++++++- src/cli/report.cpp | 135 ++++++++++++++++++++++++++++++++++++++++------- src/cli/report.h | 4 +- src/plugins/Makefile.am | 4 +- 4 files changed, 148 insertions(+), 26 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..4e0042f 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
- /* Get settings */
- load_event_config_data();
/* Do the selected operation. */ int exitcode = 0; switch (op)
@@ -409,15 +412,37 @@ int main(int argc, char** argv) } case OPT_INFO: {
if (run_analyze_event(dump_dir_name) != 0)
return 1;
/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
dd_close(dd);
if (analyze_events_as_lines&& *analyze_events_as_lines)
{
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
}
/* Load crash_data from (possibly updated by analyze) dump dir */
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return -1;
crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd);
add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..ef101b8 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0&& run_state->children_count == 0) {
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'",
event.c_str()); r = -1; } if (r == 0)
@@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name)
+int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log;
- int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB");
- int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{
- if (!list_options)
return NULL;
- unsigned count = g_list_length(list_options) - 1;
- if (!count)
return NULL;
- int pos = -1;
- fprintf(stdout, "Select how you would like to analyze the problem:\n");
- all (non-debugging) strings ^^^^^^^^^^^^^^^^^^^^ need to be translatable
- for (GList *li = list_options; li; li = li->next)
- {
char *opt = (char*)li->data;
event_config_t *config = get_event_config(opt);
if (config)
{
++pos;
printf(" %i) %s\n", pos, config->screen_name);
}
- }
- unsigned picked;
- unsigned ii;
- for (ii = 0; ii< 3; ++ii)
- {
fprintf(stdout, "Choose option [0 - %u]: ", count);
- make this translatable: ^^^^^^^^^^^^^^^^
fflush(NULL);
char answer[16];
if (!fgets(answer, sizeof(answer), stdin))
continue;
answer[strlen(answer) - 1] = '\0';
if (!*answer)
continue;
picked = xatou(answer);
if (picked> count)
{
log(_("You have chosen number out of range"));
- do you really want to log() this? isn't printf() enough?
continue;
}
break;
- }
- if (ii == 3)
error_msg_and_die(_("Invalid input, porgram exiting..."));
- typo: "porgram"
- GList *choosen = g_list_nth(list_options, picked);
- how about: gpointer* data = g_list_nth_data() if (data != NULL) return xstrdup((char*)data);
- but maybe I'm just too paranoid with the "if" ?
- return xstrdup((char*)choosen->data);
+}
+GList *str_to_glist(char *str, int delim) +{
- GList *list = NULL;
- while (*str)
- {
char *end = strchrnul(str, delim);
char *tmp = xstrndup(str, end - str);
if (*tmp)
list = g_list_append(list, tmp);
str = end;
if (!*str)
break;
str++;
- }
- if (!list&& !g_list_length(list))
return NULL;
- return list;
+}
/* Report the crash */ int report(const char *dump_dir_name, int flags) {
- if (run_analyze_event(dump_dir_name) != 0)
- return 1;
return -1;/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd)
- char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
- dd_close(dd);
- if (analyze_events_as_lines&& *analyze_events_as_lines)
- please add a space before &&
- {
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
- how about just: return analyzer_result; (ommiting the if())
- }
The rest seems ok.
Jirka
Jiri Moskovcak jmoskovc@redhat.com writes:
On 03/29/2011 10:44 AM, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovskynpajkovs@redhat.com
src/cli/cli.c | 31 ++++++++++- src/cli/report.cpp | 135 ++++++++++++++++++++++++++++++++++++++++------- src/cli/report.h | 4 +- src/plugins/Makefile.am | 4 +- 4 files changed, 148 insertions(+), 26 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..4e0042f 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
- /* Get settings */
- load_event_config_data();
/* Do the selected operation. */ int exitcode = 0; switch (op)
@@ -409,15 +412,37 @@ int main(int argc, char** argv) } case OPT_INFO: {
if (run_analyze_event(dump_dir_name) != 0)
return 1;
/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
dd_close(dd);
if (analyze_events_as_lines&& *analyze_events_as_lines)
{
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
}
/* Load crash_data from (possibly updated by analyze) dump dir */
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return -1;
crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd);
add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..ef101b8 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0&& run_state->children_count == 0) {
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'",
event.c_str()); r = -1; } if (r == 0)
@@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name)
+int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log;
- int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB");
- int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{
- if (!list_options)
return NULL;
- unsigned count = g_list_length(list_options) - 1;
- if (!count)
return NULL;
- int pos = -1;
- fprintf(stdout, "Select how you would like to analyze the problem:\n");
- all (non-debugging) strings ^^^^^^^^^^^^^^^^^^^^ need to be
translatable
yes, translation :-/
- for (GList *li = list_options; li; li = li->next)
- {
char *opt = (char*)li->data;
event_config_t *config = get_event_config(opt);
if (config)
{
++pos;
printf(" %i) %s\n", pos, config->screen_name);
}
- }
- unsigned picked;
- unsigned ii;
- for (ii = 0; ii< 3; ++ii)
- {
fprintf(stdout, "Choose option [0 - %u]: ", count);
- make this translatable: ^^^^^^^^^^^^^^^^
ditto
fflush(NULL);
char answer[16];
if (!fgets(answer, sizeof(answer), stdin))
continue;
answer[strlen(answer) - 1] = '\0';
if (!*answer)
continue;
picked = xatou(answer);
if (picked> count)
{
log(_("You have chosen number out of range"));
- do you really want to log() this? isn't printf() enough?
continue;
}
break;
- }
- if (ii == 3)
error_msg_and_die(_("Invalid input, porgram exiting..."));
- typo: "porgram"
:)
- GList *choosen = g_list_nth(list_options, picked);
how about: gpointer* data = g_list_nth_data() if (data != NULL) return xstrdup((char*)data);
but maybe I'm just too paranoid with the "if" ?
Yes, you are a little paranoid :) Now seriously. At the beginning of the function its checked if list is non-null and not empty and also number which is read from input must be at range 0 - <list_lenght>.
- return xstrdup((char*)choosen->data);
+}
+GList *str_to_glist(char *str, int delim) +{
- GList *list = NULL;
- while (*str)
- {
char *end = strchrnul(str, delim);
char *tmp = xstrndup(str, end - str);
if (*tmp)
list = g_list_append(list, tmp);
str = end;
if (!*str)
break;
str++;
- }
- if (!list&& !g_list_length(list))
return NULL;
- return list;
+}
/* Report the crash */ int report(const char *dump_dir_name, int flags) {
- if (run_analyze_event(dump_dir_name) != 0)
- return 1;
return -1;/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd)
- char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
- dd_close(dd);
- if (analyze_events_as_lines&& *analyze_events_as_lines)
- please add a space before &&
bug in git :) I have it
- {
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
- how about just: return analyzer_result; (ommiting the if())
- }
The rest seems ok.
Jirka
Patch will follow in a sec
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- src/cli/cli.c | 31 ++++++++++- src/cli/report.cpp | 135 ++++++++++++++++++++++++++++++++++++++++------- src/cli/report.h | 4 +- src/plugins/Makefile.am | 4 +- 4 files changed, 148 insertions(+), 26 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..4e0042f 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
+ /* Get settings */ + load_event_config_data(); + /* Do the selected operation. */ int exitcode = 0; switch (op) @@ -409,15 +412,37 @@ int main(int argc, char** argv) } case OPT_INFO: { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1; + + char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze"); + dd_close(dd); + + if (analyze_events_as_lines && *analyze_events_as_lines) + { + GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n'); + free(analyze_events_as_lines); + + char *event = select_event_option(list_analyze_events); + list_free_with_free(list_analyze_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + + /* Load crash_data from (possibly updated by analyze) dump dir */ + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return -1; + crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd); + add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..7181fe3 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0 && run_state->children_count == 0) { - l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str()); + l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", + event.c_str()); r = -1; } if (r == 0) @@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name) + +int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log; - int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB"); + int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{ + if (!list_options) + return NULL; + + unsigned count = g_list_length(list_options) - 1; + if (!count) + return NULL; + + int pos = -1; + fprintf(stdout, _("Select how you would like to analyze the problem:\n")); + for (GList *li = list_options; li; li = li->next) + { + char *opt = (char*)li->data; + event_config_t *config = get_event_config(opt); + if (config) + { + ++pos; + printf(" %i) %s\n", pos, config->screen_name); + } + } + + unsigned picked; + unsigned ii; + for (ii = 0; ii < 3; ++ii) + { + fprintf(stdout, _("Choose option [0 - %u]: "), count); + fflush(NULL); + + char answer[16]; + if (!fgets(answer, sizeof(answer), stdin)) + continue; + + answer[strlen(answer) - 1] = '\0'; + if (!*answer) + continue; + + picked = xatou(answer); + if (picked > count) + { + fprintf(_("You have chosen number out of range")); + continue; + } + + break; + } + + if (ii == 3) + error_msg_and_die(_("Invalid input, program exiting...")); + + GList *choosen = g_list_nth(list_options, picked); + return xstrdup((char*)choosen->data); +} + +GList *str_to_glist(char *str, int delim) +{ + GList *list = NULL; + while (*str) + { + char *end = strchrnul(str, delim); + char *tmp = xstrndup(str, end - str); + if (*tmp) + list = g_list_append(list, tmp); + + str = end; + if (!*str) + break; + str++; + } + + if (!list && !g_list_length(list)) + return NULL; + + return list; +}
/* Report the crash */ int report(const char *dump_dir_name, int flags) { - if (run_analyze_event(dump_dir_name) != 0) - return 1; - /* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
+ char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze"); + dd_close(dd); + + if (analyze_events_as_lines && *analyze_events_as_lines) + { + GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n'); + free(analyze_events_as_lines); + + char *event = select_event_option(list_analyze_events); + list_free_with_free(list_analyze_events); + + int analyzer_result = run_analyze_event(dump_dir_name, event); + free(event); + + if (analyzer_result != 0) + return 1; + } + + /* Load crash_data from (possibly updated by analyze) dump dir */ + dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return -1; + + char *report_events_as_lines = list_possible_events(dd, NULL, "report"); crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); - char *events_as_lines = list_possible_events(dd, NULL, ""); dd_close(dd);
if (!(flags & CLI_REPORT_BATCH)) @@ -620,7 +718,7 @@ int report(const char *dump_dir_name, int flags) if (result != 0) { free_crash_data(crash_data); - free(events_as_lines); + free(report_events_as_lines); return 1; } /* Save comment, backtrace */ @@ -639,26 +737,24 @@ int report(const char *dump_dir_name, int flags) }
/* Get possible reporters associated with this particular crash */ + /* TODO: npajkovs: remove this annoying c++ vector_string_t */ vector_string_t report_events; - if (events_as_lines) + if (report_events_as_lines && *report_events_as_lines) { - char *events = events_as_lines; + char *events = report_events_as_lines; while (*events) { char *end = strchrnul(events, '\n'); - if (strncmp(events, "report", 6) == 0 - && (events[6] == '\0' || events[6] == '_') - ) { - char *tmp = xstrndup(events, end - events); - report_events.push_back(tmp); - free(tmp); - } + char *tmp = xstrndup(events, end - events); + report_events.push_back(tmp); + free(tmp); events = end; if (!*events) break; events++; } } + free(report_events_as_lines);
/* Get settings */ load_event_config_data(); @@ -723,6 +819,5 @@ int report(const char *dump_dir_name, int flags)
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors); free_crash_data(crash_data); - free(events_as_lines); return errors; } diff --git a/src/cli/report.h b/src/cli/report.h index 58b8c25..a393784 100644 --- a/src/cli/report.h +++ b/src/cli/report.h @@ -22,7 +22,9 @@ extern "C" { #endif
-int run_analyze_event(const char *dump_dir_name); +int run_analyze_event(const char *dump_dir_name, const char *analyzer); +char *select_event_option(GList *list_options); +GList *str_to_glist(char *str, int delim);
/* Report the crash */ enum { diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5344cdb..7468188 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR): $(mkdir_p) '$@'
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR) - $(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml - $(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml + $(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml + $(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
abrt_dump_oops_SOURCES = \ abrt-dump-oops.c
I've accidentally pushed the previous patch to git will revert it.
J.
This one can't be even compiled! Please at least try to compile it before you post it for review...
Jirka
On 03/29/2011 05:02 PM, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovskynpajkovs@redhat.com
src/cli/cli.c | 31 ++++++++++- src/cli/report.cpp | 135 ++++++++++++++++++++++++++++++++++++++++------- src/cli/report.h | 4 +- src/plugins/Makefile.am | 4 +- 4 files changed, 148 insertions(+), 26 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..4e0042f 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
- /* Get settings */
- load_event_config_data();
/* Do the selected operation. */ int exitcode = 0; switch (op)
@@ -409,15 +412,37 @@ int main(int argc, char** argv) } case OPT_INFO: {
if (run_analyze_event(dump_dir_name) != 0)
return 1;
/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
dd_close(dd);
if (analyze_events_as_lines&& *analyze_events_as_lines)
{
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
}
/* Load crash_data from (possibly updated by analyze) dump dir */
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return -1;
crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd);
add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..7181fe3 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0&& run_state->children_count == 0) {
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'",
event.c_str()); r = -1; } if (r == 0)
@@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name)
+int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log;
- int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB");
- int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{
- if (!list_options)
return NULL;
- unsigned count = g_list_length(list_options) - 1;
- if (!count)
return NULL;
- int pos = -1;
- fprintf(stdout, _("Select how you would like to analyze the problem:\n"));
- for (GList *li = list_options; li; li = li->next)
- {
char *opt = (char*)li->data;
event_config_t *config = get_event_config(opt);
if (config)
{
++pos;
printf(" %i) %s\n", pos, config->screen_name);
}
- }
- unsigned picked;
- unsigned ii;
- for (ii = 0; ii< 3; ++ii)
- {
fprintf(stdout, _("Choose option [0 - %u]: "), count);
fflush(NULL);
char answer[16];
if (!fgets(answer, sizeof(answer), stdin))
continue;
answer[strlen(answer) - 1] = '\0';
if (!*answer)
continue;
picked = xatou(answer);
if (picked> count)
{
fprintf(_("You have chosen number out of range"));
continue;
}
break;
- }
- if (ii == 3)
error_msg_and_die(_("Invalid input, program exiting..."));
- GList *choosen = g_list_nth(list_options, picked);
- return xstrdup((char*)choosen->data);
+}
+GList *str_to_glist(char *str, int delim) +{
- GList *list = NULL;
- while (*str)
- {
char *end = strchrnul(str, delim);
char *tmp = xstrndup(str, end - str);
if (*tmp)
list = g_list_append(list, tmp);
str = end;
if (!*str)
break;
str++;
- }
- if (!list&& !g_list_length(list))
return NULL;
- return list;
+}
/* Report the crash */ int report(const char *dump_dir_name, int flags) {
- if (run_analyze_event(dump_dir_name) != 0)
- return 1;
return -1;/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd)
- char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
- dd_close(dd);
- if (analyze_events_as_lines&& *analyze_events_as_lines)
- {
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
- }
- /* Load crash_data from (possibly updated by analyze) dump dir */
- dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
- if (!dd)
- return -1;
- char *report_events_as_lines = list_possible_events(dd, NULL, "report"); crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
char *events_as_lines = list_possible_events(dd, NULL, ""); dd_close(dd);
if (!(flags& CLI_REPORT_BATCH))
@@ -620,7 +718,7 @@ int report(const char *dump_dir_name, int flags) if (result != 0) { free_crash_data(crash_data);
free(events_as_lines);
free(report_events_as_lines); return 1; } /* Save comment, backtrace */
@@ -639,26 +737,24 @@ int report(const char *dump_dir_name, int flags) }
/* Get possible reporters associated with this particular crash */
- /* TODO: npajkovs: remove this annoying c++ vector_string_t */ vector_string_t report_events;
- if (events_as_lines)
- if (report_events_as_lines&& *report_events_as_lines) {
char *events = events_as_lines;
char *events = report_events_as_lines; while (*events) { char *end = strchrnul(events, '\n');
if (strncmp(events, "report", 6) == 0
-&& (events[6] == '\0' || events[6] == '_')
) {
char *tmp = xstrndup(events, end - events);
report_events.push_back(tmp);
free(tmp);
}
char *tmp = xstrndup(events, end - events);
report_events.push_back(tmp);
free(tmp); events = end; if (!*events) break; events++; } }
free(report_events_as_lines);
/* Get settings */ load_event_config_data();
@@ -723,6 +819,5 @@ int report(const char *dump_dir_name, int flags)
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors); free_crash_data(crash_data);
- free(events_as_lines); return errors; }
diff --git a/src/cli/report.h b/src/cli/report.h index 58b8c25..a393784 100644 --- a/src/cli/report.h +++ b/src/cli/report.h @@ -22,7 +22,9 @@ extern "C" { #endif
-int run_analyze_event(const char *dump_dir_name); +int run_analyze_event(const char *dump_dir_name, const char *analyzer); +char *select_event_option(GList *list_options); +GList *str_to_glist(char *str, int delim);
/* Report the crash */ enum { diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5344cdb..7468188 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR): $(mkdir_p) '$@'
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR)
- $(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml
- $(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
$(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml
$(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
abrt_dump_oops_SOURCES = \ abrt-dump-oops.c
Jiri Moskovcak jmoskovc@redhat.com writes:
This one can't be even compiled! Please at least try to compile it before you post it for review...
omg, fixed and merged with master
Jirka
On 03/29/2011 05:02 PM, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovskynpajkovs@redhat.com
src/cli/cli.c | 31 ++++++++++- src/cli/report.cpp | 135 ++++++++++++++++++++++++++++++++++++++++------- src/cli/report.h | 4 +- src/plugins/Makefile.am | 4 +- 4 files changed, 148 insertions(+), 26 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c index 0c895a7..4e0042f 100644 --- a/src/cli/cli.c +++ b/src/cli/cli.c @@ -360,6 +360,9 @@ int main(int argc, char** argv) print_usage_and_die(argv[0]); }
- /* Get settings */
- load_event_config_data();
/* Do the selected operation. */ int exitcode = 0; switch (op)
@@ -409,15 +412,37 @@ int main(int argc, char** argv) } case OPT_INFO: {
if (run_analyze_event(dump_dir_name) != 0)
return 1;
/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd) return -1;
char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
dd_close(dd);
if (analyze_events_as_lines&& *analyze_events_as_lines)
{
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
}
/* Load crash_data from (possibly updated by analyze) dump dir */
dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
return -1;
crash_data_t *crash_data = create_crash_data_from_dump_dir(dd); dd_close(dd);
add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp index da37bea..7181fe3 100644 --- a/src/cli/report.cpp +++ b/src/cli/report.cpp @@ -15,9 +15,9 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "report.h" -#include "run-command.h" #include "abrtlib.h" +#include "run-command.h" +#include "report.h"
/* Field separator for the crash report file that is edited by user. */ #define FIELD_SEP "%----" @@ -553,7 +553,8 @@ static int run_events(const char *dump_dir_name, int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str()); if (r == 0&& run_state->children_count == 0) {
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'",
event.c_str()); r = -1; } if (r == 0)
@@ -585,31 +586,128 @@ static char *do_log(char *log_line, void *param) log("%s", log_line); return log_line; } -int run_analyze_event(const char *dump_dir_name)
+int run_analyze_event(const char *dump_dir_name, const char *analyzer) { VERB2 log("run_analyze_event('%s')", dump_dir_name);
struct run_event_state *run_state = new_run_event_state(); run_state->logging_callback = do_log;
- int res = run_event_on_dir_name(run_state, dump_dir_name, "analyze_LocalGDB");
- int res = run_event_on_dir_name(run_state, dump_dir_name, analyzer); free_run_event_state(run_state); return res; }
+/* show even description? */ +char *select_event_option(GList *list_options) +{
- if (!list_options)
return NULL;
- unsigned count = g_list_length(list_options) - 1;
- if (!count)
return NULL;
- int pos = -1;
- fprintf(stdout, _("Select how you would like to analyze the problem:\n"));
- for (GList *li = list_options; li; li = li->next)
- {
char *opt = (char*)li->data;
event_config_t *config = get_event_config(opt);
if (config)
{
++pos;
printf(" %i) %s\n", pos, config->screen_name);
}
- }
- unsigned picked;
- unsigned ii;
- for (ii = 0; ii< 3; ++ii)
- {
fprintf(stdout, _("Choose option [0 - %u]: "), count);
fflush(NULL);
char answer[16];
if (!fgets(answer, sizeof(answer), stdin))
continue;
answer[strlen(answer) - 1] = '\0';
if (!*answer)
continue;
picked = xatou(answer);
if (picked> count)
{
fprintf(_("You have chosen number out of range"));
continue;
}
break;
- }
- if (ii == 3)
error_msg_and_die(_("Invalid input, program exiting..."));
- GList *choosen = g_list_nth(list_options, picked);
- return xstrdup((char*)choosen->data);
+}
+GList *str_to_glist(char *str, int delim) +{
- GList *list = NULL;
- while (*str)
- {
char *end = strchrnul(str, delim);
char *tmp = xstrndup(str, end - str);
if (*tmp)
list = g_list_append(list, tmp);
str = end;
if (!*str)
break;
str++;
- }
- if (!list&& !g_list_length(list))
return NULL;
- return list;
+}
/* Report the crash */ int report(const char *dump_dir_name, int flags) {
- if (run_analyze_event(dump_dir_name) != 0)
- return 1;
return -1;/* Load crash_data from (possibly updated by analyze) dump dir */ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); if (!dd)
- char *analyze_events_as_lines = list_possible_events(dd, NULL, "analyze");
- dd_close(dd);
- if (analyze_events_as_lines&& *analyze_events_as_lines)
- {
GList *list_analyze_events = str_to_glist(analyze_events_as_lines, '\n');
free(analyze_events_as_lines);
char *event = select_event_option(list_analyze_events);
list_free_with_free(list_analyze_events);
int analyzer_result = run_analyze_event(dump_dir_name, event);
free(event);
if (analyzer_result != 0)
return 1;
- }
- /* Load crash_data from (possibly updated by analyze) dump dir */
- dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
- if (!dd)
- return -1;
- char *report_events_as_lines = list_possible_events(dd, NULL, "report"); crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
char *events_as_lines = list_possible_events(dd, NULL, ""); dd_close(dd);
if (!(flags& CLI_REPORT_BATCH))
@@ -620,7 +718,7 @@ int report(const char *dump_dir_name, int flags) if (result != 0) { free_crash_data(crash_data);
free(events_as_lines);
free(report_events_as_lines); return 1; } /* Save comment, backtrace */
@@ -639,26 +737,24 @@ int report(const char *dump_dir_name, int flags) }
/* Get possible reporters associated with this particular crash */
- /* TODO: npajkovs: remove this annoying c++ vector_string_t */ vector_string_t report_events;
- if (events_as_lines)
- if (report_events_as_lines&& *report_events_as_lines) {
char *events = events_as_lines;
char *events = report_events_as_lines; while (*events) { char *end = strchrnul(events, '\n');
if (strncmp(events, "report", 6) == 0
-&& (events[6] == '\0' || events[6] == '_')
) {
char *tmp = xstrndup(events, end - events);
report_events.push_back(tmp);
free(tmp);
}
char *tmp = xstrndup(events, end - events);
report_events.push_back(tmp);
free(tmp); events = end; if (!*events) break; events++; } }
free(report_events_as_lines);
/* Get settings */ load_event_config_data();
@@ -723,6 +819,5 @@ int report(const char *dump_dir_name, int flags)
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors); free_crash_data(crash_data);
- free(events_as_lines); return errors; }
diff --git a/src/cli/report.h b/src/cli/report.h index 58b8c25..a393784 100644 --- a/src/cli/report.h +++ b/src/cli/report.h @@ -22,7 +22,9 @@ extern "C" { #endif
-int run_analyze_event(const char *dump_dir_name); +int run_analyze_event(const char *dump_dir_name, const char *analyzer); +char *select_event_option(GList *list_options); +GList *str_to_glist(char *str, int delim);
/* Report the crash */ enum { diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5344cdb..7468188 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -65,8 +65,8 @@ $(DESTDIR)/$(DEBUG_INFO_DIR): $(mkdir_p) '$@'
install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR)
- $(LN_S) analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml
- $(LN_S) analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
$(LN_S) -f analyze_RetraceServer.xml $(DESTDIR)$(eventsdir)/reanalyze_RetraceServer.xml
$(LN_S) -f analyze_LocalGDB.xml $(DESTDIR)$(eventsdir)/reanalyze_LocalGDB.xml
abrt_dump_oops_SOURCES = \ abrt-dump-oops.c
crash-catcher@lists.fedorahosted.org