/*-------------------------------------------------------------------*/ int write_het (DEVBLK *dev, BYTE *buf, U16 blklen, BYTE *unitstat,BYTE code) { int rc; /* Return code */ off_t cursize; /* Current size for size chk */ /* Check if we have already violated the size limit */ if(dev->tdparms.maxsize>0) { cursize=het_tell(dev->hetb); if(cursize>=dev->tdparms.maxsize) { build_senseX(TAPE_BSENSE_ENDOFTAPE,dev,unitstat,code); return -1; } } /* Write the data block */ rc = het_write (dev->hetb, buf, blklen); if (rc < 0) { /* Handle write error condition */ logmsg (_("HHCTA416E %4.4X: Error writing data block " "at block %8.8X in file %s: %s(%s)\n"), dev->devnum, dev->hetb->cblk, dev->filename, het_error(rc), strerror(errno)); /* Set unit check with equipment check */ build_senseX(TAPE_BSENSE_WRITEFAIL,dev,unitstat,code); return -1; } /* Check if we have violated the maxsize limit */ /* Also check if we are passed EOT marker */ if(dev->tdparms.maxsize>0) { cursize=het_tell(dev->hetb); if(cursize>dev->tdparms.maxsize) { logmsg (_("HHCTA430I %4.4X: max tape capacity exceeded\n"), dev->devnum); if(dev->tdparms.strictsize) { logmsg (_("HHCTA431I %4.4X: max tape capacity enforced\n"), dev->devnum); het_bsb(dev->hetb); cursize=het_tell(dev->hetb); ftruncate( fileno(dev->hetb->fd),cursize); dev->hetb->truncated=TRUE; /* SHOULD BE IN HETLIB */ } build_senseX(TAPE_BSENSE_ENDOFTAPE,dev,unitstat,code); return -1; } } /* Return normal status */ dev->blockid++; return 0; } /* end function write_het */
/*-------------------------------------------------------------------*/ int passedeot_het (DEVBLK *dev) { off_t cursize; if(dev->fd>0) { if(dev->tdparms.maxsize>0) { cursize=het_tell(dev->hetb); if(cursize+dev->eotmargin>dev->tdparms.maxsize) { dev->eotwarning = 1; return 1; } } } dev->eotwarning = 0; return 0; }
/*-------------------------------------------------------------------*/ int write_het (DEVBLK *dev, BYTE *buf, U32 blklen, BYTE *unitstat,BYTE code) { int rc; /* Return code */ off_t cursize; /* Current size for size chk */ if ( dev->hetb->writeprotect ) { build_senseX(TAPE_BSENSE_WRITEPROTECT,dev,unitstat,code); return -1; } /* Check if we have already violated the size limit */ if(dev->tdparms.maxsize>0) { cursize=het_tell(dev->hetb); if(cursize>=dev->tdparms.maxsize) { build_senseX(TAPE_BSENSE_ENDOFTAPE,dev,unitstat,code); return -1; } } /* Write the data block */ rc = het_write (dev->hetb, buf, blklen); if (rc < 0) { /* Handle write error condition */ char msgbuf[128]; MSGBUF( msgbuf, "Het error '%s': '%s'", het_error(rc), strerror(errno)); WRMSG (HHC00204, "E", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "het", "het_write()", (off_t)dev->hetb->cblk, msgbuf); /* Set unit check with equipment check */ build_senseX(TAPE_BSENSE_WRITEFAIL,dev,unitstat,code); return -1; } /* Check if we have violated the maxsize limit */ /* Also check if we are passed EOT marker */ if(dev->tdparms.maxsize>0) { cursize=het_tell(dev->hetb); if(cursize>dev->tdparms.maxsize) { WRMSG (HHC00208, "I", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "het"); if(dev->tdparms.strictsize) { WRMSG (HHC00209, "I", SSID_TO_LCSS(dev->ssid), dev->devnum, dev->filename, "het"); het_bsb(dev->hetb); cursize=het_tell(dev->hetb); VERIFY(!ftruncate(dev->hetb->fd, cursize)); dev->hetb->truncated=TRUE; /* SHOULD BE IN HETLIB */ } build_senseX(TAPE_BSENSE_ENDOFTAPE,dev,unitstat,code); return -1; } } /* Return normal status */ dev->blockid++; return 0; } /* end function write_het */