|
|
1.1 root 1: /*
2: * Concatenate files.
3: */
4:
5: #include <stdio.h>
6: #include <sys/types.h>
7: #include <sys/stat.h>
8: #define BLOCK 4096
9:
10: char buf[BLOCK];
11:
12: main (argc, argv)
13: int argc;
14: char **argv;
15: {
16: register int fflg = 0;
17: register int fi, fo;
18: register int n;
19: register int dev, ino = -1;
20: struct stat statb;
21: int retcode=0;
22:
23: if (fstat (1, &statb) < 0) {
24: perror ("cat stdout");
25: return 1;
26: }
27:
28: statb.st_mode &= S_IFMT;
29: if (statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) {
30: dev = statb.st_dev;
31: ino = statb.st_ino;
32: }
33: if (argc < 2) {
34: argc = 2;
35: fflg++;
36: }
37: while (--argc > 0) {
38: if (fflg || **++argv == '-' && (*argv)[1] == '\0')
39: fi = 0;
40: else {
41: if ((fi = open (*argv, 0)) < 0) {
42: fprintf(stderr, "cat: ");
43: perror (*argv);
44: retcode = 1;
45: continue;
46: }
47: }
48: fstat (fi, &statb);
49: if (fstat (fi, &statb) >= 0
50: && statb.st_dev == dev
51: && statb.st_ino == ino) {
52: fprintf (stderr, "cat: input %s is output\n",
53: fflg? "-": *argv);
54: close (fi);
55: retcode = 1;
56: continue;
57: }
58: while ((n = read (fi, buf, sizeof buf)) > 0)
59: if (write (1, buf, n) != n){
60: perror ("cat output");
61: return 1;
62: }
63: if (fi != 0)
64: close (fi);
65: }
66: return retcode;
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.