busybox/coreutils/cat.c
<<
>>
Prefs
   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
  10/* BB_AUDIT SUSv3 compliant */
  11/* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */
  12
  13//kbuild:lib-$(CONFIG_CAT)     += cat.o
  14//kbuild:lib-$(CONFIG_MORE)    += cat.o # more uses it if stdout isn't a tty
  15//kbuild:lib-$(CONFIG_LESS)    += cat.o # less too
  16//kbuild:lib-$(CONFIG_CRONTAB) += cat.o # crontab -l
  17
  18//config:config CAT
  19//config:       bool "cat"
  20//config:       default y
  21//config:       help
  22//config:         cat is used to concatenate files and print them to the standard
  23//config:         output. Enable this option if you wish to enable the 'cat' utility.
  24
  25#include "libbb.h"
  26
  27/* This is a NOFORK applet. Be very careful! */
  28
  29
  30int bb_cat(char **argv)
  31{
  32        int fd;
  33        int retval = EXIT_SUCCESS;
  34
  35        if (!*argv)
  36                argv = (char**) &bb_argv_dash;
  37
  38        do {
  39                fd = open_or_warn_stdin(*argv);
  40                if (fd >= 0) {
  41                        /* This is not a xfunc - never exits */
  42                        off_t r = bb_copyfd_eof(fd, STDOUT_FILENO);
  43                        if (fd != STDIN_FILENO)
  44                                close(fd);
  45                        if (r >= 0)
  46                                continue;
  47                }
  48                retval = EXIT_FAILURE;
  49        } while (*++argv);
  50
  51        return retval;
  52}
  53
  54int cat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  55int cat_main(int argc UNUSED_PARAM, char **argv)
  56{
  57        getopt32(argv, "u");
  58        argv += optind;
  59        return bb_cat(argv);
  60}
  61