Project

General

Profile

Statistics
| Branch: | Revision:

root / prex-0.9.0 / usr / bin / cat / cat.c @ 03e9c04a

History | View | Annotate | Download (3.01 KB)

1 03e9c04a Brad Neuman
/*
2
 * Copyright (c) 1989, 1993
3
 *        The Regents of the University of California.  All rights reserved.
4
 *
5
 * This code is derived from software contributed to Berkeley by
6
 * Kevin Fall.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 * 3. Neither the name of the University nor the names of its contributors
17
 *    may be used to endorse or promote products derived from this software
18
 *    without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
 * SUCH DAMAGE.
31
 */
32
33
/* modified by Kohsuke Ohtani for Prex. */
34
35
#include <sys/stat.h>
36
#include <sys/fcntl.h>
37
38
#include <err.h>
39
#include <unistd.h>
40
#include <errno.h>
41
#include <stdio.h>
42
#include <stdlib.h>
43
#include <string.h>
44
45
#ifdef CMDBOX
46
#define main(argc, argv)        cat_main(argc, argv)
47
#endif
48
49
static void do_cat(int rfd);
50
51
static char *stdbuf;
52
static char *filename;
53
static int rval;
54
55
int
56
main(int argc, char *argv[])
57
{
58
        int ch, fd;
59
60
        while ((ch = getopt(argc, argv, "")) != -1)
61
                switch(ch) {
62
                case '?':
63
                default:
64
                        fprintf(stderr, "usage: cat [-] [file ...]\n");
65
                        exit(1);
66
                        /* NOTREACHED */
67
                }
68
        argv += optind;
69
70
        if ((stdbuf = malloc(BUFSIZ)) == NULL)
71
                err(1, NULL);
72
73
        fd = fileno(stdin);
74
        filename = "stdin";
75
        do {
76
                if (*argv) {
77
                        if (!strcmp(*argv, "-"))
78
                                fd = fileno(stdin);
79
                        else if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
80
                                warn("%s", *argv);
81
                                ++argv;
82
                                rval = 1;
83
                                continue;
84
                        }
85
                        filename = *argv++;
86
                }
87
                do_cat(fd);
88
                if (fd != fileno(stdin))
89
                        (void)close(fd);
90
        } while (*argv);
91
        free(stdbuf);
92
        exit(rval);
93
}
94
95
static void
96
do_cat(int rfd)
97
{
98
        int nr, nw, off, wfd;
99
        struct stat sbuf;
100
101
        wfd = fileno(stdout);
102
        if (fstat(wfd, &sbuf))
103
                err(1, "%s", filename);
104
        while ((nr = read(rfd, stdbuf, BUFSIZ)) > 0)
105
                for (off = 0; nr; nr -= nw, off += nw)
106
                        if ((nw = write(wfd, stdbuf + off, (size_t)nr)) < 0)
107
                                err(1, "stdout");
108
        if (nr < 0) {
109
                warn("%s @%d", filename, errno);
110
                rval = 1;
111
        }
112
}