summaryrefslogtreecommitdiff
path: root/coreutils/cat.c (plain)
blob: 65978887e149bc939c2184b61efb7e67480cffb0
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
20/* BB_AUDIT SUSv3 compliant */
21/* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */
22
23//usage:#define cat_trivial_usage
24//usage: "[FILE]..."
25//usage:#define cat_full_usage "\n\n"
26//usage: "Concatenate FILEs and print them to stdout"
27//usage:
28//usage:#define cat_example_usage
29//usage: "$ cat /proc/uptime\n"
30//usage: "110716.72 17.67"
31
32#include "libbb.h"
33
34/* This is a NOFORK applet. Be very careful! */
35
36
37int bb_cat(char **argv)
38{
39 int fd;
40 int retval = EXIT_SUCCESS;
41
42 if (!*argv)
43 argv = (char**) &bb_argv_dash;
44
45 do {
46 fd = open_or_warn_stdin(*argv);
47 if (fd >= 0) {
48 /* This is not a xfunc - never exits */
49 off_t r = bb_copyfd_eof(fd, STDOUT_FILENO);
50 if (fd != STDIN_FILENO)
51 close(fd);
52 if (r >= 0)
53 continue;
54 }
55 retval = EXIT_FAILURE;
56 } while (*++argv);
57
58 return retval;
59}
60
61int cat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
62int cat_main(int argc UNUSED_PARAM, char **argv)
63{
64 getopt32(argv, "u");
65 argv += optind;
66 return bb_cat(argv);
67}
68