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

📄 freebsd.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 2 页
字号:
  const _img_private_t *p_env = p_user_data;  if (p_env->access_mode == _AM_CAM)     return run_scsi_cmd_freebsd_cam( p_user_data, i_timeout_ms, i_cdb, p_cdb, 				     e_direction, i_buf, p_buf );  else     return 2;}  /*!    Get format of track.   FIXME: We're just guessing this from the GNU/Linux code.  */static track_format_t_get_track_format_freebsd(void *p_user_data, track_t i_track) {  _img_private_t *p_env = p_user_data;  if (!p_env->gen.toc_init) read_toc_freebsd (p_user_data) ;  if (i_track > TOTAL_TRACKS || i_track == 0)    return TRACK_FORMAT_ERROR;  i_track -= FIRST_TRACK_NUM;  /* This is pretty much copied from the "badly broken" cdrom_count_tracks     in linux/cdrom.c.   */  if (p_env->tocent[i_track].entry.control & CDIO_CDROM_DATA_TRACK) {    if (p_env->tocent[i_track].address_format == CDIO_CDROM_CDI_TRACK)      return TRACK_FORMAT_CDI;    else if (p_env->tocent[i_track].address_format == CDIO_CDROM_XA_TRACK)      return TRACK_FORMAT_XA;    else      return TRACK_FORMAT_DATA;  } else    return TRACK_FORMAT_AUDIO;  }/*!  Return true if we have XA data (green, mode2 form1) or  XA data (green, mode2 form2). That is track begins:  sync - header - subheader  12     4      -  8  FIXME: there's gotta be a better design for this and get_track_format?*/static bool_get_track_green_freebsd(void *user_data, track_t i_track) {  _img_private_t *p_env = user_data;    if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1;  if (i_track > TOTAL_TRACKS+1 || i_track == 0)    return false;  /* FIXME: Dunno if this is the right way, but it's what      I was using in cdinfo for a while.   */  return ((p_env->tocent[i_track-FIRST_TRACK_NUM].entry.control & 2) != 0);}/*!    Return the starting LSN track number  i_track in obj.  Track numbers start at 1.  The "leadout" track is specified either by  using i_track LEADOUT_TRACK or the total tracks+1.  CDIO_INVALID_LBA is returned if there is no track entry.*/static lba_t_get_track_lba_freebsd(void *user_data, track_t i_track){  _img_private_t *p_env = user_data;  if (!p_env->gen.toc_init) read_toc_freebsd (p_env) ;  if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1;  if (i_track > TOTAL_TRACKS+1 || i_track == 0 || !p_env->gen.toc_init) {    return CDIO_INVALID_LBA;  } else {    return cdio_lsn_to_lba(ntohl(p_env->tocent[i_track-FIRST_TRACK_NUM].entry.addr.lba));  }}#endif /* HAVE_FREEBSD_CDROM *//*!  Return an array of strings giving possible CD devices. */char **cdio_get_devices_freebsd (void){#ifndef HAVE_FREEBSD_CDROM  return NULL;#else  char drive[40];  char **drives = NULL;  unsigned int num_drives=0;  bool exists=true;  char c;    /* Scan the system for CD-ROM drives.  */#ifdef USE_ETC_FSTAB  struct fstab *fs;  setfsent();    /* Check what's in /etc/fstab... */  while ( (fs = getfsent()) )    {      if (strncmp(fs->fs_spec, "/dev/sr", 7))	cdio_add_device_list(&drives, fs->fs_spec, &num_drives);    }  #endif  /* Scan the system for CD-ROM drives.     Not always 100% reliable, so use the USE_MNTENT code above first.  */  /* Scan SCSI and CAM devices */  for ( c='0'; exists && c <='9'; c++ ) {    sprintf(drive, "/dev/cd%c%s", c, DEVICE_POSTFIX);    exists = cdio_is_cdrom(drive, NULL);    if ( exists ) {      cdio_add_device_list(&drives, drive, &num_drives);    }  }  /* Scan are ATAPI devices */  for ( c='0'; exists && c <='9'; c++ ) {    sprintf(drive, "/dev/acd%c%s", c, DEVICE_POSTFIX);    exists = cdio_is_cdrom(drive, NULL);    if ( exists ) {      cdio_add_device_list(&drives, drive, &num_drives);    }  }  cdio_add_device_list(&drives, NULL, &num_drives);  return drives;#endif /*HAVE_FREEBSD_CDROM*/}/*!  Return a string containing the default CD device if none is specified. */char *cdio_get_default_device_freebsd(){#ifndef HAVE_FREEBSD_CDROM  return NULL;#else  char drive[40];  bool exists=true;  char c;    /* Scan the system for CD-ROM drives.  */#ifdef USE_ETC_FSTAB  struct fstab *fs;  setfsent();    /* Check what's in /etc/fstab... */  while ( (fs = getfsent()) )    {      if (strncmp(fs->fs_spec, "/dev/sr", 7))	return strdup(fs->fs_spec);    }  #endif  /* Scan the system for CD-ROM drives.     Not always 100% reliable, so use the USE_MNTENT code above first.  */  /* Scan SCSI and CAM devices */  for ( c='0'; exists && c <='9'; c++ ) {    sprintf(drive, "/dev/cd%c%s", c, DEVICE_POSTFIX);    exists = cdio_is_cdrom(drive, NULL);    if ( exists ) {      return strdup(drive);    }  }  /* Scan are ATAPI devices */  for ( c='0'; exists && c <='9'; c++ ) {    sprintf(drive, "/dev/acd%c%s", c, DEVICE_POSTFIX);    exists = cdio_is_cdrom(drive, NULL);    if ( exists ) {      return strdup(drive);    }  }  return NULL;#endif /*HAVE_FREEBSD_CDROM*/}/*!  Initialization routine. This is the only thing that doesn't  get called via a function pointer. In fact *we* are the  ones to set that up. */CdIo *cdio_open_freebsd (const char *psz_source_name){  return cdio_open_am_freebsd(psz_source_name, NULL);}/*!  Initialization routine. This is the only thing that doesn't  get called via a function pointer. In fact *we* are the  ones to set that up. */CdIo *cdio_open_am_freebsd (const char *psz_orig_source_name, 		      const char *psz_access_mode){#ifdef HAVE_FREEBSD_CDROM  CdIo *ret;  _img_private_t *_data;  char *psz_source_name;  cdio_funcs _funcs = {    .eject_media        = _eject_media_freebsd,    .free               = _free_freebsd,    .get_arg            = _get_arg_freebsd,    .get_cdtext         = get_cdtext_generic,    .get_default_device = cdio_get_default_device_freebsd,    .get_devices        = cdio_get_devices_freebsd,    .get_discmode       = get_discmode_generic,    .get_drive_cap      = get_drive_cap_freebsd,    .get_first_track_num= get_first_track_num_generic,    .get_mcn            = _get_mcn_freebsd,    .get_num_tracks     = get_num_tracks_generic,    .get_track_format   = _get_track_format_freebsd,    .get_track_green    = _get_track_green_freebsd,    .get_track_lba      = _get_track_lba_freebsd,     .get_track_msf      = NULL,    .lseek              = cdio_generic_lseek,    .read               = cdio_generic_read,    .read_audio_sectors = _read_audio_sectors_freebsd,    .read_mode2_sector  = _read_mode2_sector_freebsd,    .read_mode2_sectors = _read_mode2_sectors_freebsd,    .read_toc           = read_toc_freebsd,    .run_scsi_mmc_cmd   = run_scsi_cmd_freebsd,    .set_arg            = _set_arg_freebsd,    .stat_size          = _stat_size_freebsd  };  _data                 = _cdio_malloc (sizeof (_img_private_t));  _data->access_mode    = str_to_access_mode_freebsd(psz_access_mode);  _data->gen.init       = false;  _data->gen.fd         = -1;  _data->gen.toc_init   = false;  _data->gen.b_cdtext_init  = false;  _data->gen.b_cdtext_error = false;  if (NULL == psz_orig_source_name) {    psz_source_name=cdio_get_default_device_freebsd();    if (NULL == psz_source_name) return NULL;    _data->device  = psz_source_name;    _set_arg_freebsd(_data, "source", psz_source_name);  } else {    if (cdio_is_device_generic(psz_orig_source_name)) {      _set_arg_freebsd(_data, "source", psz_orig_source_name);      _data->device  = strdup(psz_orig_source_name);    } else {      /* The below would be okay if all device drivers worked this way. */#if 0      cdio_info ("source %s is a not a device", psz_orig_source_name);#endif      return NULL;    }  }      ret = cdio_new ((void *)_data, &_funcs);  if (ret == NULL) return NULL;  if (cdio_generic_init(_data))    if ( _data->access_mode == _AM_IOCTL ) {      return ret;    } else {      if (init_freebsd_cam(_data)) 	return ret;      else {	cdio_generic_free (_data);	return NULL;      }    }  else {    cdio_generic_free (_data);    return NULL;  }  #else   return NULL;#endif /* HAVE_FREEBSD_CDROM */}boolcdio_have_freebsd (void){#ifdef HAVE_FREEBSD_CDROM  return true;#else   return false;#endif /* HAVE_FREEBSD_CDROM */}

⌨️ 快捷键说明

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