Beispiel #1
0
driver_return_code_t
read_mode2_sector_freebsd_cam (_img_private_t *p_env, void *data, lsn_t lsn, 
			       bool b_form2)
{
  if ( b_form2 )
    return read_mode2_sectors_freebsd_cam(p_env, data, lsn, 1);
  else {
    /* Need to pick out the data portion from a mode2 form2 frame */
    char buf[M2RAW_SECTOR_SIZE] = { 0, };
    int retval = read_mode2_sectors_freebsd_cam(p_env, buf, lsn, 1);
    if ( retval ) return retval;
    memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE);
    return DRIVER_OP_SUCCESS;
  }
}
Beispiel #2
0
/*!
   Reads i_blocks of mode2 sectors from cd device into data starting
   from lsn.
 */
static driver_return_code_t
read_mode2_sectors_freebsd (void *p_user_data, void *p_data, lsn_t i_lsn,
			    bool b_form2, unsigned int i_blocks)
{
  _img_private_t *p_env = p_user_data;

  if ( (p_env->access_mode == _AM_CAM ||
	p_env->access_mode == _AM_MMC_RDWR ||
	p_env->access_mode == _AM_MMC_RDWR_EXCL)
       && b_form2 ) {
    /* We have a routine that covers this case without looping. */
    return read_mode2_sectors_freebsd_cam(p_env, p_data, i_lsn, i_blocks);
  } else {
    unsigned int i;
    uint16_t i_blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE;

    /* For each frame, pick out the data part we need */
    for (i = 0; i < i_blocks; i++) {
      int retval = read_mode2_sector_freebsd (p_env,
					       ((char *)p_data) +
					       (i_blocksize * i),
					       i_lsn + i, b_form2);
      if (retval) return retval;
    }
  }
  return DRIVER_OP_SUCCESS;
}