/* cat - concatenates files Author: Andy Tanenbaum */ extern int errno; /*DEBUG*/ #include "blocksize.h" #include "stat.h" #define BUF_SIZE 512 int unbuffered; char buffer[BUF_SIZE]; char *next = buffer; main(argc, argv) int argc; char *argv[]; { int i, k, m, fd1; char *p; struct stat sbuf; k = 1; /* Check for the -u flag -- unbuffered operation. */ p = argv[1]; if (argc >=2 && *p == '-' && *(p+1) == 'u') { unbuffered = 1; k = 2; } if (k >= argc) { copyfile(0, 1); flush(); exit(0); } for (i = k; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 0) { fd1 = 0; } else { fd1 = open(argv[i], 0); if (fd1 < 0) { std_err("cat: cannot open "); std_err(argv[i]); std_err("\n"); continue; } } copyfile(fd1, 1); if (fd1 != 0) close(fd1); } flush(); exit(0); } copyfile(fd1, fd2) int fd1, fd2; { int n, j, m; char buf[BLOCK_SIZE]; while (1) { n = read(fd1, buf, BLOCK_SIZE); if (n < 0) quit(); if (n == 0) return; if (unbuffered) { m = write(fd2, buf, n); if (m != n) quit(); } else { for (j = 0; j < n; j++) { *next++ = buf[j]; if (next == &buffer[BUF_SIZE]) { m = write(fd2, buffer, BUF_SIZE); if (m != BUF_SIZE) quit(); next = buffer; } } } } } flush() { if (next != buffer) if (write(1, buffer, next - buffer) <= 0) quit(); } quit() { perror("cat"); exit(1); }