Sort more misplaced applets into coreutils or util-linux
[oweals/busybox.git] / coreutils / cat.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * cat implementation for busybox
4  *
5  * Copyright (C) 2003  Manuel Novoa III  <mjn3@codepoet.org>
6  *
7  * Licensed under GPLv2, see file LICENSE in this source tree.
8  */
9 //config:config CAT
10 //config:       bool "cat"
11 //config:       default y
12 //config:       help
13 //config:         cat is used to concatenate files and print them to the standard
14 //config:         output. Enable this option if you wish to enable the 'cat' utility.
15
16 //applet:IF_CAT(APPLET_NOFORK(cat, cat, BB_DIR_BIN, BB_SUID_DROP, cat))
17
18 //kbuild:lib-$(CONFIG_CAT) += cat.o
19 // For -n:
20 //kbuild:lib-$(CONFIG_CAT) += nl.o
21
22 /* BB_AUDIT SUSv3 compliant */
23 /* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */
24
25 //usage:#define cat_trivial_usage
26 //usage:       "[-n] [FILE]..."
27 //usage:#define cat_full_usage "\n\n"
28 //usage:       "Concatenate FILEs and print them to stdout"
29 //usage:     "\n        -n      Number output lines"
30 /*
31   Longopts not implemented yet:
32      --number-nonblank    number nonempty output lines, overrides -n
33      --number             number all output lines
34   Not implemented yet:
35   -A, --show-all           equivalent to -vET
36   -e                       equivalent to -vE
37   -E, --show-ends          display $ at end of each line
38   -s, --squeeze-blank      suppress repeated empty output lines
39   -t                       equivalent to -vT
40   -T, --show-tabs          display TAB characters as ^I
41   -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
42 */
43 //usage:
44 //usage:#define cat_example_usage
45 //usage:       "$ cat /proc/uptime\n"
46 //usage:       "110716.72 17.67"
47
48 #include "libbb.h"
49
50 /* This is a NOFORK applet. Be very careful! */
51
52
53 int bb_cat(char **argv)
54 {
55         int fd;
56         int retval = EXIT_SUCCESS;
57
58         if (!*argv)
59                 argv = (char**) &bb_argv_dash;
60
61         do {
62                 fd = open_or_warn_stdin(*argv);
63                 if (fd >= 0) {
64                         /* This is not a xfunc - never exits */
65                         off_t r = bb_copyfd_eof(fd, STDOUT_FILENO);
66                         if (fd != STDIN_FILENO)
67                                 close(fd);
68                         if (r >= 0)
69                                 continue;
70                 }
71                 retval = EXIT_FAILURE;
72         } while (*++argv);
73
74         return retval;
75 }
76
77 int cat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
78 int cat_main(int argc UNUSED_PARAM, char **argv)
79 {
80         struct number_state ns;
81         unsigned opt;
82
83         /* -u is ignored */
84         opt = getopt32(argv, "nbu");
85         argv += optind;
86         if (!(opt & 3)) /* no -n or -b */
87                 return bb_cat(argv);
88
89         if (!*argv)
90                 *--argv = (char*)"-";
91         ns.width = 6;
92         ns.start = 1;
93         ns.inc = 1;
94         ns.sep = "\t";
95         ns.empty_str = "\n";
96         ns.all = !(opt & 2); /* -n without -b */
97         ns.nonempty = (opt & 2); /* -b (with or without -n) */
98         do {
99                 print_numbered_lines(&ns, *argv);
100         } while (*++argv);
101         fflush_stdout_and_exit(EXIT_SUCCESS);
102 }