+/*
+ * Print an error message for a read error.
+ * This was exteracted from the original readtape().
+ */
+static void
+msg_read_error(char *m)
+{
+ switch (curfile.action) {
+ default:
+ fprintf(stderr, "%s trying to set up tape\n", m);
+ break;
+ case UNKNOWN:
+ fprintf(stderr, "%s trying to resynchronize\n", m);
+ break;
+ case USING:
+ fprintf(stderr, "%s restoring %s\n", m, curfile.name);
+ break;
+ case SKIP:
+ fprintf(stderr, "%s skipping over inode %lu\n", m,
+ (unsigned long)curfile.ino);
+ break;
+ }
+}
+#endif /* HAVE_ZLIB */
+
+/*
+ * Read the first block and set the blocksize from its length. Test
+ * if the block looks like a compressed dump tape. setup() will make
+ * the final determination by checking the compressed flag if gethead()
+ * finds a valid header. The test here is necessary to offset the buffer
+ * by the size of the compressed prefix. zflag is set here so that
+ * readtape_set can set the correct function pointer for readtape().
+ * Note that the first block of each tape/file will not be compressed.
+ */
+static void
+findtapeblksize(void)
+{
+ long i;
+ size_t len;
+ struct tapebuf *tpb = (struct tapebuf *) tapebuf;
+ struct s_spcl *spclpt = (struct s_spcl *) tpb->buf;
+
+ for (i = 0; i < ntrec; i++)
+ ((struct s_spcl *)&tapebuf[i * TP_BSIZE])->c_magic = 0;
+ blkcnt = 0;
+ tbufptr = tapebuf;
+ /*
+ * For a pipe or file, read in the first record. For a tape, read
+ * the first block.
+ */
+ len = magtapein ? bufsize + PREFIXSIZE: TP_BSIZE;
+
+ if (read_a_block(mt, tapebuf, len, &i) <= 0)
+ errx(1, "Tape read error on first record");
+
+ /*
+ * If the input is from a file or a pipe, we read TP_BSIZE
+ * bytes looking for a compressed dump header, we then
+ * need to read in the rest of the record, as determined by
+ * tpb->length or bufsize. The first block of the dump is
+ * guaranteed to not be compressed so we look at the header.
+ */
+ if (!magtapein) {
+ if (tpb->length % TP_BSIZE == 0
+ && tpb->length <= bufsize
+ && tpb->compressed == 0
+ && spclpt->c_type == TS_TAPE
+ && spclpt->c_flags & DR_COMPRESSED) {
+ /* Looks like it's a compressed dump block prefix, */
+ /* read in the rest of the block based on tpb->length. */
+ len = tpb->length - TP_BSIZE + PREFIXSIZE;
+ if (read_a_block(mt, tapebuf+TP_BSIZE, len, &i) <= 0
+ || i != len)
+ errx(1,"Error reading dump file header");
+ tbufptr = tpb->buf;
+ numtrec = ntrec = tpb->length / TP_BSIZE;
+ zflag = 1;
+ }
+ else {
+ /* read in the rest of the block based on bufsize */
+ len = bufsize - TP_BSIZE;
+ if (read_a_block(mt, tapebuf+TP_BSIZE, len, &i) <= 0
+ || i != len)
+ errx(1,"Error reading dump file header");
+ tbufptr = tapebuf;
+ numtrec = ntrec;
+ }
+ Vprintf(stdout, "Input block size is %ld\n", ntrec);
+ return;
+ }
+
+ /*
+ * If the input is a tape, we tried to read PREFIXSIZE +
+ * ntrec * TP_BSIZE bytes. If it's not a compressed dump tape
+ * or the value of ntrec is too large, we have read less than
+ * what we asked for; adjust the value of ntrec and test for
+ * a compressed dump tape prefix.
+ */
+
+ if (i % TP_BSIZE != 0) {
+ if (i % TP_BSIZE == PREFIXSIZE
+ && tpb->compressed == 0
+ && spclpt->c_type == TS_TAPE
+ && spclpt->c_flags & DR_COMPRESSED) {
+
+ zflag = 1;
+ tbufptr = tpb->buf;
+ if (tpb->length > bufsize)
+ errx(1, "Tape blocksize is too large, use "
+ "\'-b %d\' ", tpb->length / TP_BSIZE);
+ }
+ else
+ errx(1, "Tape block size (%ld) is not a multiple of dump block size (%d)",
+ i, TP_BSIZE);
+ }