|
Packit |
8ea169 |
/*
|
|
Packit |
8ea169 |
Copyright (C) 2013 Red Hat, Inc.
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
8ea169 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
8ea169 |
the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
8ea169 |
(at your option) any later version.
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
8ea169 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8ea169 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8ea169 |
GNU General Public License for more details.
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
You should have received a copy of the GNU General Public License along
|
|
Packit |
8ea169 |
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
Packit |
8ea169 |
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
8ea169 |
*/
|
|
Packit |
8ea169 |
#include "libabrt.h"
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
struct oops_text {
|
|
Packit |
8ea169 |
unsigned panic_no;
|
|
Packit |
8ea169 |
unsigned part_no;
|
|
Packit |
8ea169 |
const char *filename;
|
|
Packit |
8ea169 |
char *text;
|
|
Packit |
8ea169 |
};
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
static
|
|
Packit |
8ea169 |
struct oops_text *parse_file(const char *filename)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
FILE *fp = fopen(filename, "r");
|
|
Packit |
8ea169 |
if (!fp)
|
|
Packit |
8ea169 |
return NULL;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
char buffer[16 * 1024];
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
struct oops_text *ot = NULL;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (!fgets(buffer, sizeof(buffer), fp))
|
|
Packit |
8ea169 |
goto ret;
|
|
Packit |
8ea169 |
unsigned n1, n2;
|
|
Packit |
8ea169 |
int n = sscanf(buffer, "Panic#%u Part%u\n", &n1, &n2;;
|
|
Packit |
8ea169 |
if (n != 2)
|
|
Packit |
8ea169 |
goto ret;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
ot = xzalloc(sizeof(*ot));
|
|
Packit |
8ea169 |
ot->filename = filename;
|
|
Packit |
8ea169 |
ot->panic_no = n1;
|
|
Packit |
8ea169 |
ot->part_no = n2;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
size_t sz = fread(buffer, 1, sizeof(buffer), fp);
|
|
Packit |
8ea169 |
ot->text = strndup(buffer, sz);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
ret:
|
|
Packit |
8ea169 |
fclose(fp);
|
|
Packit |
8ea169 |
return ot;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
static
|
|
Packit |
8ea169 |
int compare_oops_texts(const void *a, const void *b)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
struct oops_text *aa = *(struct oops_text **)a;
|
|
Packit |
8ea169 |
struct oops_text *bb = *(struct oops_text **)b;
|
|
Packit |
8ea169 |
if (aa->panic_no < bb->panic_no)
|
|
Packit |
8ea169 |
return -1;
|
|
Packit |
8ea169 |
if (aa->panic_no > bb->panic_no)
|
|
Packit |
8ea169 |
return 1;
|
|
Packit |
8ea169 |
if (aa->part_no > bb->part_no)
|
|
Packit |
8ea169 |
return -1;
|
|
Packit |
8ea169 |
return (aa->part_no < bb->part_no);
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
int main(int argc, char **argv)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
/* I18n */
|
|
Packit |
8ea169 |
setlocale(LC_ALL, "");
|
|
Packit |
8ea169 |
#if ENABLE_NLS
|
|
Packit |
8ea169 |
bindtextdomain(PACKAGE, LOCALEDIR);
|
|
Packit |
8ea169 |
textdomain(PACKAGE);
|
|
Packit |
8ea169 |
#endif
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
abrt_init(argv);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
/* Can't keep these strings/structs static: _() doesn't support that */
|
|
Packit |
8ea169 |
const char *program_usage_string = _(
|
|
Packit |
8ea169 |
"& [-v] [-od] FILE...\n"
|
|
Packit |
8ea169 |
"\n"
|
|
Packit |
8ea169 |
"Scans files for split oops message. Can print and/or delete them."
|
|
Packit |
8ea169 |
);
|
|
Packit |
8ea169 |
enum {
|
|
Packit |
8ea169 |
OPT_v = 1 << 0,
|
|
Packit |
8ea169 |
OPT_o = 1 << 1,
|
|
Packit |
8ea169 |
OPT_d = 1 << 2,
|
|
Packit |
8ea169 |
};
|
|
Packit |
8ea169 |
/* Keep enum above and order of options below in sync! */
|
|
Packit |
8ea169 |
struct options program_options[] = {
|
|
Packit |
8ea169 |
OPT__VERBOSE(&g_verbose),
|
|
Packit |
8ea169 |
OPT_BOOL('o', NULL, NULL, _("Print found oopses")),
|
|
Packit |
8ea169 |
OPT_BOOL('d', NULL, NULL, _("Delete files with found oopses")),
|
|
Packit |
8ea169 |
OPT_END()
|
|
Packit |
8ea169 |
};
|
|
Packit |
8ea169 |
unsigned opts = parse_opts(argc, argv, program_options, program_usage_string);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
export_abrt_envvars(0);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
struct oops_text **v = xzalloc(sizeof(v[0]));
|
|
Packit |
8ea169 |
int i = 0;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
while (*argv)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
v[i] = parse_file(*argv);
|
|
Packit |
8ea169 |
if (v[i])
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
v = xrealloc(v, (++i + 1) * sizeof(v[0]));
|
|
Packit |
8ea169 |
v[i] = NULL;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
argv++;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (i == 0) /* nothing was found */
|
|
Packit |
8ea169 |
return 0;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
qsort(v, i, sizeof(v[0]), compare_oops_texts);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (opts & OPT_o)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
struct oops_text **vv = v;
|
|
Packit |
8ea169 |
while (*vv)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
struct oops_text *cur_oops = *vv;
|
|
Packit |
8ea169 |
fputs(cur_oops->text, stdout);
|
|
Packit |
8ea169 |
vv++;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (opts & OPT_d)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
struct oops_text **vv = v;
|
|
Packit |
8ea169 |
while (*vv)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
struct oops_text *cur_oops = *vv;
|
|
Packit |
8ea169 |
if (unlink(cur_oops->filename) != 0)
|
|
Packit |
8ea169 |
perror_msg("Can't unlink '%s'", cur_oops->filename);
|
|
Packit |
8ea169 |
vv++;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
return 0;
|
|
Packit |
8ea169 |
}
|