2018-11-13 05:59:28 +05:30
|
|
|
#include <stdio.h>
|
2018-11-13 06:23:52 +05:30
|
|
|
#include <stdlib.h>
|
2018-11-13 05:59:28 +05:30
|
|
|
#include <string.h>
|
2018-11-13 06:23:52 +05:30
|
|
|
#include <unistd.h>
|
2018-11-13 05:59:28 +05:30
|
|
|
#include "bootlogd.h"
|
|
|
|
|
|
|
|
#ifndef MAX_LINE
|
|
|
|
#define MAX_LINE 256
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void print_usage()
|
|
|
|
{
|
2018-11-13 06:23:52 +05:30
|
|
|
printf("readbootlog reads the system's boot log, stripping away\n");
|
|
|
|
printf("control characters to make the log human readable.\n\n");
|
|
|
|
printf("Usage for readbootlog: readbootlog [-h] [-f logfile]\n");
|
|
|
|
printf("\t\t-h display this help message\n");
|
|
|
|
printf("\t\t-f <logfile> display a specific boot log file\n");
|
|
|
|
printf("\t\t default is to use %s\n", LOGFILE);
|
|
|
|
printf("\n");
|
2018-11-13 05:59:28 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Clean up the unwanted characters from a line of input.
|
|
|
|
Cleaned line is passed back in output_line.
|
|
|
|
Returns TRUE on success or FALSE if we encounter an error.
|
|
|
|
*/
|
|
|
|
int Clean_Line(char *source_line, char *output_line)
|
|
|
|
{
|
|
|
|
int source_index = 0, target_index = 0;
|
|
|
|
int source_max_index;
|
|
|
|
char a_letter;
|
|
|
|
int done;
|
|
|
|
char *garbage;
|
|
|
|
|
|
|
|
if (! source_line) return FALSE;
|
|
|
|
if (! output_line) return FALSE;
|
|
|
|
|
|
|
|
source_max_index = strlen(source_line);
|
|
|
|
while (source_index < source_max_index)
|
|
|
|
{
|
|
|
|
a_letter = source_line[source_index];
|
|
|
|
if (a_letter == '^')
|
|
|
|
{
|
|
|
|
/* skip ahead until we find a valid place to stop */
|
|
|
|
done = FALSE;
|
|
|
|
while (! done)
|
|
|
|
{
|
|
|
|
source_index++;
|
|
|
|
if (source_index >= source_max_index)
|
|
|
|
done = TRUE;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
a_letter = source_line[source_index];
|
|
|
|
if ( (a_letter == '.') || (a_letter == ' ') ||
|
|
|
|
(a_letter == '(') || (a_letter == 'd') ||
|
|
|
|
(a_letter == '\n') )
|
|
|
|
done = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} /* done found character to scrub */
|
|
|
|
else
|
|
|
|
{
|
|
|
|
output_line[target_index] = a_letter;
|
|
|
|
target_index++;
|
|
|
|
source_index++;
|
|
|
|
} /* found valid character */
|
|
|
|
} /* done processing line */
|
|
|
|
|
|
|
|
garbage = strstr(output_line, " .\n");
|
|
|
|
if (garbage)
|
|
|
|
{
|
|
|
|
garbage[0] = '\n';
|
|
|
|
garbage[1] = '\0';
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
FILE *log_file = NULL;
|
|
|
|
char *log_filename = LOGFILE;
|
|
|
|
char line[MAX_LINE];
|
|
|
|
char output[MAX_LINE];
|
|
|
|
char *status;
|
2018-11-13 06:23:52 +05:30
|
|
|
int c;
|
|
|
|
|
|
|
|
/* check provided options */
|
|
|
|
while ( (c = getopt(argc, argv, "hf:") ) != EOF)
|
|
|
|
{
|
|
|
|
switch (c)
|
|
|
|
{
|
|
|
|
case 'h':
|
|
|
|
print_usage();
|
|
|
|
exit(0);
|
|
|
|
case 'f':
|
|
|
|
log_filename = optarg;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
print_usage();
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
} /* done processing arguments */
|
2018-11-13 05:59:28 +05:30
|
|
|
|
|
|
|
log_file = fopen(log_filename, "r");
|
|
|
|
if (log_file)
|
|
|
|
{
|
|
|
|
status = fgets(line, MAX_LINE, log_file);
|
|
|
|
while (status)
|
|
|
|
{
|
|
|
|
memset(output, '\0', MAX_LINE);
|
|
|
|
if ( Clean_Line(line, output) )
|
|
|
|
{
|
|
|
|
printf("%s", output);
|
|
|
|
}
|
|
|
|
status = fgets(line, MAX_LINE, log_file);
|
|
|
|
} /* done reading file lines */
|
|
|
|
fclose(log_file);
|
|
|
|
} /* end of successfully opened log file */
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Unable to open file %s\n", log_filename);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|