It will be useful if we can print out the last n lines instead of the last 10, just like tail. There are examples: tailf -n 5 file1 tailf --lines 10 file2 tailf -20 file3 Signed-off-by: Li Zefan <lizf@xxxxxxxxxxxxxx> --- tailf.1 | 14 +++++++++----- tailf.c | 48 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/text-utils/tailf.1 b/text-utils/tailf.1 index ccce662..8bc53fc 100644 --- a/text-utils/tailf.1 +++ b/text-utils/tailf.1 @@ -26,7 +26,8 @@ .SH NAME tailf \- follow the growth of a log file .SH SYNOPSIS -.BI tailf " file" +.B tailf +[\fIOPTION\fR] \fIfile\fR .SH DESCRIPTION .B tailf will print out the last 10 lines of a file and then wait for the file to @@ -40,10 +41,13 @@ does not occur periodically when no log activity is happening. is extremely useful for monitoring log files on a laptop when logging is infrequent and the user desires that the hard disk spin down to conserve battery life. -.SH BUGS -An option could be provided to print out the last -.I n -lines instead of the last 10. +.PP +Mandatory arguments to long options are mandatory for short options too. +.TP +\fB\-n\fR, \fB\-\-lines\fR=\fIN\fR, \fB\-N\fR +output the last +.I N +lines, instead of the last 10. .SH AUTHOR This program was written by Rik Faith (faith@xxxxxxx) and may be freely distributed under the terms of the X11/MIT License. There is ABSOLUTELY diff --git a/text-utils/tailf.c b/text-utils/tailf.c index e10243f..3fbe849 100644 --- a/text-utils/tailf.c +++ b/text-utils/tailf.c @@ -31,8 +31,11 @@ #include <unistd.h> #include <malloc.h> #include <sys/stat.h> +#include "errs.h" #include "nls.h" +#define DEFAULT_LINES 10 + static size_t filesize(const char *filename) { struct stat sb; @@ -50,9 +53,7 @@ static void tailf(const char *filename, int lines) int i; if (!(str = fopen(filename, "r"))) { - fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename); - perror(""); - exit(1); + err(EXIT_FAILURE, "Cannot open %s for read", filename); } buffer = malloc(lines * sizeof(*buffer)); @@ -84,28 +85,45 @@ int main(int argc, char **argv) FILE *str; const char *filename; int count; + int lines = DEFAULT_LINES; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - if (argc != 2) { - fprintf(stderr, _("Usage: tailf logfile\n")); - exit(1); - } + argc--; + argv++; - filename = argv[1]; + for (; argc > 0 && argv[0][0] == '-'; argc--, argv++) { + if (!strcmp(*argv, "-n") || !strcmp(*argv, "--lines")) { + argc--; + argv++; + if (argc > 0 && (lines = atoi(argv[0])) <= 0) + errx(EXIT_FAILURE, _("Invalid number of lines")); + } + else if (isdigit(argv[0][1])) { + if ((lines = atoi(*argv + 1)) <= 0) + errx(EXIT_FAILURE, _("Invalid number of lines")); + } + else + errx(EXIT_FAILURE, _("Invalid option")); + } + + if (argc != 1) { + fprintf(stderr, _("Usage: tailf [-n N | -N] logfile\n")); + exit(EXIT_FAILURE); + } - tailf(filename, 10); + filename = argv[0]; + + tailf(filename, lines); for (osize = filesize(filename);;) { nsize = filesize(filename); if (nsize != osize) { - if (!(str = fopen(filename, "r"))) { - fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename); - perror(argv[0]); - exit(1); - } + if (!(str = fopen(filename, "r"))) + err(EXIT_FAILURE, "Cannot open %s for read", filename); + if (!fseek(str, osize, SEEK_SET)) while ((count = fread(buffer, 1, sizeof(buffer), str)) > 0) fwrite(buffer, 1, count, stdout); @@ -115,5 +133,5 @@ int main(int argc, char **argv) } usleep(250000); /* 250mS */ } - return 0; + return EXIT_SUCCESS; } --- - To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html