+
+fastcat(fd)
+register int fd;
+{
+ register int buffsize, n, nwritten, offset;
+ register char *buff;
+ struct stat statbuff;
+ char *malloc();
+
+#ifndef OPTSIZE
+ if (obsize)
+ buffsize = obsize; /* common case, use output blksize */
+ else if (ibsize)
+ buffsize = ibsize;
+ else
+ buffsize = BUFSIZ;
+#else
+ buffsize = OPTSIZE;
+#endif
+
+ if ((buff = malloc(buffsize)) == NULL) {
+ perror("cat: no memory");
+ return (1);
+ }
+
+ /*
+ * Note that on some systems (V7), very large writes to a pipe
+ * return less than the requested size of the write.
+ * In this case, multiple writes are required.
+ */
+ while ((n = read(fd, buff, buffsize)) > 0) {
+ offset = 0;
+ do {
+ nwritten = write(fileno(stdout), &buff[offset], n);
+ if (nwritten <= 0) {
+ perror("cat: write error");
+ exit(2);
+ }
+ offset += nwritten;
+ } while ((n -= nwritten) > 0);
+ }
+
+ free(buff);
+ if (n < 0) {
+ perror("cat: read error");
+ return (1);
+ }
+ return (0);
+}