18a74b81d2fea7ef9287e90016d88e52c7084254
[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 tarball for details.
8  */
9
10 /* BB_AUDIT SUSv3 compliant */
11 /* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */
12
13 #include "libbb.h"
14
15 /* This is a NOFORK applet. Be very careful! */
16
17
18 int bb_cat(char **argv)
19 {
20         static const char *const argv_dash[] = { "-", NULL };
21
22         int fd;
23         int retval = EXIT_SUCCESS;
24
25         if (!*argv)
26                 argv = (char**) &argv_dash;
27
28         do {
29                 fd = STDIN_FILENO;
30                 if (!LONE_DASH(*argv))
31                         fd = open_or_warn(*argv, O_RDONLY);
32                 if (fd >= 0) {
33                         /* This is not a xfunc - never exits */
34                         off_t r = bb_copyfd_eof(fd, STDOUT_FILENO);
35                         if (fd != STDIN_FILENO)
36                                 close(fd);
37                         if (r >= 0)
38                                 continue;
39                 }
40                 retval = EXIT_FAILURE;
41         } while (*++argv);
42
43         return retval;
44 }
45
46 int cat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
47 int cat_main(int argc, char **argv)
48 {
49         getopt32(argv, "u");
50         argv += optind;
51         return bb_cat(argv);
52 }