scsi.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)scsi.c 1.12 00/01/08 Copyright 1997 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)scsi.c 1.12 00/01/08 Copyright 1997 J. Schilling";
  5. #endif
  6. /*
  7.  * Copyright (c) 1997 J. Schilling
  8.  */
  9. /*
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24. #ifdef USE_SCG
  25. #include <mconfig.h>
  26. #include <stdio.h>
  27. #include <standard.h>
  28. #include <stdxlib.h>
  29. #include <unixstd.h>
  30. #include "mkisofs.h"
  31. #include <scg/scsireg.h>
  32. #include <scg/scsitransp.h>
  33. #include "cdrecord.h"
  34. /*
  35.  * NOTICE: You should not make BUF_SIZE more than
  36.  * the buffer size of the CD-Recorder.
  37.  *
  38.  * Do not set BUF_SIZE to be more than 126 KBytes
  39.  * if you are running cdrecord on a sun4c machine.
  40.  *
  41.  * WARNING: Philips CDD 521 dies if BUF_SIZE is to big.
  42.  */
  43. #define BUF_SIZE (62*1024) /* Must be a multiple of 2048    */
  44. LOCAL SCSI *scgp;
  45. LOCAL long bufsize; /* The size of the transfer buffer */
  46. int
  47. readsecs(startsecno, buffer, sectorcount)
  48. int startsecno;
  49. void *buffer;
  50. int sectorcount;
  51. {
  52. int f;
  53. int secsize; /* The drive's SCSI sector size */
  54. long amount; /* The number of bytes to be transfered */
  55. long secno; /* The sector number to read from */
  56. long secnum; /* The number of sectors to read */
  57. char *bp;
  58. long amt;
  59. if (in_image == NULL) {
  60. /*
  61.  * We are using the standard CD-ROM sectorsize of 2048 bytes
  62.  * while the drive may be switched to 512 bytes per sector.
  63.  *
  64.  * XXX We assume that secsize is no more than SECTOR_SIZE
  65.  * XXX and that SECTOR_SIZE / secsize is not a fraction.
  66.  */
  67. secsize = scgp->cap->c_bsize;
  68. amount = sectorcount * SECTOR_SIZE;
  69. secno = startsecno * (SECTOR_SIZE / secsize);
  70. bp = buffer;
  71. while (amount > 0) {
  72. amt = amount;
  73. if (amount > bufsize)
  74. amt = bufsize;
  75. secnum = amt / secsize;
  76. if (read_scsi(scgp, bp, secno, secnum) < 0 ||
  77. scsigetresid(scgp) != 0) {
  78. #ifdef OLD
  79. return (-1);
  80. #else
  81. comerr("Read error on old imagen");
  82. #endif
  83. }
  84. amount -= secnum * secsize;
  85. bp     += secnum * secsize;
  86. secno  += secnum;
  87. }
  88. return (SECTOR_SIZE * sectorcount);
  89. }
  90. f = fileno(in_image);
  91. if (lseek(f, (off_t)startsecno * SECTOR_SIZE, 0) == (off_t)-1) {
  92. #ifdef USE_LIBSCHILY
  93. comerr("Seek error on old imagen");
  94. #else
  95. fprintf(stderr,"Seek error on old imagen");
  96. exit(10);
  97. #endif
  98. }
  99. if( read(f, buffer, (sectorcount * SECTOR_SIZE))
  100.     != (sectorcount * SECTOR_SIZE) )
  101. {
  102. #ifdef USE_LIBSCHILY
  103. comerr("Read error on old imagen");
  104. #else
  105. fprintf(stderr," Read error on old imagen");
  106. exit(10);
  107. #endif
  108. }
  109. return sectorcount * SECTOR_SIZE;
  110. }
  111. int
  112. scsidev_open(path)
  113. char *path;
  114. {
  115. char errstr[80];
  116. char *buf; /* ignored, bit OS/2 ASPI layer needs memory which
  117.    has been allocated by scsi_getbuf()    */
  118. /* path, debug, verboseopen */
  119. scgp = open_scsi(path, errstr, sizeof(errstr), 0, 0);
  120. if (scgp == 0) {
  121. errmsg("%s%sCannot open SCSI driver.n", errstr, errstr[0]?". ":"");
  122. return (-1);
  123. }
  124. bufsize = scsi_bufsize(scgp, BUF_SIZE);
  125. if ((buf = scsi_getbuf(scgp, bufsize)) == NULL) {
  126. errmsg("Cannot get SCSI I/O buffer.n");
  127. close_scsi(scgp);
  128. return (-1);
  129. }
  130. bufsize = (bufsize / SECTOR_SIZE) * SECTOR_SIZE;
  131. allow_atapi(scgp, TRUE);
  132. if (!wait_unit_ready(scgp, 60)) {/* Eat Unit att / Wait for drive */
  133. scgp->silent--;
  134. return (-1);
  135. }
  136. scgp->silent++;
  137. read_capacity(scgp); /* Set Capacity/Sectorsize for I/O */
  138. scgp->silent--;
  139. return (1);
  140. }
  141. #endif /* USE_SCG */