aboutsummaryrefslogblamecommitdiff
path: root/emulators/hercules/files/patch-tapecopy.c
blob: a1c42c2fdaef0d5cf7e730ff50ac12b0dff56496 (plain) (tree)










































































































































































































































































































































































                                                                        
--- tapecopy.c.orig	Thu Nov 29 13:53:46 2001
+++ tapecopy.c	Thu Jan 31 13:26:01 2002
@@ -8,357 +8,18 @@
 /* prints a summary of the tape files and blocksizes.                */
 /*-------------------------------------------------------------------*/
 
-#include "hercules.h"
-
-/*-------------------------------------------------------------------*/
-/* Structure definition for AWSTAPE block header                     */
-/*-------------------------------------------------------------------*/
-typedef struct _AWSTAPE_BLKHDR {
-        HWORD   curblkl;                /* Length of this block      */
-        HWORD   prvblkl;                /* Length of previous block  */
-        BYTE    flags1;                 /* Flags byte 1              */
-        BYTE    flags2;                 /* Flags byte 2              */
-    } AWSTAPE_BLKHDR;
-
-/* Definitions for AWSTAPE_BLKHDR flags byte 1 */
-#define AWSTAPE_FLAG1_NEWREC    0x80    /* Start of new record       */
-#define AWSTAPE_FLAG1_TAPEMARK  0x40    /* Tape mark                 */
-#define AWSTAPE_FLAG1_ENDREC    0x20    /* End of record             */
-
-/*-------------------------------------------------------------------*/
-/* Static data areas                                                 */
-/*-------------------------------------------------------------------*/
-static BYTE vollbl[] = "\xE5\xD6\xD3";  /* EBCDIC characters "VOL"   */
-static BYTE hdrlbl[] = "\xC8\xC4\xD9";  /* EBCDIC characters "HDR"   */
-static BYTE eoflbl[] = "\xC5\xD6\xC6";  /* EBCDIC characters "EOF"   */
-static BYTE eovlbl[] = "\xC5\xD6\xE5";  /* EBCDIC characters "EOV"   */
-static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO;
-static struct mt_tape_info densinfo[] = {
-    {0x01, "NRZI (800 bpi)"},
-    {0x02, "PE (1600 bpi)"},
-    {0x03, "GCR (6250 bpi)"},
-    {0x05, "QIC-45/60 (GCR, 8000 bpi)"},
-    {0x06, "PE (3200 bpi)"},
-    {0x07, "IMFM (6400 bpi)"},
-    {0x08, "GCR (8000 bpi)"},
-    {0x09, "GCR /37871 bpi)"},
-    {0x0A, "MFM (6667 bpi)"},
-    {0x0B, "PE (1600 bpi)"},
-    {0x0C, "GCR (12960 bpi)"},
-    {0x0D, "GCR (25380 bpi)"},
-    {0x0F, "QIC-120 (GCR 10000 bpi)"},
-    {0x10, "QIC-150/250 (GCR 10000 bpi)"},
-    {0x11, "QIC-320/525 (GCR 16000 bpi)"},
-    {0x12, "QIC-1350 (RLL 51667 bpi)"},
-    {0x13, "DDS (61000 bpi)"},
-    {0x14, "EXB-8200 (RLL 43245 bpi)"},
-    {0x15, "EXB-8500 (RLL 45434 bpi)"},
-    {0x16, "MFM 10000 bpi"},
-    {0x17, "MFM 42500 bpi"},
-    {0x24, "DDS-2"},
-    {0x8C, "EXB-8505 compressed"},
-    {0x90, "EXB-8205 compressed"},
-    {0, NULL}};
-static BYTE buf[65500];
-
-/*-------------------------------------------------------------------*/
-/* ASCII to EBCDIC translate tables                                  */
-/*-------------------------------------------------------------------*/
-#include "codeconv.h"
-
-/*-------------------------------------------------------------------*/
-/* Subroutine to print tape status                                   */
-/*-------------------------------------------------------------------*/
-static void print_status (BYTE *devname, long stat)
-{
-    printf ("%s status: %8.8lX", devname, stat);
-    if (GMT_EOF(stat)) printf (" EOF");
-    if (GMT_BOT(stat)) printf (" BOT");
-    if (GMT_EOT(stat)) printf (" EOT");
-    if (GMT_SM(stat)) printf (" SETMARK");
-    if (GMT_EOD(stat)) printf (" EOD");
-    if (GMT_WR_PROT(stat)) printf (" WRPROT");
-    if (GMT_ONLINE(stat)) printf (" ONLINE");
-    if (GMT_D_6250(stat)) printf (" 6250");
-    if (GMT_D_1600(stat)) printf (" 1600");
-    if (GMT_D_800(stat)) printf (" 800");
-    if (GMT_DR_OPEN(stat)) printf (" NOTAPE");
-    printf ("\n");
-
-} /* end function print_status */
-
-/*-------------------------------------------------------------------*/
-/* Subroutine to obtain and print tape status                        */
-/* Return value: 0=normal, 1=end of tape, -1=error                   */
-/*-------------------------------------------------------------------*/
-static int obtain_status (BYTE *devname, int devfd)
-{
-int             rc;                     /* Return code               */
-struct mtget    stblk;                  /* Area for MTIOCGET ioctl   */
-
-    rc = ioctl (devfd, MTIOCGET, (char*)&stblk);
-    if (rc < 0)
-    {
-        printf ("tapecopy: Error reading status of %s: %s\n",
-                devname, strerror(errno));
-        return -1;
-    }
-
-    print_status (devname, stblk.mt_gstat);
-
-    if (GMT_EOD(stblk.mt_gstat)) return 1;
-    if (GMT_EOT(stblk.mt_gstat)) return 1;
-
-    return 0;
-} /* end function print_status */
 
 /*-------------------------------------------------------------------*/
 /* TAPECOPY main entry point                                         */
 /*-------------------------------------------------------------------*/
 int main (int argc, char *argv[])
 {
-int             rc;                     /* Return code               */
-int             i;                      /* Array subscript           */
-int             len;                    /* Block length              */
-int             prevlen;                /* Previous block length     */
-BYTE           *devname;                /* -> Tape device name       */
-BYTE           *filename;               /* -> Output file name       */
-int             devfd;                  /* Tape file descriptor      */
-int             outfd = -1;             /* Output file descriptor    */
-int             fileno;                 /* Tape file number          */
-int             blkcount;               /* Block count               */
-int             minblksz;               /* Minimum block size        */
-int             maxblksz;               /* Maximum block size        */
-struct mtop     opblk;                  /* Area for MTIOCTOP ioctl   */
-struct mtget    stblk;                  /* Area for MTIOCGET ioctl   */
-long            density;                /* Tape density code         */
-BYTE            labelrec[81];           /* Standard label (ASCIIZ)   */
-AWSTAPE_BLKHDR  awshdr;                 /* AWSTAPE block header      */
-
-    /* Display the program identification message */
-    display_version (stderr, "Hercules tape copy program ");
-
-    /* The first argument is the tape device name */
-    if (argc > 1 && argv[1] != NULL && strlen(argv[1]) > 5
-        && memcmp (argv[1], "/dev/", 5) == 0)
-    {
-        devname = argv[1];
-    }
-    else
-    {
-        printf ("Usage: tapecopy /dev/st0 [outfile]\n");
-        exit (1);
-    }
-
-    /* The second argument is the output file name */
-    if (argc > 2 && argv[2] != NULL)
-        filename = argv[2];
-    else
-        filename = NULL;
-
-    /* Open the tape device */
-    devfd = open (devname, O_RDONLY|O_BINARY);
-    if (devfd < 0)
-    {
-        printf ("tapecopy: Error opening %s: %s\n",
-                devname, strerror(errno));
-        exit (3);
-    }
 
-    /* Obtain the tape status */
-    rc = ioctl (devfd, MTIOCGET, (char*)&stblk);
-    if (rc < 0)
-    {
-        printf ("tapecopy: Error reading status of %s: %s\n",
-                devname, strerror(errno));
-        exit (7);
-    }
 
-    /* Display tape status information */
-    for (i = 0; tapeinfo[i].t_type != 0
-                && tapeinfo[i].t_type != stblk.mt_type; i++);
-
-    if (tapeinfo[i].t_name != NULL)
-        printf ("%s device type: %s\n", devname, tapeinfo[i].t_name);
-    else
-        printf ("%s device type: 0x%lX\n", devname, stblk.mt_type);
-
-    density = (stblk.mt_dsreg & MT_ST_DENSITY_MASK)
-                >> MT_ST_DENSITY_SHIFT;
-
-    for (i = 0; densinfo[i].t_type != 0
-                && densinfo[i].t_type != density; i++);
-
-    if (densinfo[i].t_name != NULL)
-        printf ("%s tape density: %s\n", devname, densinfo[i].t_name);
-    else
-        printf ("%s tape density code: 0x%lX\n", devname, density);
-
-    if (stblk.mt_gstat != 0)
-    {
-        print_status (devname, stblk.mt_gstat);
-    }
-
-    /* Set the tape device to process variable length blocks */
-    opblk.mt_op = MTSETBLK;
-    opblk.mt_count = 0;
-    rc = ioctl (devfd, MTIOCTOP, (char*)&opblk);
-    if (rc < 0)
-    {
-        printf ("tapecopy: Error setting attributes for %s: %s\n",
-                devname, strerror(errno));
-        exit (5);
-    }
-
-    /* Rewind the tape to the beginning */
-    opblk.mt_op = MTREW;
-    opblk.mt_count = 1;
-    rc = ioctl (devfd, MTIOCTOP, (char*)&opblk);
-    if (rc < 0)
-    {
-        printf ("tapecopy: Error rewinding %s: %s\n",
-                devname, strerror(errno));
-        exit (6);
-    }
-
-    /* Open the output file */
-    if (filename != NULL)
-    {
-        outfd = open (filename, O_WRONLY | O_CREAT | O_BINARY,
-                        S_IRUSR | S_IWUSR | S_IRGRP);
-        if (outfd < 0)
-        {
-            printf ("tapecopy: Error opening %s: %s\n",
-                    filename, strerror(errno));
-            exit (4);
-        }
-    }
-
-    /* Copy blocks from tape to the output file */
-    fileno = 1;
-    blkcount = 0;
-    minblksz = 0;
-    maxblksz = 0;
-    len = 0;
-
-    while (1)
-    {
-        /* Save previous block length */
-        prevlen = len;
-
-        /* Read a block from the tape */
-        len = read (devfd, buf, sizeof(buf));
-        if (len < 0)
-        {
-            printf ("tapecopy: Error reading %s: %s\n",
-                    devname, strerror(errno));
-            obtain_status (devname, devfd);
-            exit (8);
-        }
-
-        /* Check for tape mark */
-        if (len == 0)
-        {
-            /* Print summary of current file */
-            printf ("File %u: Blocks=%u, block size min=%u, max=%u\n",
-                    fileno, blkcount, minblksz, maxblksz);
-
-            /* Write tape mark to output file */
-            if (outfd >= 0)
-            {
-                /* Build block header for tape mark */
-                awshdr.curblkl[0] = 0;
-                awshdr.curblkl[1] = 0;
-                awshdr.prvblkl[0] = prevlen & 0xFF;
-                awshdr.prvblkl[1] = (prevlen >> 8) & 0xFF;
-                awshdr.flags1 = AWSTAPE_FLAG1_TAPEMARK;
-                awshdr.flags2 = 0;
-
-                /* Write block header to output file */
-                rc = write (outfd, &awshdr, sizeof(AWSTAPE_BLKHDR));
-                if (rc < sizeof(AWSTAPE_BLKHDR))
-                {
-                    printf ("tapecopy: Error writing %s: %s\n",
-                            filename, strerror(errno));
-                    exit (9);
-                } /* end if(rc) */
-
-            } /* end if(outfd) */
-
-            /* Reset counters for next file */
-            fileno++;
-            minblksz = 0;
-            maxblksz = 0;
-            blkcount = 0;
-
-            /* Determine whether end of tape has been read */
-            rc = obtain_status (devname, devfd);
-            if (rc == 0) continue;
-            if (rc > 0) printf ("End of tape\n");
-            break;
-
-        } /* end if(tapemark) */
-
-        /* Count blocks and block sizes */
-        blkcount++;
-        if (len > maxblksz) maxblksz = len;
-        if (minblksz == 0 || len < minblksz) minblksz = len;
-
-        /* Print standard labels */
-        if (len == 80 && blkcount < 4
-            && (memcmp(buf, vollbl, 3) == 0
-                || memcmp(buf, hdrlbl, 3) == 0
-                || memcmp(buf, eoflbl, 3) == 0
-                || memcmp(buf, eovlbl, 3) == 0))
-        {
-            for (i=0; i < 80; i++)
-                labelrec[i] = ebcdic_to_ascii[buf[i]];
-            labelrec[i] = '\0';
-            printf ("%s\n", labelrec);
-        }
-        else
-        {
-            printf ("File %u: Block %u\r", fileno, blkcount);
-        }
-
-        /* Write block to output file */
-        if (outfd >= 0)
-        {
-            /* Build the block header */
-            awshdr.curblkl[0] = len & 0xFF;
-            awshdr.curblkl[1] = (len >> 8) & 0xFF;
-            awshdr.prvblkl[0] = prevlen & 0xFF;
-            awshdr.prvblkl[1] = (prevlen >> 8) & 0xFF;
-            awshdr.flags1 = AWSTAPE_FLAG1_NEWREC
-                            | AWSTAPE_FLAG1_ENDREC;
-            awshdr.flags2 = 0;
-
-            /* Write block header to output file */
-            rc = write (outfd, &awshdr, sizeof(AWSTAPE_BLKHDR));
-            if (rc < sizeof(AWSTAPE_BLKHDR))
-            {
-                printf ("tapecopy: Error writing %s: %s\n",
-                        filename, strerror(errno));
-                exit (10);
-            } /* end if(rc) */
-
-            /* Write data block to output file */
-            rc = write (outfd, buf, len);
-            if (rc < len)
-            {
-                printf ("tapecopy: Error writing %s: %s\n",
-                        filename, strerror(errno));
-                exit (11);
-            } /* end if(rc) */
-
-        } /* end if(outfd) */
-
-    } /* end while */
-
-    /* Close files and exit */
-    close (devfd);
-    if (filename != NULL) close (outfd);
+    /* Display the program identification message */
+ 
 
+    printf("Tape copy is broken, sorry\n");
     return 0;
 
 } /* end function main */