FreeBSD Bugzilla – Attachment 19400 Details for
Bug 34488
New port: emulators/hercules (System/370, ESA/390, and z/Architecture Emulator)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
hercules.shar
hercules.shar (text/plain), 23.47 KB, created by
Miguel Mendez
on 2002-01-31 14:00:02 UTC
(
hide
)
Description:
hercules.shar
Filename:
MIME Type:
Creator:
Miguel Mendez
Created:
2002-01-31 14:00:02 UTC
Size:
23.47 KB
patch
obsolete
># This is a shell archive. Save it in a file, remove anything before ># this line, and then unpack it by entering "sh file". Note, it may ># create directories; files and directories will be owned by you and ># have default permissions. ># ># This archive contains: ># ># hercules ># hercules/pkg-descr ># hercules/distinfo ># hercules/Makefile ># hercules/pkg-comment ># hercules/pkg-plist ># hercules/pkg-message ># hercules/files ># hercules/files/patch-tapedev.c ># hercules/files/patch-tapecopy.c ># >echo c - hercules >mkdir -p hercules > /dev/null 2>&1 >echo x - hercules/pkg-descr >sed 's/^X//' >hercules/pkg-descr << 'END-of-hercules/pkg-descr' >XHercules is an open source software implementation of the mainframe System/370 >Xand ESA/390 architectures, in addition to the new 64-bit z/Architecture. >XHercules runs under Linux, Windows 98, Windows NT, and Windows 2000. >X >XHercules was created by Roger Bowler and is maintained by Jay Maynard. Jan >XJaeger designed and implemented many of the advanced features of Hercules, >Xincluding dynamic reconfiguration, integrated console, interpretive execution >Xand z/Architecture support. >X >XWWW: http://www.conmicro.cx/hercules/ >X >X- Miguel Mendez <flynn@energyhq.homeip.net> >END-of-hercules/pkg-descr >echo x - hercules/distinfo >sed 's/^X//' >hercules/distinfo << 'END-of-hercules/distinfo' >XMD5 (hercules-2.15.tar.gz) = 8eb98b2b5663607fda075fc57f019172 >END-of-hercules/distinfo >echo x - hercules/Makefile >sed 's/^X//' >hercules/Makefile << 'END-of-hercules/Makefile' >X# New ports collection makefile for: dice >X# Date created: Thu Jan 31 12:07:01 CET 2002 >X# Whom: Miguel Mendez <flynn@energyhq.homeip.net> >X# >X# $FreeBSD$ >X# >X >XPORTNAME= hercules >XPORTVERSION= 2.15 >XCATEGORIES= emulators >XMASTER_SITES= http://www.conmicro.cx/hercules/ >X >XMAINTAINER= flynn@energyhq.homeip.net >X >XGNU_CONFIGURE= yes >X >Xpost-patch: >X >X @${PERL} -pi -e 's@lpthread@pthread@g' ${WRKSRC}/configure >X >Xdo-install: >X >X @for i in hercules dasdinit dasdisup dasdload dasdls dasdpdsu \ >X tapecopy tapemap tapesplt cckd2ckd cckdcdsk ckd2cckd \ >X cckdcomp cckdswap hetget hetinit hetmap hetupd dmap2hrc; \ >X do \ >X ${INSTALL_PROGRAM} ${WRKSRC}/$$i ${PREFIX}/bin; \ >X done >X >X.if !defined(NOPORTDOCS) >X @${MKDIR} ${PREFIX}/share/doc/hercules >X @${RM} -f ${WRKSRC}/html/Makefile* >X @for i in ${WRKSRC}/hercules.cnf ${WRKSRC}/html/* ; \ >X do \ >X ${INSTALL_DATA} $$i ${PREFIX}/share/doc/hercules; \ >X done >X.endif >X @${CAT} pkg-message >X >X.include <bsd.port.mk> >END-of-hercules/Makefile >echo x - hercules/pkg-comment >sed 's/^X//' >hercules/pkg-comment << 'END-of-hercules/pkg-comment' >XThe Hercules System/370, ESA/390, and z/Architecture Emulator >END-of-hercules/pkg-comment >echo x - hercules/pkg-plist >sed 's/^X//' >hercules/pkg-plist << 'END-of-hercules/pkg-plist' >Xbin/hercules >Xbin/dasdinit >Xbin/dasdisup >Xbin/dasdload >Xbin/dasdls >Xbin/dasdpdsu >Xbin/tapecopy >Xbin/tapemap >Xbin/tapesplt >Xbin/cckd2ckd >Xbin/cckdcdsk >Xbin/ckd2cckd >Xbin/cckdcomp >Xbin/cckdswap >Xbin/hetget >Xbin/hetinit >Xbin/hetmap >Xbin/hetupd >Xbin/dmap2hrc >Xshare/doc/hercules/cckddasd.html >Xshare/doc/hercules/hercconf.html >Xshare/doc/hercules/hercfaq.html >Xshare/doc/hercules/hercinst.html >Xshare/doc/hercules/herclic.html >Xshare/doc/hercules/hercload.html >Xshare/doc/hercules/hercnew.html >Xshare/doc/hercules/herctcp.html >Xshare/doc/hercules/hercules.css >Xshare/doc/hercules/hercules.cnf >Xshare/doc/hercules/index.html >X@dirrm share/doc/hercules >END-of-hercules/pkg-plist >echo x - hercules/pkg-message >sed 's/^X//' >hercules/pkg-message << 'END-of-hercules/pkg-message' >X###################################################################### >X >X IMPORTANT >X Tape operations and tapecopy are broken in this port (contain Linux >Xspecific code that has not yet been adapted). >X >X Be sure to have a look at the docs and edit the hercules.cnf file to >Xyour needs (The sample is in ${PREFIX}/share/doc/hercules) >X >X###################################################################### >END-of-hercules/pkg-message >echo c - hercules/files >mkdir -p hercules/files > /dev/null 2>&1 >echo x - hercules/files/patch-tapedev.c >sed 's/^X//' >hercules/files/patch-tapedev.c << 'END-of-hercules/files/patch-tapedev.c' >X--- tapedev.c.orig Tue Nov 20 23:39:47 2001 >X+++ tapedev.c Thu Jan 31 13:06:43 2002 >X@@ -131,6 +131,11 @@ >X #define TAPEDEVT_SCSITAPE 3 /* Physical SCSI tape */ >X #define TAPEDEVT_HET 4 /* HET format disk file */ >X >X+/* Can you say totally b0rken? */ >X+#define MT_ST_DENSITY_MASK 1 >X+#define MT_TAPE_INFO 2 >X+#define MTSETBLK 3 >X+#define MT_ST_DENSITY_SHIFT 4 >X /*-------------------------------------------------------------------*/ >X /* Structure definition for tape block headers */ >X /*-------------------------------------------------------------------*/ >X@@ -194,7 +199,10 @@ >X /*-------------------------------------------------------------------*/ >X /* Static data areas */ >X /*-------------------------------------------------------------------*/ >X-static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO; >X+ >X+ >X+/* static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO; >X+ >X static struct mt_tape_info densinfo[] = { >X {0x01, "NRZI (800 bpi)"}, >X {0x02, "PE (1600 bpi)"}, >X@@ -221,7 +229,7 @@ >X {0x8C, "EXB-8505 compressed"}, >X {0x90, "EXB-8205 compressed"}, >X {0, NULL}}; >X- >X+*/ >X static PARSER ptab[] = >X { >X { "awstape", NULL }, >X@@ -1151,6 +1159,7 @@ >X if (dev->fd < 0) return 0; >X >X /* Obtain tape status */ >X+/* >X rc = ioctl (dev->fd, MTIOCGET, (char*)&stblk); >X if (rc < 0) >X { >X@@ -1159,8 +1168,9 @@ >X return 0; >X } >X stat = stblk.mt_gstat; >X- >X+*/ >X /* Display tape status */ >X+/* >X if (dev->ccwtrace || dev->ccwstep) >X { >X sprintf (buf, "%s status: %8.8X", dev->filename, stat); >X@@ -1177,10 +1187,11 @@ >X if (GMT_DR_OPEN(stat)) strcat (buf, " NOTAPE"); >X logmsg ("HHC215I %s\n", buf); >X } >X- >X+*/ >X /* If tape has been ejected, then close the file because >X the driver will not recognize that a new tape volume >X has been mounted until the file is re-opened */ >X+/* >X if (GMT_DR_OPEN(stat)) >X { >X close (dev->fd); >X@@ -1190,8 +1201,10 @@ >X dev->prvblkpos = -1; >X dev->blockid = 0; >X } >X- >X+*/ >X /* Return tape status */ >X+ >X+ fprintf(stderr,"Sorry, tape support is broken.\n"); >X return stat; >X >X } /* end function status_scsitape */ >X@@ -1249,6 +1262,7 @@ >X } >X >X /* Intervention required if no tape is mounted */ >X+/* >X if (GMT_DR_OPEN(stblk.mt_gstat)) >X { >X dev->sense[0] = SENSE_IR; >X@@ -1256,8 +1270,9 @@ >X *unitstat = CSW_CE | CSW_DE | CSW_UC; >X return -1; >X } >X- >X+*/ >X /* Display tape status information */ >X+/* >X for (i = 0; tapeinfo[i].t_type != 0 >X && tapeinfo[i].t_type != stblk.mt_type; i++); >X >X@@ -1280,8 +1295,9 @@ >X else >X logmsg ("HHC221I %s tape density code: 0x%lX\n", >X dev->filename, density); >X- >X+*/ >X /* Set the tape device to process variable length blocks */ >X+ /* >X opblk.mt_op = MTSETBLK; >X opblk.mt_count = 0; >X rc = ioctl (dev->fd, MTIOCTOP, (char*)&opblk); >X@@ -1294,8 +1310,9 @@ >X *unitstat = CSW_CE | CSW_DE | CSW_UC; >X return -1; >X } >X- >X+*/ >X /* Rewind the tape to the beginning */ >X+/* >X opblk.mt_op = MTREW; >X opblk.mt_count = 1; >X rc = ioctl (dev->fd, MTIOCTOP, (char*)&opblk); >X@@ -1308,7 +1325,7 @@ >X *unitstat = CSW_CE | CSW_DE | CSW_UC; >X return -1; >X } >X- >X+*/ >X return 0; >X >X } /* end function open_scsitape */ >X@@ -1436,13 +1453,14 @@ >X >X /* If I/O error and status indicates EOF, then a tapemark >X was detected, so increment the file number and return 0 */ >X+/* >X if (rc < 0 && fsrerrno == EIO && GMT_EOF(stat)) >X { >X dev->curfilen++; >X dev->blockid++; >X return 0; >X } >X- >X+*/ >X /* Handle MTFSR error condition */ >X if (rc < 0) >X { >X@@ -1481,6 +1499,7 @@ >X stat = status_scsitape (dev); >X >X /* Unit check if already at start of tape */ >X+/* >X if (GMT_BOT(stat)) >X { >X dev->sense[0] = 0; >X@@ -1488,7 +1507,7 @@ >X *unitstat = CSW_CE | CSW_DE | CSW_UC; >X return -1; >X } >X- >X+*/ >X /* Backspace block on SCSI tape */ >X opblk.mt_op = MTBSR; >X opblk.mt_count = 1; >X@@ -2703,12 +2722,15 @@ >X U32 stat; /* SCSI tape status bits */ >X >X /* Indicate intervention required if no file */ >X+/* >X if (!strcmp (dev->filename, TAPE_UNLOADED)) >X dev->sense[0] |= SENSE_IR; >X >X if (!(dev->fd < 0)) >X { >X+ */ >X /* Set load point indicator if tape is at load point */ >X+/* >X dev->sense[1] &= ~SENSE1_TAPE_LOADPT; >X switch (dev->tapedevt) >X { >X@@ -2732,41 +2754,14 @@ >X if (dev->nxtblkpos == 0 && dev->curfilen == 1) >X dev->sense[1] |= SENSE1_TAPE_LOADPT; >X break; >X- } /* end switch(dev->tapedevt) */ >X- } /* !(fd < 0) */ >X+ } >X+ */ >X+ /* end switch(dev->tapedevt) */ >X+ >X >X /* Indicate Drive online to control unit */ >X- dev->sense[1] |= SENSE1_TAPE_TUA; >X >X- /* Set file protect indicator if read-only file */ >X- if (dev->readonly) >X- dev->sense[1] |= SENSE1_TAPE_FP; >X- else >X- dev->sense[1] &= ~SENSE1_TAPE_FP; >X >X- /* Set Error Recovery Action Code */ >X- if (dev->sense[0] & SENSE_IR) >X- dev->sense[3] = 0x43; >X- else if (dev->sense[0] & SENSE_CR) >X- dev->sense[3] = 0x27; >X- else if (dev->sense[1] & SENSE1_TAPE_FP) >X- dev->sense[3] = 0x30; >X- else >X- dev->sense[3] = 0x29; >X- >X- /* Set sense bytes for 3420 */ >X- if (dev->devtype != 0x3480) >X- { >X-// dev->sense[4] |= 0x20; >X- dev->sense[5] |= 0xC0; >X- dev->sense[6] |= 0x03; >X- dev->sense[13] = 0x80; >X- dev->sense[14] = 0x01; >X- dev->sense[15] = 0x00; >X- dev->sense[16] = 0x01; >X- dev->sense[19] = 0xFF; >X- dev->sense[20] = 0xFF; >X- } >X >X } /* end function build_sense */ >X >END-of-hercules/files/patch-tapedev.c >echo x - hercules/files/patch-tapecopy.c >sed 's/^X//' >hercules/files/patch-tapecopy.c << 'END-of-hercules/files/patch-tapecopy.c' >X--- tapecopy.c.orig Thu Nov 29 13:53:46 2001 >X+++ tapecopy.c Thu Jan 31 13:26:01 2002 >X@@ -8,357 +8,18 @@ >X /* prints a summary of the tape files and blocksizes. */ >X /*-------------------------------------------------------------------*/ >X >X-#include "hercules.h" >X- >X-/*-------------------------------------------------------------------*/ >X-/* Structure definition for AWSTAPE block header */ >X-/*-------------------------------------------------------------------*/ >X-typedef struct _AWSTAPE_BLKHDR { >X- HWORD curblkl; /* Length of this block */ >X- HWORD prvblkl; /* Length of previous block */ >X- BYTE flags1; /* Flags byte 1 */ >X- BYTE flags2; /* Flags byte 2 */ >X- } AWSTAPE_BLKHDR; >X- >X-/* Definitions for AWSTAPE_BLKHDR flags byte 1 */ >X-#define AWSTAPE_FLAG1_NEWREC 0x80 /* Start of new record */ >X-#define AWSTAPE_FLAG1_TAPEMARK 0x40 /* Tape mark */ >X-#define AWSTAPE_FLAG1_ENDREC 0x20 /* End of record */ >X- >X-/*-------------------------------------------------------------------*/ >X-/* Static data areas */ >X-/*-------------------------------------------------------------------*/ >X-static BYTE vollbl[] = "\xE5\xD6\xD3"; /* EBCDIC characters "VOL" */ >X-static BYTE hdrlbl[] = "\xC8\xC4\xD9"; /* EBCDIC characters "HDR" */ >X-static BYTE eoflbl[] = "\xC5\xD6\xC6"; /* EBCDIC characters "EOF" */ >X-static BYTE eovlbl[] = "\xC5\xD6\xE5"; /* EBCDIC characters "EOV" */ >X-static struct mt_tape_info tapeinfo[] = MT_TAPE_INFO; >X-static struct mt_tape_info densinfo[] = { >X- {0x01, "NRZI (800 bpi)"}, >X- {0x02, "PE (1600 bpi)"}, >X- {0x03, "GCR (6250 bpi)"}, >X- {0x05, "QIC-45/60 (GCR, 8000 bpi)"}, >X- {0x06, "PE (3200 bpi)"}, >X- {0x07, "IMFM (6400 bpi)"}, >X- {0x08, "GCR (8000 bpi)"}, >X- {0x09, "GCR /37871 bpi)"}, >X- {0x0A, "MFM (6667 bpi)"}, >X- {0x0B, "PE (1600 bpi)"}, >X- {0x0C, "GCR (12960 bpi)"}, >X- {0x0D, "GCR (25380 bpi)"}, >X- {0x0F, "QIC-120 (GCR 10000 bpi)"}, >X- {0x10, "QIC-150/250 (GCR 10000 bpi)"}, >X- {0x11, "QIC-320/525 (GCR 16000 bpi)"}, >X- {0x12, "QIC-1350 (RLL 51667 bpi)"}, >X- {0x13, "DDS (61000 bpi)"}, >X- {0x14, "EXB-8200 (RLL 43245 bpi)"}, >X- {0x15, "EXB-8500 (RLL 45434 bpi)"}, >X- {0x16, "MFM 10000 bpi"}, >X- {0x17, "MFM 42500 bpi"}, >X- {0x24, "DDS-2"}, >X- {0x8C, "EXB-8505 compressed"}, >X- {0x90, "EXB-8205 compressed"}, >X- {0, NULL}}; >X-static BYTE buf[65500]; >X- >X-/*-------------------------------------------------------------------*/ >X-/* ASCII to EBCDIC translate tables */ >X-/*-------------------------------------------------------------------*/ >X-#include "codeconv.h" >X- >X-/*-------------------------------------------------------------------*/ >X-/* Subroutine to print tape status */ >X-/*-------------------------------------------------------------------*/ >X-static void print_status (BYTE *devname, long stat) >X-{ >X- printf ("%s status: %8.8lX", devname, stat); >X- if (GMT_EOF(stat)) printf (" EOF"); >X- if (GMT_BOT(stat)) printf (" BOT"); >X- if (GMT_EOT(stat)) printf (" EOT"); >X- if (GMT_SM(stat)) printf (" SETMARK"); >X- if (GMT_EOD(stat)) printf (" EOD"); >X- if (GMT_WR_PROT(stat)) printf (" WRPROT"); >X- if (GMT_ONLINE(stat)) printf (" ONLINE"); >X- if (GMT_D_6250(stat)) printf (" 6250"); >X- if (GMT_D_1600(stat)) printf (" 1600"); >X- if (GMT_D_800(stat)) printf (" 800"); >X- if (GMT_DR_OPEN(stat)) printf (" NOTAPE"); >X- printf ("\n"); >X- >X-} /* end function print_status */ >X- >X-/*-------------------------------------------------------------------*/ >X-/* Subroutine to obtain and print tape status */ >X-/* Return value: 0=normal, 1=end of tape, -1=error */ >X-/*-------------------------------------------------------------------*/ >X-static int obtain_status (BYTE *devname, int devfd) >X-{ >X-int rc; /* Return code */ >X-struct mtget stblk; /* Area for MTIOCGET ioctl */ >X- >X- rc = ioctl (devfd, MTIOCGET, (char*)&stblk); >X- if (rc < 0) >X- { >X- printf ("tapecopy: Error reading status of %s: %s\n", >X- devname, strerror(errno)); >X- return -1; >X- } >X- >X- print_status (devname, stblk.mt_gstat); >X- >X- if (GMT_EOD(stblk.mt_gstat)) return 1; >X- if (GMT_EOT(stblk.mt_gstat)) return 1; >X- >X- return 0; >X-} /* end function print_status */ >X >X /*-------------------------------------------------------------------*/ >X /* TAPECOPY main entry point */ >X /*-------------------------------------------------------------------*/ >X int main (int argc, char *argv[]) >X { >X-int rc; /* Return code */ >X-int i; /* Array subscript */ >X-int len; /* Block length */ >X-int prevlen; /* Previous block length */ >X-BYTE *devname; /* -> Tape device name */ >X-BYTE *filename; /* -> Output file name */ >X-int devfd; /* Tape file descriptor */ >X-int outfd = -1; /* Output file descriptor */ >X-int fileno; /* Tape file number */ >X-int blkcount; /* Block count */ >X-int minblksz; /* Minimum block size */ >X-int maxblksz; /* Maximum block size */ >X-struct mtop opblk; /* Area for MTIOCTOP ioctl */ >X-struct mtget stblk; /* Area for MTIOCGET ioctl */ >X-long density; /* Tape density code */ >X-BYTE labelrec[81]; /* Standard label (ASCIIZ) */ >X-AWSTAPE_BLKHDR awshdr; /* AWSTAPE block header */ >X- >X- /* Display the program identification message */ >X- display_version (stderr, "Hercules tape copy program "); >X- >X- /* The first argument is the tape device name */ >X- if (argc > 1 && argv[1] != NULL && strlen(argv[1]) > 5 >X- && memcmp (argv[1], "/dev/", 5) == 0) >X- { >X- devname = argv[1]; >X- } >X- else >X- { >X- printf ("Usage: tapecopy /dev/st0 [outfile]\n"); >X- exit (1); >X- } >X- >X- /* The second argument is the output file name */ >X- if (argc > 2 && argv[2] != NULL) >X- filename = argv[2]; >X- else >X- filename = NULL; >X- >X- /* Open the tape device */ >X- devfd = open (devname, O_RDONLY|O_BINARY); >X- if (devfd < 0) >X- { >X- printf ("tapecopy: Error opening %s: %s\n", >X- devname, strerror(errno)); >X- exit (3); >X- } >X >X- /* Obtain the tape status */ >X- rc = ioctl (devfd, MTIOCGET, (char*)&stblk); >X- if (rc < 0) >X- { >X- printf ("tapecopy: Error reading status of %s: %s\n", >X- devname, strerror(errno)); >X- exit (7); >X- } >X >X- /* Display tape status information */ >X- for (i = 0; tapeinfo[i].t_type != 0 >X- && tapeinfo[i].t_type != stblk.mt_type; i++); >X- >X- if (tapeinfo[i].t_name != NULL) >X- printf ("%s device type: %s\n", devname, tapeinfo[i].t_name); >X- else >X- printf ("%s device type: 0x%lX\n", devname, stblk.mt_type); >X- >X- density = (stblk.mt_dsreg & MT_ST_DENSITY_MASK) >X- >> MT_ST_DENSITY_SHIFT; >X- >X- for (i = 0; densinfo[i].t_type != 0 >X- && densinfo[i].t_type != density; i++); >X- >X- if (densinfo[i].t_name != NULL) >X- printf ("%s tape density: %s\n", devname, densinfo[i].t_name); >X- else >X- printf ("%s tape density code: 0x%lX\n", devname, density); >X- >X- if (stblk.mt_gstat != 0) >X- { >X- print_status (devname, stblk.mt_gstat); >X- } >X- >X- /* Set the tape device to process variable length blocks */ >X- opblk.mt_op = MTSETBLK; >X- opblk.mt_count = 0; >X- rc = ioctl (devfd, MTIOCTOP, (char*)&opblk); >X- if (rc < 0) >X- { >X- printf ("tapecopy: Error setting attributes for %s: %s\n", >X- devname, strerror(errno)); >X- exit (5); >X- } >X- >X- /* Rewind the tape to the beginning */ >X- opblk.mt_op = MTREW; >X- opblk.mt_count = 1; >X- rc = ioctl (devfd, MTIOCTOP, (char*)&opblk); >X- if (rc < 0) >X- { >X- printf ("tapecopy: Error rewinding %s: %s\n", >X- devname, strerror(errno)); >X- exit (6); >X- } >X- >X- /* Open the output file */ >X- if (filename != NULL) >X- { >X- outfd = open (filename, O_WRONLY | O_CREAT | O_BINARY, >X- S_IRUSR | S_IWUSR | S_IRGRP); >X- if (outfd < 0) >X- { >X- printf ("tapecopy: Error opening %s: %s\n", >X- filename, strerror(errno)); >X- exit (4); >X- } >X- } >X- >X- /* Copy blocks from tape to the output file */ >X- fileno = 1; >X- blkcount = 0; >X- minblksz = 0; >X- maxblksz = 0; >X- len = 0; >X- >X- while (1) >X- { >X- /* Save previous block length */ >X- prevlen = len; >X- >X- /* Read a block from the tape */ >X- len = read (devfd, buf, sizeof(buf)); >X- if (len < 0) >X- { >X- printf ("tapecopy: Error reading %s: %s\n", >X- devname, strerror(errno)); >X- obtain_status (devname, devfd); >X- exit (8); >X- } >X- >X- /* Check for tape mark */ >X- if (len == 0) >X- { >X- /* Print summary of current file */ >X- printf ("File %u: Blocks=%u, block size min=%u, max=%u\n", >X- fileno, blkcount, minblksz, maxblksz); >X- >X- /* Write tape mark to output file */ >X- if (outfd >= 0) >X- { >X- /* Build block header for tape mark */ >X- awshdr.curblkl[0] = 0; >X- awshdr.curblkl[1] = 0; >X- awshdr.prvblkl[0] = prevlen & 0xFF; >X- awshdr.prvblkl[1] = (prevlen >> 8) & 0xFF; >X- awshdr.flags1 = AWSTAPE_FLAG1_TAPEMARK; >X- awshdr.flags2 = 0; >X- >X- /* Write block header to output file */ >X- rc = write (outfd, &awshdr, sizeof(AWSTAPE_BLKHDR)); >X- if (rc < sizeof(AWSTAPE_BLKHDR)) >X- { >X- printf ("tapecopy: Error writing %s: %s\n", >X- filename, strerror(errno)); >X- exit (9); >X- } /* end if(rc) */ >X- >X- } /* end if(outfd) */ >X- >X- /* Reset counters for next file */ >X- fileno++; >X- minblksz = 0; >X- maxblksz = 0; >X- blkcount = 0; >X- >X- /* Determine whether end of tape has been read */ >X- rc = obtain_status (devname, devfd); >X- if (rc == 0) continue; >X- if (rc > 0) printf ("End of tape\n"); >X- break; >X- >X- } /* end if(tapemark) */ >X- >X- /* Count blocks and block sizes */ >X- blkcount++; >X- if (len > maxblksz) maxblksz = len; >X- if (minblksz == 0 || len < minblksz) minblksz = len; >X- >X- /* Print standard labels */ >X- if (len == 80 && blkcount < 4 >X- && (memcmp(buf, vollbl, 3) == 0 >X- || memcmp(buf, hdrlbl, 3) == 0 >X- || memcmp(buf, eoflbl, 3) == 0 >X- || memcmp(buf, eovlbl, 3) == 0)) >X- { >X- for (i=0; i < 80; i++) >X- labelrec[i] = ebcdic_to_ascii[buf[i]]; >X- labelrec[i] = '\0'; >X- printf ("%s\n", labelrec); >X- } >X- else >X- { >X- printf ("File %u: Block %u\r", fileno, blkcount); >X- } >X- >X- /* Write block to output file */ >X- if (outfd >= 0) >X- { >X- /* Build the block header */ >X- awshdr.curblkl[0] = len & 0xFF; >X- awshdr.curblkl[1] = (len >> 8) & 0xFF; >X- awshdr.prvblkl[0] = prevlen & 0xFF; >X- awshdr.prvblkl[1] = (prevlen >> 8) & 0xFF; >X- awshdr.flags1 = AWSTAPE_FLAG1_NEWREC >X- | AWSTAPE_FLAG1_ENDREC; >X- awshdr.flags2 = 0; >X- >X- /* Write block header to output file */ >X- rc = write (outfd, &awshdr, sizeof(AWSTAPE_BLKHDR)); >X- if (rc < sizeof(AWSTAPE_BLKHDR)) >X- { >X- printf ("tapecopy: Error writing %s: %s\n", >X- filename, strerror(errno)); >X- exit (10); >X- } /* end if(rc) */ >X- >X- /* Write data block to output file */ >X- rc = write (outfd, buf, len); >X- if (rc < len) >X- { >X- printf ("tapecopy: Error writing %s: %s\n", >X- filename, strerror(errno)); >X- exit (11); >X- } /* end if(rc) */ >X- >X- } /* end if(outfd) */ >X- >X- } /* end while */ >X- >X- /* Close files and exit */ >X- close (devfd); >X- if (filename != NULL) close (outfd); >X+ /* Display the program identification message */ >X+ >X >X+ printf("Tape copy is broken, sorry\n"); >X return 0; >X >X } /* end function main */ >END-of-hercules/files/patch-tapecopy.c >exit
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 34488
: 19400