Annotation of prex/usr/bin/cat/cat.c, Revision 1.1.1.1
1.1 nbrk 1: /*
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: #include <sys/stat.h>
34: #include <sys/fcntl.h>
35:
36: #include <err.h>
37: #include <unistd.h>
38: #include <errno.h>
39: #include <stdio.h>
40: #include <stdlib.h>
41: #include <string.h>
42:
43: #ifdef CMDBOX
44: #define main(argc, argv) cat_main(argc, argv)
45: #endif
46:
47: static void raw_cat(int rfd);
48:
49: static char stdbuf[BUFSIZ];
50: static char *filename;
51: static int rval;
52:
53: int
54: main(int argc, char *argv[])
55: {
56: int ch, fd;
57:
58: while ((ch = getopt(argc, argv, "u")) != -1)
59: switch(ch) {
60: case 'u':
61: setbuf(stdout, NULL);
62: break;
63: case '?':
64: default:
65: fprintf(stderr, "usage: cat [-u] [-] [file ...]\n");
66: exit(1);
67: /* NOTREACHED */
68: }
69: argv += optind;
70:
71: fd = fileno(stdin);
72: filename = "stdin";
73: do {
74: if (*argv) {
75: if (!strcmp(*argv, "-"))
76: fd = fileno(stdin);
77: else if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
78: warn("%s", *argv);
79: ++argv;
80: rval = 1;
81: continue;
82: }
83: filename = *argv++;
84: }
85: raw_cat(fd);
86: if (fd != fileno(stdin))
87: (void)close(fd);
88: } while (*argv);
89: exit(rval);
90: }
91:
92: static void
93: raw_cat(int rfd)
94: {
95: int nr, nw, off, wfd;
96: struct stat sbuf;
97:
98: wfd = fileno(stdout);
99: if (fstat(wfd, &sbuf))
100: err(1, "%s", filename);
101: while ((nr = read(rfd, stdbuf, BUFSIZ)) > 0)
102: for (off = 0; nr; nr -= nw, off += nw)
103: if ((nw = write(wfd, stdbuf + off, (size_t)nr)) < 0)
104: err(1, "stdout");
105: if (nr < 0) {
106: warn("%s", filename);
107: rval = 1;
108: }
109: }
CVSweb