summaryrefslogtreecommitdiffstats
path: root/text-utils
diff options
context:
space:
mode:
authorSami Kerola2017-04-02 17:50:42 +0200
committerSami Kerola2017-04-02 17:51:00 +0200
commit70ca1a77721b41f2355eeb00d4e55e13dba3e313 (patch)
tree9f262b680e64e7af888f9bbebb7974a87352d10d /text-utils
parenttests: add --mountpoint to findmnt calls (diff)
downloadkernel-qcow2-util-linux-70ca1a77721b41f2355eeb00d4e55e13dba3e313.tar.gz
kernel-qcow2-util-linux-70ca1a77721b41f2355eeb00d4e55e13dba3e313.tar.xz
kernel-qcow2-util-linux-70ca1a77721b41f2355eeb00d4e55e13dba3e313.zip
tailf: remove deprecated utility
March 2017 is gone, it is time to remove this utility as scheduled in earlier commit, and promised in manual page. Reference: 3f8478a71ccde6883d4c81b7e65561a106653b28 Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'text-utils')
-rw-r--r--text-utils/Makemodule.am7
-rw-r--r--text-utils/tailf.173
-rw-r--r--text-utils/tailf.c295
3 files changed, 0 insertions, 375 deletions
diff --git a/text-utils/Makemodule.am b/text-utils/Makemodule.am
index e42704dfe..f260dd2b7 100644
--- a/text-utils/Makemodule.am
+++ b/text-utils/Makemodule.am
@@ -43,13 +43,6 @@ dist_man_MANS += text-utils/rev.1
rev_SOURCES = text-utils/rev.c
endif
-if BUILD_TAILF
-usrbin_exec_PROGRAMS += tailf
-dist_man_MANS += text-utils/tailf.1
-tailf_SOURCES = text-utils/tailf.c
-tailf_LDADD = $(LDADD) libcommon.la
-endif
-
if BUILD_LINE
usrbin_exec_PROGRAMS += line
line_SOURCES = text-utils/line.c
diff --git a/text-utils/tailf.1 b/text-utils/tailf.1
deleted file mode 100644
index f4a389c9e..000000000
--- a/text-utils/tailf.1
+++ /dev/null
@@ -1,73 +0,0 @@
-.\" tailf.1 -- man page for tailf
-.\" Copyright 1996, 2003 Rickard E. Faith (faith@acm.org)
-.\"
-.\" Permission is granted to make and distribute verbatim copies of this
-.\" manual provided the copyright notice and this permission notice are
-.\" preserved on all copies.
-.\"
-.\" Permission is granted to copy and distribute modified versions of this
-.\" manual under the conditions for verbatim copying, provided that the
-.\" entire resulting derived work is distributed under the terms of a
-.\" permission notice identical to this one.
-.\"
-.\" Since the Linux kernel and libraries are constantly changing, this
-.\" manual page may be incorrect or out-of-date. The author(s) assume no
-.\" responsibility for errors or omissions, or for damages resulting from
-.\" the use of the information contained herein. The author(s) may not
-.\" have taken the same level of care in the production of this manual,
-.\" which is licensed free of charge, as they might when working
-.\" professionally.
-.\"
-.\" Formatted or processed versions of this manual, if unaccompanied by
-.\" the source, must acknowledge the copyright and authors of this work.
-.\"
-.TH TAILF 1 "March 2015" "util-linux" "User Commands"
-.SH NAME
-tailf \- follow the growth of a log file
-.SH SYNOPSIS
-.B tailf
-[option]
-.I file
-.SH DESCRIPTION
-.B tailf is deprecated.
-It may have unfixed bugs and will be removed from util-linux in March 2017.
-Nowadays it's safe to use
-.B tail -f
-(from coreutils), in contrast to what the original documentation below says.
-.PP
-.B tailf
-will print out the last 10 lines of the given \fIfile\fR and then wait
-for this \fIfile\fR to grow. It is similar to
-.B tail -f
-but does not access the file when it is not growing. This has the side
-effect of not updating the access time for the file, so a filesystem flush
-does not occur periodically when no log activity is happening.
-.PP
-.B tailf
-is extremely useful for monitoring log files on a laptop when logging is
-infrequent and the user wishes the hard disk to spin down to conserve
-battery life.
-.TP
-.BR \-n , " -\-lines=\fInumber\fR" , " \-\fInumber\fR"
-Output the last
-.I number
-lines, instead of the last 10.
-.TP
-\fB\-V\fR, \fB\-\-version
-Display version information and exit.
-.TP
-\fB\-h\fR, \fB\-\-help
-Display help text and exit.
-
-.SH AUTHOR
-This program was originally written by Rik Faith (faith@acm.org) and may be freely
-distributed under the terms of the X11/MIT License. There is ABSOLUTELY
-NO WARRANTY for this program.
-
-The latest inotify-based implementation was written by Karel Zak (kzak@redhat.com).
-.SH "SEE ALSO"
-.BR less (1),
-.BR tail (1)
-.SH AVAILABILITY
-The tailf command is part of the util-linux package and is available from
-https://www.kernel.org/pub/linux/utils/util-linux/.
diff --git a/text-utils/tailf.c b/text-utils/tailf.c
deleted file mode 100644
index 78ead34f7..000000000
--- a/text-utils/tailf.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* tailf.c -- tail a log file and then follow it
- * Created: Tue Jan 9 15:49:21 1996 by faith@acm.org
- * Copyright 1996, 2003 Rickard E. Faith (faith@acm.org)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * This command is deprecated. The utility is in maintenance mode,
- * meaning we keep them in source tree for backward compatibility
- * only. Do not waste time making this command better, unless the
- * fix is about security or other very critical issue.
- *
- * See Documentation/deprecated.txt for more information.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <errno.h>
-#include <getopt.h>
-#include <sys/mman.h>
-#include <limits.h>
-
-#ifdef HAVE_INOTIFY_INIT
-#include <sys/inotify.h>
-#endif
-
-#include "nls.h"
-#include "xalloc.h"
-#include "strutils.h"
-#include "c.h"
-#include "closestream.h"
-
-#define DEFAULT_LINES 10
-
-/* st->st_size has to be greater than zero and smaller or equal to SIZE_MAX! */
-static void tailf(const char *filename, size_t lines, struct stat *st)
-{
- int fd;
- size_t i;
- char *data;
-
- fd = open(filename, O_RDONLY);
- if (fd < 0)
- err(EXIT_FAILURE, _("cannot open %s"), filename);
- data = mmap(NULL, st->st_size, PROT_READ, MAP_SHARED, fd, 0);
- i = (size_t) st->st_size - 1;
-
- /* humans do not think last new line in a file should be counted,
- * in that case do off by one from counter point of view */
- if (data[i] == '\n')
- lines++;
- while (i) {
- if (data[i] == '\n' && --lines == 0) {
- i++;
- break;
- }
- i--;
- }
-
- fwrite(data + i, st->st_size - i, 1, stdout);
-
- munmap(data, st->st_size);
- close(fd);
- fflush(stdout);
-}
-
-static void roll_file(const char *filename, struct stat *old)
-{
- char buf[BUFSIZ];
- int fd;
- struct stat st;
- off_t pos;
-
- fd = open(filename, O_RDONLY);
- if (fd < 0)
- err(EXIT_FAILURE, _("cannot open %s"), filename);
-
- if (fstat(fd, &st) == -1)
- err(EXIT_FAILURE, _("stat of %s failed"), filename);
-
- if (st.st_size == old->st_size) {
- close(fd);
- return;
- }
-
- if (lseek(fd, old->st_size, SEEK_SET) != (off_t)-1) {
- ssize_t rc, wc;
-
- while ((rc = read(fd, buf, sizeof(buf))) > 0) {
- wc = write(STDOUT_FILENO, buf, rc);
- if (rc != wc)
- warnx(_("incomplete write to \"%s\" (written %zd, expected %zd)\n"),
- filename, wc, rc);
- }
- fflush(stdout);
- }
-
- pos = lseek(fd, 0, SEEK_CUR);
-
- /* If we've successfully read something, use the file position, this
- * avoids data duplication. If we read nothing or hit an error, reset
- * to the reported size, this handles truncated files.
- */
- old->st_size = (pos != -1 && pos != old->st_size) ? pos : st.st_size;
-
- close(fd);
-}
-
-static void watch_file(const char *filename, struct stat *old)
-{
- do {
- roll_file(filename, old);
- xusleep(250000);
- } while(1);
-}
-
-
-#ifdef HAVE_INOTIFY_INIT
-
-#define EVENTS (IN_MODIFY|IN_DELETE_SELF|IN_MOVE_SELF|IN_UNMOUNT)
-#define NEVENTS 4
-
-static int watch_file_inotify(const char *filename, struct stat *old)
-{
- char buf[ NEVENTS * sizeof(struct inotify_event) ];
- int fd, ffd, e;
- ssize_t len;
-
- fd = inotify_init();
- if (fd == -1)
- return 0;
-
- ffd = inotify_add_watch(fd, filename, EVENTS);
- if (ffd == -1) {
- if (errno == ENOSPC)
- errx(EXIT_FAILURE, _("%s: cannot add inotify watch "
- "(limit of inotify watches was reached)."),
- filename);
-
- err(EXIT_FAILURE, _("%s: cannot add inotify watch."), filename);
- }
-
- while (ffd >= 0) {
- len = read(fd, buf, sizeof(buf));
- if (len < 0 && (errno == EINTR || errno == EAGAIN))
- continue;
- if (len < 0)
- err(EXIT_FAILURE,
- _("%s: cannot read inotify events"), filename);
-
- for (e = 0; e < len; ) {
- struct inotify_event *ev = (struct inotify_event *) &buf[e];
-
- if (ev->mask & IN_MODIFY)
- roll_file(filename, old);
- else {
- close(ffd);
- ffd = -1;
- break;
- }
- e += sizeof(struct inotify_event) + ev->len;
- }
- }
- close(fd);
- return 1;
-}
-
-#endif /* HAVE_INOTIFY_INIT */
-
-static void __attribute__ ((__noreturn__)) usage(FILE *out)
-{
- fputs(USAGE_HEADER, out);
- fprintf(out, _(" %s [option] <file>\n"), program_invocation_short_name);
-
- fputs(USAGE_SEPARATOR, out);
- fputs(_("Follow the growth of a log file.\n"), out);
-
- fputs(USAGE_OPTIONS, out);
- fputs(_(" -n, --lines <number> output the last <number> lines\n"), out);
- fputs(_(" -<number> same as '-n <number>'\n"), out);
-
- fputs(USAGE_SEPARATOR, out);
- fputs(USAGE_HELP, out);
- fputs(USAGE_VERSION, out);
- fprintf(out, USAGE_MAN_TAIL("tailf(1)"));
- fputs(_("Warning: use of 'tailf' is deprecated, use 'tail -f' instead.\n"), out);
-
- exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
-}
-
-/* parses -N option */
-static long old_style_option(int *argc, char **argv, size_t *lines)
-{
- int i = 1, nargs = *argc, ret = 0;
-
- while(i < nargs) {
- if (argv[i][0] == '-' && isdigit(argv[i][1])) {
- *lines = strtoul_or_err(argv[i] + 1,
- _("failed to parse number of lines"));
- nargs--;
- ret = 1;
- if (nargs - i)
- memmove(argv + i, argv + i + 1,
- sizeof(char *) * (nargs - i));
- } else
- i++;
- }
- *argc = nargs;
- return ret;
-}
-
-int main(int argc, char **argv)
-{
- const char *filename;
- size_t lines;
- int ch;
- struct stat st;
-
- static const struct option longopts[] = {
- { "lines", required_argument, NULL, 'n' },
- { "version", no_argument, NULL, 'V' },
- { "help", no_argument, NULL, 'h' },
- { NULL, 0, NULL, 0 }
- };
-
- setlocale(LC_ALL, "");
- bindtextdomain(PACKAGE, LOCALEDIR);
- textdomain(PACKAGE);
- atexit(close_stdout);
-
- if (!old_style_option(&argc, argv, &lines))
- lines = DEFAULT_LINES;
-
- while ((ch = getopt_long(argc, argv, "n:N:Vh", longopts, NULL)) != -1)
- switch ((char)ch) {
- case 'n':
- case 'N':
- lines = strtoul_or_err(optarg,
- _("failed to parse number of lines"));
- break;
- case 'V':
- printf(UTIL_LINUX_VERSION);
- exit(EXIT_SUCCESS);
- case 'h':
- usage(stdout);
- default:
- errtryhelp(EXIT_FAILURE);
- }
-
- if (argc == optind)
- errx(EXIT_FAILURE, _("no input file specified"));
-
- filename = argv[optind];
-
- if (stat(filename, &st) != 0)
- err(EXIT_FAILURE, _("stat of %s failed"), filename);
- if (!S_ISREG(st.st_mode))
- errx(EXIT_FAILURE, _("%s: is not a file"), filename);
-
- /* mmap is based on size_t */
- if (st.st_size > 0 && (uintmax_t) st.st_size <= (uintmax_t) SIZE_MAX)
- tailf(filename, lines, &st);
-
-#ifdef HAVE_INOTIFY_INIT
- if (!watch_file_inotify(filename, &st))
-#endif
- watch_file(filename, &st);
-
- return EXIT_SUCCESS;
-}
-