⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aspi.c

📁 unix 下tar 执行程序的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:


int SCSIRead(adapter, target_id, lun, buf, len, l2bf, sili, fixed, sense)
int adapter;
int target_id;
int lun;
char far *buf;
DWORD len;
int l2bf;
int sili;
int fixed;
unsigned char *sense;
{
  DWORD length;
  struct _srbio *srb;
  int i;

  /* allocate a SCSI Request Block (SRB) in the lower 1 MB */

  if ( (srb=calloc((DWORD) sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);

  length = ( fixed ) ? len>>l2bf : len;

  srb->h.cmd = 2;           /* scsi I/O request */
  srb->h.adapter = adapter;
  srb->h.flags = (1<<3);
  srb->target_id = target_id;
  srb->lun = lun;
  srb->alloc_len = len;
  srb->sense_len = 14;
  srb->buf_seg = FP_SEG(buf);
  srb->buf_off = FP_OFF(buf);
  srb->cdb_len = 6;
  srb->ccb.rdwr.cmd = 0x08;
  srb->ccb.rdwr.fixed = fixed;
  srb->ccb.rdwr.sili = sili;
  srb->ccb.rdwr.lun = lun;
  srb->ccb.rdwr.len_0 = (length & 0xff);
  srb->ccb.rdwr.len_1 = ((length>>8) & 0xff);
  srb->ccb.rdwr.len_2 = ((length>>16) & 0xff);

  if ( (i=aspireq(srb)) )  {
    if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.rdwr.sense[i];
    i = ScsiIoError(srb->h.status, srb->adapter_status,
                    srb->target_status, srb->ccb.rdwr.sense);
  }

  ( void ) free(srb);
  return(i);
}


int SCSIReadBlockLimits(adapter, target_id, lun, lim, sense)
int adapter;
int target_id;
int lun;
blocklimit *lim;
unsigned char *sense;
{
  struct _srbio *srb;
  char *buf;
  unsigned char far *block;
  int i, j;

  /* allocate a SCSI Request Block (SRB) */
  if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);

  /* allocate small data buffer */
  if ( (buf=calloc(64, 1)) ==  0 ) return(E$NoMem);

  block = ( unsigned char far * ) buf;

  srb->h.cmd = 2;
  srb->h.adapter = adapter;
  srb->h.flags = (1<<3);
  srb->target_id = target_id;
  srb->lun = lun;
  srb->alloc_len = 6;
  srb->sense_len = 14;
  srb->buf_seg = FP_SEG(block);
  srb->buf_off = FP_OFF(block);
  srb->cdb_len = 6;
  srb->ccb.c6.cmd = 0x05;
  srb->ccb.c6.lun = lun;

  if ( (i=aspireq(srb)) )  {
    if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.c6.sense[i];
    i = ScsiIoError(srb->h.status, srb->adapter_status,
                    srb->target_status, srb->ccb.c6.sense);
  } else  {
    lim->max =   (    ((( DWORD ) buf[1])<<16) |
                      ((( DWORD ) buf[2])<<8)  |
                      ((( DWORD ) buf[3])) );
    lim->min =   (    ((( DWORD ) buf[4])<<8) |
                      ((( DWORD ) buf[5])) );
  }

  ( void ) free(buf);
  ( void ) free(srb);

  return(i);
}

int SCSIRewind(adapter, target_id, lun, immediate, sense)
int adapter;
int target_id;
int lun;
int immediate;
unsigned char *sense;
{
  struct _srbio *srb;
  int i;

  /* allocate a SCSI Request Block (SRB) */
  if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);

  srb->h.cmd = 2;
  srb->h.adapter = adapter;
  srb->target_id = target_id;
  srb->lun = lun;
  srb->sense_len = 14;
  srb->cdb_len = 6;
  srb->ccb.c6.cmd = 0x01;
  srb->ccb.c6.lun = lun;
  srb->ccb.c6.flag0 = immediate;

  if ( (i=aspireq(srb)) )  {
    if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.c6.sense[i];
    i = ScsiIoError(srb->h.status, srb->adapter_status,
                    srb->target_status, srb->ccb.c6.sense);
  }

  ( void ) free(srb);

  return(i);
}


int SCSISpace(adapter, target_id, lun, code, count, sense)
int adapter;
int target_id;
int lun;
int code;
long count;
unsigned char *sense;
{
  DWORD lcount;
  struct _srbio *srb;
  int i;

  /* allocate a SCSI Request Block (SRB) */
  if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);

  lcount = count;

  srb->h.cmd = 2;
  srb->h.adapter = adapter;
  srb->target_id = target_id;
  srb->lun = lun;
  srb->sense_len = 14;
  srb->cdb_len = 6;
  srb->ccb.spc.cmd = 0x11;
  srb->ccb.spc.code = code;
  srb->ccb.spc.lun = lun;
  srb->ccb.spc.cnt0 = (lcount & 0xff);
  srb->ccb.spc.cnt1 = ((lcount>>8) & 0xff);
  srb->ccb.spc.cnt2 = ((lcount>>16) & 0xff);

  if ( (i=aspireq(srb)) )  {
    if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.spc.sense[i];
    i = ScsiIoError(srb->h.status, srb->adapter_status,
                    srb->target_status, srb->ccb.spc.sense);
  }

  ( void ) free(srb);

  return(i);
}


int SCSIWrite(adapter, target_id, lun, buf, len, l2bf, fixed, sense)
int adapter;
int target_id;
int lun;
char far *buf;
DWORD len;
int l2bf;
int fixed;
unsigned char *sense;
{
  DWORD length;
  struct _srbio *srb;
  int i;

  /* allocate a SCSI Request Block (SRB) in the lower 1 MB */

  if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);

  length = ( fixed ) ? len>>l2bf : len;

  srb->h.cmd = 2;           /* scsi I/O request */
  srb->h.adapter = adapter;
  srb->h.flags = (1<<4);
  srb->target_id = target_id;
  srb->lun = lun;
  srb->alloc_len = len;
  srb->sense_len = 14;
  srb->buf_seg = FP_SEG(buf);
  srb->buf_off = FP_OFF(buf);
  srb->cdb_len = 6;
  srb->ccb.rdwr.cmd = 0x0a;
  srb->ccb.rdwr.fixed = fixed;
  srb->ccb.rdwr.lun = lun;
  srb->ccb.rdwr.len_0 = (length & 0xff);
  srb->ccb.rdwr.len_1 = ((length>>8) & 0xff);
  srb->ccb.rdwr.len_2 = ((length>>16) & 0xff);

  if ( (i=aspireq(srb)) )  {
    if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.rdwr.sense[i];
    i = ScsiIoError(srb->h.status, srb->adapter_status,
                    srb->target_status, srb->ccb.rdwr.sense);
  }

  ( void ) free(srb);
  return(i);
}



int SCSIWriteFilemarks(adapter, target_id, lun, len, setmark, immediate, sense)
int adapter;
int target_id;
int lun;
DWORD len;
int setmark;
int immediate;
unsigned char *sense;
{
  DWORD length;
  struct _srbio *srb;
  int i;

  /* allocate a SCSI Request Block (SRB) */

  if ( (srb=calloc(sizeof(struct _srbio), 1)) == 0 ) return(E$NoMem);

  length = len;

  srb->h.cmd = 2;           /* scsi I/O request */
  srb->h.adapter = adapter;
  srb->target_id = target_id;
  srb->lun = lun;
  srb->sense_len = 14;
  srb->cdb_len = 6;
  srb->ccb.rdwr.cmd = 0x10;
  srb->ccb.rdwr.fixed = immediate;
  srb->ccb.rdwr.sili = setmark;
  srb->ccb.rdwr.lun = lun;
  srb->ccb.rdwr.len_0 = (length & 0xff);
  srb->ccb.rdwr.len_1 = ((length>>8) & 0xff);
  srb->ccb.rdwr.len_2 = ((length>>16) & 0xff);

  if ( (i=aspireq(srb)) )  {
    if ( sense ) for(i=0; i<14; ++i) sense[i] = srb->ccb.rdwr.sense[i];
    i = ScsiIoError(srb->h.status, srb->adapter_status,
                    srb->target_status, srb->ccb.rdwr.sense);
  }

  ( void ) free(srb);
  return(i);
}

#ifdef TEST_ASPI
main()
{
  aspiinquiry inq;
  scsiinquiry sinq;
  int i, j;
  long l;
  char *buf;

  aspiinit();

  inq.adapter_num = 0;
  HostAdapterInquiry(&inq);


  printf("%d adapters, target:%d\n", inq.adapters, inq.target_id);
  printf("Manager id: %s\n", inq.manager_id);
  printf("adapter id: %s\n", inq.adapter_id);

  printf("\nrecsize: %ld, log2(recsize)= %d\n", recsize, logrec);

  if ( (i=SCSIInquiry(TARGET, &sinq, 0)) != E$NoErr )  {
    printf("Scsi Inquiry returned %d\n", i);
  } else  {
    printf("type,pqual,dqual: %d, %d, %d\n", sinq.per_type,
            sinq.per_qualify, sinq.dev_qualify);
    printf("vendor_id:%.8s\n", sinq.vendor_id);
    printf("product_id:%.16s\n", sinq.product_id);
    printf("revision:%.4s\n", sinq.revision);
    printf("vendor:%.20s\n", sinq.vendor);
  }

  if ( (buf=malloc(32768)) == 0 ) {
    printf("can't alloc buf\n");
    exit(0);
  }

  printf("\nBlocklimits, max:%ld min:%ld\n", lim.max, lim.min);

  i = SCSILoad(TARGET, 0, 1, 0, 0, 0);
  printf("\nLoad returned %d\n -->", i);

#if 0
  printf("seeking to tape file 2...\n");

  if ( (i=SCSISpace(TARGET, 1, ( DWORD ) 1, 0)) )
    printf("Error %d\n", i );
  else printf("OK\n");

  printf("seeking to tape block 400 on file 2...\n");
  if ( (i=SCSISpace(TARGET, 0, ( DWORD ) 400, 0)) )
    printf("Error %d\n", i );
  else printf("OK\n");

  printf("Writing two sectors..(this should return an error)...\n");
  i = SCSIWrite(TARGET, buf, 1024l, 9, 1, 0);
  printf("Write returned %d\n", i);

  printf("seeking back two sectors...\n");
  if ( (i=SCSISpace(TARGET, 0, -2l, 0)) )
    printf("Error %d\n", i );
  else printf("OK\n");

  printf("reading back the two sectors...\n");
  i = SCSIRead(TARGET, buf, 1024l, 9, 0, 1, 0);
  printf("Read returned %d\n", i);

  printf("rewinding the tape...\n");
  i = SCSIRewind(TARGET, 0, 0);
  printf("Rewind returned %d\n", i);

  printf("seeking to the end of the data...\n");
  if ( (i=SCSISpace(TARGET, 3, 0l, 0)) )
    printf("Error %d\n", i );
  else printf("OK\n");

  printf("Writing two sectors...\n");
  i = SCSIWrite(TARGET, buf, 1024l, 9, 1, 0);
  printf("Write returned %d\n", i);

  printf("Writing two sectors...\n");
  i = SCSIWrite(TARGET, buf, 1024l, 9, 1, 0);
  printf("Write returned %d\n", i);

  printf("Writing a file mark !\n");
  i = SCSIWriteFilemarks(TARGET, 1l, 0, 0, 0);
  printf("Write returned %d\n", i);

  printf("rewinding the tape...\n");
  i = SCSIRewind(TARGET, 0, 0);
  printf("Rewind returned %d\n", i);

  printf("Now counting files ...\n");
  i = 0;
  while ( !SCSISpace(TARGET, 1, 1l, 0) ) ++ i;
  printf("... there are %d files on the tape now\n",i);

  printf("rewinding the tape...\n");
  i = SCSIRewind(TARGET, 0, 0);
  printf("Rewind returned %d\n", i);

  printf("eraseing the tape...\n");
  i = SCSIErase(TARGET, 0, 0, 0);
  printf("erase returned %d\n", i);
#endif

  l = 0l;

  printf("Now see what kind of errors we get at Overflow\n");
  while ( l < 4080l ) {
    i = SCSIRead(TARGET, buf, 32768l, 9, 0, 1, rsense);
    if ( i ) {
      printf("reading block # %ld: errno: %d rsense:", l, i);
      for(j=0; j<14; ++j) printf(" %02x", rsense[j]);
      printf("\n");
    }
    ++l;
  }

/*
  while ( !(i=SCSIWrite(TARGET, buf, 32768l, 9, 1, rsense)) )  ++l;
  printf("last block was %ld\n", l);
  printf("errno: %d sense:", i);
  for(j=0; j<14; ++j) printf(" %02x", rsense[j]);
  printf("\n");
*/

  i = SCSILoad(TARGET, 0, 0, 0, 0, 0);
  printf("Unload returned %d\n -->", i);
  free(buf);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -