sysvinit/src/readbootlog.c
Jesse Smith fa124114ae Reformatted init code to make if/while logic more clear.
Cleaned up some output from readbootlog.

Added -e flg to bootlogd. When -e is used, data saved
to the boot log file does not have escape characters
removed. This means colour and cursor movement codes
stay in the log file. The may then look nicer when
read with "less -R', but may appear cluttered or
out of alignment when viewed with other, plain-text tools.
2019-08-11 22:10:45 -03:00

142 lines
3.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "bootlogd.h"
#ifndef MAX_LINE
#define MAX_LINE 256
#endif
void print_usage()
{
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");
}
/*
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 if ( (a_letter == '?') && (source_line[source_index + 1] == '?') &&
(source_line[source_index + 2] == '7') )
{
source_index += 3;
output_line[target_index] = ' ';
target_index++;
}
else if ( (a_letter == '8') && (source_line[source_index + 1] == '?') &&
(source_line[source_index + 2] == '?') )
{
source_index += 3;
output_line[target_index] = ']';
target_index++;
}
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;
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 */
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;
}