diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2006-10-25 00:10:58 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@xenon.tklauser.home> | 2006-10-25 00:10:58 +0200 |
commit | f09e7bf71c2b64df952650623fcd0b870c596ca4 (patch) | |
tree | f54b3b1d3d98cf713451bd92f4803268b7f232f4 | |
parent | 335ae486e4470591f629a30282e2605ec06d8a22 (diff) |
Various change to allow tailing bytes relative to the begin
"Simplyfy" and inline bytes_to_offset, extend it to support tailing
relative to begin of file.
Boolean relative makes no sense, make it a char containing 0 for relative
to end and 1 for relative to begin.
-rw-r--r-- | inotail.c | 17 | ||||
-rw-r--r-- | inotail.h | 3 |
2 files changed, 10 insertions, 10 deletions
@@ -49,7 +49,7 @@ static char verbose = 0; /* Tailing relative to begin or end of file */ -static char relative = R_END; +static char from_begin = 0; /* Command line options */ static const struct option long_opts[] = { @@ -103,7 +103,7 @@ static off_t lines_to_offset(struct file_struct *f, unsigned int n_lines) memset(&buf, 0, sizeof(buf)); - if (relative == R_END) + if (!from_begin) n_lines += 1; /* We also count the last \n */ while (offset > 0 && n_lines > 0) { @@ -139,11 +139,9 @@ static off_t lines_to_offset(struct file_struct *f, unsigned int n_lines) return offset; } -static off_t bytes_to_offset(struct file_struct *f, unsigned int n_bytes) +static inline off_t bytes_to_offset(struct file_struct *f, unsigned int n_bytes) { - int ret = f->st_size - n_bytes; - - return (ret < 0 ? 0 : ret); + return from_begin ? ((off_t) n_bytes - 1) : (f->st_size - n_bytes); } static int tail_pipe(struct file_struct *f) @@ -343,7 +341,7 @@ int main(int argc, char **argv) if (c == 'c') mode = M_BYTES; if (*optarg == '+') - relative = R_BEGIN; + from_begin = 1; else if (*optarg == '-') optarg++; n_units = strtoul(optarg, NULL, 0); @@ -387,6 +385,11 @@ int main(int argc, char **argv) } files = malloc(n_files * sizeof(struct file_struct)); + if (!files) { + fprintf(stderr, "Error: Not enough memory (%s)\n", strerror(errno)); + exit(EXIT_FAILURE); + } + for (i = 0; i < n_files; i++) { files[i].name = filenames[i]; setup_file(&files[i]); @@ -7,9 +7,6 @@ /* tail modes */ enum { M_LINES, M_BYTES }; -/* tail unit relative to the end ('-' or none) or the beginning ('+' of the file) */ -enum { R_END, R_BEGIN }; - /* Every tailed file is represented as a file_struct */ struct file_struct { char *name; /* Name of file (or '-' for stdin) */ |