2005-08-12 00:59:21 +04:00
/*
2008-04-10 01:17:39 +04:00
* cdrom_id - optical drive and media information prober
2005-08-12 00:59:21 +04:00
*
2008-04-10 01:17:39 +04:00
* Copyright ( C ) 2008 Kay Sievers < kay . sievers @ vrfy . org >
2005-08-12 00:59:21 +04:00
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2 of the License .
*
2008-04-10 01:17:39 +04:00
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
2005-08-12 00:59:21 +04:00
*/
# ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
# endif
# include <stdio.h>
2008-04-10 01:17:39 +04:00
# include <stddef.h>
2005-08-12 00:59:21 +04:00
# include <stdlib.h>
# include <unistd.h>
2006-01-09 23:18:00 +03:00
# include <string.h>
2008-04-10 01:17:39 +04:00
# include <limits.h>
# include <fcntl.h>
2005-08-12 00:59:21 +04:00
# include <errno.h>
2008-04-10 01:17:39 +04:00
# include <getopt.h>
# include <scsi/sg.h>
2005-08-12 00:59:21 +04:00
# include <sys/types.h>
# include <sys/stat.h>
2008-04-10 01:17:39 +04:00
# include <sys/time.h>
# include <sys/ioctl.h>
# include <linux/cdrom.h>
2008-07-30 03:45:23 +04:00
# include "../../udev/udev.h"
2005-08-12 00:59:21 +04:00
2008-04-10 01:17:39 +04:00
# ifndef ARRAY_SIZE
# define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
# endif
static int debug ;
2005-08-12 22:37:56 +04:00
2005-08-12 00:59:21 +04:00
# ifdef USE_LOG
void log_message ( int priority , const char * format , . . . )
{
va_list args ;
static int udev_log = - 1 ;
if ( udev_log = = - 1 ) {
const char * value ;
value = getenv ( " UDEV_LOG " ) ;
if ( value )
udev_log = log_priority ( value ) ;
else
udev_log = LOG_ERR ;
2008-04-10 01:17:39 +04:00
if ( debug & & udev_log < LOG_INFO )
udev_log = LOG_INFO ;
2005-08-12 00:59:21 +04:00
}
if ( priority > udev_log )
return ;
va_start ( args , format ) ;
2008-04-10 01:17:39 +04:00
if ( debug ) {
fprintf ( stderr , " [%d] " , ( int ) getpid ( ) ) ;
vfprintf ( stderr , format , args ) ;
} else
vsyslog ( priority , format , args ) ;
2005-08-12 00:59:21 +04:00
va_end ( args ) ;
}
# endif
2008-04-10 01:17:39 +04:00
/* device info */
static unsigned int cd_cd_rom ;
static unsigned int cd_cd_r ;
static unsigned int cd_cd_rw ;
static unsigned int cd_dvd_rom ;
static unsigned int cd_dvd_r ;
static unsigned int cd_dvd_rw ;
static unsigned int cd_dvd_ram ;
static unsigned int cd_dvd_plus_r ;
static unsigned int cd_dvd_plus_rw ;
static unsigned int cd_dvd_plus_r_dl ;
static unsigned int cd_dvd_plus_rw_dl ;
static unsigned int cd_bd ;
static unsigned int cd_bd_r ;
static unsigned int cd_bd_re ;
static unsigned int cd_hddvd ;
static unsigned int cd_hddvd_r ;
static unsigned int cd_hddvd_rw ;
static unsigned int cd_mo ;
static unsigned int cd_mrw ;
static unsigned int cd_mrw_w ;
/* media info */
static unsigned int cd_media_cd_rom ;
static unsigned int cd_media_cd_r ;
static unsigned int cd_media_cd_rw ;
static unsigned int cd_media_dvd_rom ;
static unsigned int cd_media_dvd_r ;
static unsigned int cd_media_dvd_rw ;
static unsigned int cd_media_dvd_ram ;
static unsigned int cd_media_dvd_plus_r ;
static unsigned int cd_media_dvd_plus_rw ;
static unsigned int cd_media_dvd_plus_r_dl ;
static unsigned int cd_media_dvd_plus_rw_dl ;
static unsigned int cd_media_bd ;
static unsigned int cd_media_bd_r ;
static unsigned int cd_media_bd_re ;
static unsigned int cd_media_hddvd ;
static unsigned int cd_media_hddvd_r ;
static unsigned int cd_media_hddvd_rw ;
static unsigned int cd_media_mo ;
static unsigned int cd_media_mrw ;
static unsigned int cd_media_mrw_w ;
static const char * cd_media_state ;
static unsigned int cd_media_session_next ;
static unsigned int cd_media_session_count ;
static unsigned int cd_media_track_count ;
2008-06-12 01:24:13 +04:00
static unsigned int cd_media_track_count_data ;
static unsigned int cd_media_track_count_audio ;
2008-04-10 01:17:39 +04:00
static unsigned long long int cd_media_session_last_offset ;
# define ERRCODE(s) ((((s)[2] & 0x0F) << 16) | ((s)[12] << 8) | ((s)[13]))
# define SK(errcode) (((errcode) >> 16) & 0xF)
# define ASC(errcode) (((errcode) >> 8) & 0xFF)
# define ASCQ(errcode) ((errcode) & 0xFF)
static void info_scsi_cmd_err ( const char * cmd , int err )
{
if ( err = = - 1 ) {
2008-04-20 23:07:06 +04:00
info ( " %s failed \n " , cmd ) ;
2008-04-10 01:17:39 +04:00
return ;
}
2008-04-20 23:07:06 +04:00
info ( " %s failed with SK=%Xh/ASC=%02Xh/ACQ=%02Xh \n " , cmd , SK ( err ) , ASC ( err ) , ASCQ ( err ) ) ;
2008-04-10 01:17:39 +04:00
}
struct scsi_cmd {
struct cdrom_generic_command cgc ;
union {
struct request_sense s ;
unsigned char u [ 18 ] ;
} _sense ;
struct sg_io_hdr sg_io ;
} ;
static void scsi_cmd_set ( struct scsi_cmd * cmd , size_t i , int arg )
{
if ( i = = 0 ) {
memset ( cmd , 0x00 , sizeof ( struct scsi_cmd ) ) ;
cmd - > cgc . quiet = 1 ;
cmd - > cgc . sense = & cmd - > _sense . s ;
memset ( & cmd - > sg_io , 0 , sizeof ( cmd - > sg_io ) ) ;
cmd - > sg_io . interface_id = ' S ' ;
cmd - > sg_io . mx_sb_len = sizeof ( cmd - > _sense ) ;
cmd - > sg_io . cmdp = cmd - > cgc . cmd ;
cmd - > sg_io . sbp = cmd - > _sense . u ;
cmd - > sg_io . flags = SG_FLAG_LUN_INHIBIT | SG_FLAG_DIRECT_IO ;
}
cmd - > sg_io . cmd_len = i + 1 ;
cmd - > cgc . cmd [ i ] = arg ;
}
# define CHECK_CONDITION 0x01
static int scsi_cmd_run ( struct scsi_cmd * cmd , int fd , unsigned char * buf , size_t bufsize )
{
int ret = 0 ;
cmd - > sg_io . dxferp = buf ;
cmd - > sg_io . dxfer_len = bufsize ;
cmd - > sg_io . dxfer_direction = SG_DXFER_FROM_DEV ;
if ( ioctl ( fd , SG_IO , & cmd - > sg_io ) )
return - 1 ;
if ( ( cmd - > sg_io . info & SG_INFO_OK_MASK ) ! = SG_INFO_OK ) {
errno = EIO ;
ret = - 1 ;
if ( cmd - > sg_io . masked_status & CHECK_CONDITION ) {
ret = ERRCODE ( cmd - > _sense . u ) ;
if ( ret = = 0 )
ret = - 1 ;
}
}
return ret ;
}
static int cd_capability_compat ( int fd )
{
int capabilty ;
capabilty = ioctl ( fd , CDROM_GET_CAPABILITY , NULL ) ;
if ( capabilty < 0 ) {
2008-04-20 23:07:06 +04:00
info ( " CDROM_GET_CAPABILITY failed \n " ) ;
2008-04-10 01:17:39 +04:00
return - 1 ;
}
if ( capabilty & CDC_CD_R )
cd_cd_r = 1 ;
if ( capabilty & CDC_CD_RW )
cd_cd_rw = 1 ;
if ( capabilty & CDC_DVD )
cd_dvd_rom = 1 ;
if ( capabilty & CDC_DVD_R )
cd_dvd_r = 1 ;
if ( capabilty & CDC_DVD_RAM )
cd_dvd_ram = 1 ;
if ( capabilty & CDC_MRW )
cd_mrw = 1 ;
if ( capabilty & CDC_MRW_W )
cd_mrw_w = 1 ;
return 0 ;
}
static int cd_inquiry ( int fd ) {
struct scsi_cmd sc ;
unsigned char inq [ 128 ] ;
int err ;
scsi_cmd_set ( & sc , 0 , 0x12 ) ;
scsi_cmd_set ( & sc , 4 , 36 ) ;
scsi_cmd_set ( & sc , 5 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , inq , 36 ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " INQUIRY " , err ) ;
return - 1 ;
}
if ( ( inq [ 0 ] & 0x1F ) ! = 5 ) {
2008-04-20 23:07:06 +04:00
info ( " not an MMC unit \n " ) ;
2008-04-10 01:17:39 +04:00
return - 1 ;
}
2008-04-20 23:07:06 +04:00
info ( " INQUIRY: [%.8s][%.16s][%.4s] \n " , inq + 8 , inq + 16 , inq + 32 ) ;
2008-04-10 01:17:39 +04:00
return 0 ;
}
static int cd_profiles ( int fd )
{
struct scsi_cmd sc ;
unsigned char header [ 8 ] ;
unsigned char profiles [ 512 ] ;
unsigned int cur_profile ;
unsigned int len ;
unsigned int i ;
int err ;
scsi_cmd_set ( & sc , 0 , 0x46 ) ;
scsi_cmd_set ( & sc , 1 , 0 ) ;
scsi_cmd_set ( & sc , 8 , sizeof ( header ) ) ;
scsi_cmd_set ( & sc , 9 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , header , sizeof ( header ) ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " GET CONFIGURATION " , err ) ;
return - 1 ;
}
len = 4 + ( header [ 0 ] < < 24 | header [ 1 ] < < 16 | header [ 2 ] < < 8 | header [ 3 ] ) ;
2008-04-20 23:07:06 +04:00
info ( " GET CONFIGURATION: number of profiles %i \n " , len ) ;
2008-04-10 01:17:39 +04:00
if ( len > sizeof ( profiles ) ) {
2008-04-20 23:07:06 +04:00
info ( " invalid number of profiles \n " ) ;
2008-04-10 01:17:39 +04:00
return - 1 ;
}
scsi_cmd_set ( & sc , 0 , 0x46 ) ;
scsi_cmd_set ( & sc , 1 , 1 ) ;
scsi_cmd_set ( & sc , 6 , len > > 16 ) ;
scsi_cmd_set ( & sc , 7 , len > > 8 ) ;
scsi_cmd_set ( & sc , 8 , len ) ;
scsi_cmd_set ( & sc , 9 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , profiles , len ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " GET CONFIGURATION " , err ) ;
return - 1 ;
}
/* device profiles */
for ( i = 12 ; i < profiles [ 11 ] ; i + = 4 ) {
unsigned int profile = ( profiles [ i ] < < 8 | profiles [ i + 1 ] ) ;
if ( profile = = 0 )
continue ;
2008-04-20 23:07:06 +04:00
info ( " profile 0x%02x \n " , profile ) ;
2008-04-10 01:17:39 +04:00
switch ( profile ) {
case 0x03 :
case 0x04 :
case 0x05 :
cd_mo = 1 ;
break ;
case 0x10 :
cd_dvd_rom = 1 ;
break ;
case 0x12 :
cd_dvd_ram = 1 ;
break ;
case 0x13 :
case 0x14 :
cd_dvd_rw = 1 ;
break ;
case 0x1B :
cd_dvd_plus_r = 1 ;
break ;
case 0x1A :
cd_dvd_plus_rw = 1 ;
break ;
case 0x2A :
cd_dvd_plus_rw_dl = 1 ;
break ;
case 0x2B :
cd_dvd_plus_r_dl = 1 ;
break ;
case 0x40 :
cd_bd = 1 ;
break ;
case 0x41 :
case 0x42 :
cd_bd_r = 1 ;
break ;
case 0x43 :
cd_bd_re = 1 ;
break ;
case 0x50 :
cd_hddvd = 1 ;
break ;
case 0x51 :
cd_hddvd_r = 1 ;
break ;
case 0x52 :
cd_hddvd_rw = 1 ;
break ;
default :
break ;
}
}
/* current media profile */
cur_profile = header [ 6 ] < < 8 | header [ 7 ] ;
2008-04-20 23:07:06 +04:00
info ( " current profile 0x%02x \n " , cur_profile ) ;
2008-04-10 01:17:39 +04:00
if ( cur_profile = = 0 ) {
2008-04-20 23:07:06 +04:00
info ( " no current profile, assuming no media \n " ) ;
2008-04-10 01:17:39 +04:00
return - 1 ;
}
switch ( cur_profile ) {
case 0x03 :
case 0x04 :
case 0x05 :
cd_media_mo = 1 ;
break ;
case 0x08 :
cd_media_cd_rom = 1 ;
break ;
case 0x09 :
cd_media_cd_r = 1 ;
break ;
case 0x0a :
cd_media_cd_rw = 1 ;
break ;
case 0x10 :
cd_media_dvd_rom = 1 ;
break ;
case 0x11 :
cd_media_dvd_r = 1 ;
break ;
case 0x12 :
cd_media_dvd_ram = 1 ;
break ;
case 0x13 :
case 0x14 :
cd_media_dvd_rw = 1 ;
break ;
case 0x1B :
cd_media_dvd_plus_r = 1 ;
break ;
case 0x1A :
cd_media_dvd_plus_rw = 1 ;
break ;
case 0x2A :
cd_media_dvd_plus_rw_dl = 1 ;
break ;
case 0x2B :
cd_media_dvd_plus_r_dl = 1 ;
break ;
case 0x40 :
cd_media_bd = 1 ;
break ;
case 0x41 :
case 0x42 :
cd_media_bd_r = 1 ;
break ;
case 0x43 :
cd_media_bd_re = 1 ;
break ;
case 0x50 :
cd_media_hddvd = 1 ;
break ;
case 0x51 :
cd_media_hddvd_r = 1 ;
break ;
case 0x52 :
cd_media_hddvd_rw = 1 ;
break ;
default :
break ;
}
return 0 ;
}
static int cd_media_info ( int fd )
{
struct scsi_cmd sc ;
unsigned char header [ 32 ] ;
static const char * media_status [ ] = {
" blank " ,
" appendable " ,
" complete " ,
" other "
} ;
int err ;
scsi_cmd_set ( & sc , 0 , 0x51 ) ;
scsi_cmd_set ( & sc , 8 , sizeof ( header ) ) ;
scsi_cmd_set ( & sc , 9 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , header , sizeof ( header ) ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " READ DISC INFORMATION " , err ) ;
return - 1 ;
} ;
2008-04-20 23:07:06 +04:00
info ( " disk type %02x \n " , header [ 8 ] ) ;
2008-04-10 01:17:39 +04:00
if ( ( header [ 2 ] & 3 ) < 4 )
cd_media_state = media_status [ header [ 2 ] & 3 ] ;
if ( ( header [ 2 ] & 3 ) ! = 2 )
cd_media_session_next = header [ 10 ] < < 8 | header [ 5 ] ;
cd_media_session_count = header [ 9 ] < < 8 | header [ 4 ] ;
cd_media_track_count = header [ 11 ] < < 8 | header [ 6 ] ;
return 0 ;
}
static int cd_media_toc ( int fd )
{
struct scsi_cmd sc ;
unsigned char header [ 12 ] ;
unsigned char toc [ 2048 ] ;
unsigned int len , i ;
unsigned char * p ;
int err ;
scsi_cmd_set ( & sc , 0 , 0x43 ) ;
scsi_cmd_set ( & sc , 6 , 1 ) ;
scsi_cmd_set ( & sc , 8 , sizeof ( header ) ) ;
scsi_cmd_set ( & sc , 9 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , header , sizeof ( header ) ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " READ TOC " , err ) ;
return - 1 ;
}
len = ( header [ 0 ] < < 8 | header [ 1 ] ) + 2 ;
2008-04-20 23:07:06 +04:00
info ( " READ TOC: len: %d \n " , len ) ;
2008-04-10 01:17:39 +04:00
if ( len > sizeof ( toc ) )
return - 1 ;
2008-06-12 09:20:14 +04:00
if ( len < 2 )
2008-05-14 18:03:49 +04:00
return - 1 ;
2008-04-10 01:17:39 +04:00
2008-06-12 09:20:14 +04:00
/* empty media has no tracks */
if ( len < 8 )
return 0 ;
2008-04-10 01:17:39 +04:00
scsi_cmd_set ( & sc , 0 , 0x43 ) ;
scsi_cmd_set ( & sc , 6 , header [ 2 ] ) ; /* First Track/Session Number */
scsi_cmd_set ( & sc , 7 , len > > 8 ) ;
scsi_cmd_set ( & sc , 8 , len ) ;
scsi_cmd_set ( & sc , 9 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , toc , len ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " READ TOC (tracks) " , err ) ;
return - 1 ;
}
for ( p = toc + 4 , i = 4 ; i < len - 8 ; i + = 8 , p + = 8 ) {
unsigned int block ;
2008-06-12 01:24:13 +04:00
unsigned int is_data_track ;
is_data_track = ( p [ 1 ] & 0x04 ) ! = 0 ;
2008-04-10 01:17:39 +04:00
block = p [ 4 ] < < 24 | p [ 5 ] < < 16 | p [ 6 ] < < 8 | p [ 7 ] ;
2008-06-12 01:24:13 +04:00
info ( " track=%u info=0x%x(%s) start_block=%u \n " ,
p [ 2 ] , p [ 1 ] & 0x0f , is_data_track ? " data " : " audio " , block ) ;
if ( is_data_track )
cd_media_track_count_data + + ;
else
cd_media_track_count_audio + + ;
2008-04-10 01:17:39 +04:00
}
scsi_cmd_set ( & sc , 0 , 0x43 ) ;
scsi_cmd_set ( & sc , 2 , 1 ) ; /* Session Info */
scsi_cmd_set ( & sc , 8 , 12 ) ;
scsi_cmd_set ( & sc , 9 , 0 ) ;
err = scsi_cmd_run ( & sc , fd , header , sizeof ( header ) ) ;
if ( ( err < 0 ) ) {
info_scsi_cmd_err ( " READ TOC (multi session) " , err ) ;
return - 1 ;
}
len = header [ 4 + 4 ] < < 24 | header [ 4 + 5 ] < < 16 | header [ 4 + 6 ] < < 8 | header [ 4 + 7 ] ;
2008-04-20 23:07:06 +04:00
info ( " last track %u starts at block %u \n " , header [ 4 + 2 ] , len ) ;
2008-04-10 01:17:39 +04:00
cd_media_session_last_offset = ( unsigned long long int ) len * 2048 ;
return 0 ;
}
2005-08-12 00:59:21 +04:00
int main ( int argc , char * argv [ ] )
{
2008-04-10 01:17:39 +04:00
static const struct option options [ ] = {
{ " export " , 0 , NULL , ' x ' } ,
{ " debug " , 0 , NULL , ' d ' } ,
{ " help " , 0 , NULL , ' h ' } ,
{ }
} ;
2005-08-12 00:59:21 +04:00
const char * node = NULL ;
int export = 0 ;
2008-04-10 01:17:39 +04:00
int fd = - 1 ;
2005-08-12 00:59:21 +04:00
int rc = 0 ;
logging_init ( " cdrom_id " ) ;
2008-04-10 01:17:39 +04:00
while ( 1 ) {
int option ;
2005-08-12 00:59:21 +04:00
2008-04-10 01:17:39 +04:00
option = getopt_long ( argc , argv , " dxh " , options , NULL ) ;
if ( option = = - 1 )
break ;
switch ( option ) {
case ' d ' :
debug = 1 ;
break ;
case ' x ' :
2005-08-12 00:59:21 +04:00
export = 1 ;
2008-04-10 01:17:39 +04:00
break ;
case ' h ' :
printf ( " Usage: cdrom_id [options] <device> \n "
2008-04-21 19:41:39 +04:00
" --export export key/value pairs \n "
" --debug debug to stderr \n "
" --help print this help text \n \n " ) ;
2008-04-10 01:17:39 +04:00
goto exit ;
default :
rc = 1 ;
goto exit ;
}
2005-08-12 00:59:21 +04:00
}
2008-04-10 01:17:39 +04:00
node = argv [ optind ] ;
2005-08-12 00:59:21 +04:00
if ( ! node ) {
2008-04-20 23:07:06 +04:00
err ( " no device \n " ) ;
2008-04-10 01:17:39 +04:00
fprintf ( stderr , " no device \n " ) ;
2005-08-12 00:59:21 +04:00
rc = 1 ;
goto exit ;
}
2008-04-10 01:17:39 +04:00
fd = open ( node , O_RDONLY | O_NONBLOCK ) ;
2005-08-12 00:59:21 +04:00
if ( fd < 0 ) {
2008-04-20 23:07:06 +04:00
info ( " unable to open '%s' \n " , node ) ;
2005-08-12 00:59:21 +04:00
rc = 1 ;
goto exit ;
}
2008-04-20 23:07:06 +04:00
info ( " probing: '%s' \n " , node ) ;
2008-04-10 01:17:39 +04:00
/* same data as original cdrom_id */
if ( cd_capability_compat ( fd ) < 0 ) {
rc = 1 ;
goto exit ;
}
2005-08-12 00:59:21 +04:00
2008-04-10 01:17:39 +04:00
/* check drive */
if ( cd_inquiry ( fd ) < 0 ) {
rc = 2 ;
goto exit ;
2005-08-12 00:59:21 +04:00
}
2008-04-10 01:17:39 +04:00
/* read drive and possibly current profile */
if ( cd_profiles ( fd ) < 0 )
goto print ;
/* get session/track info */
if ( cd_media_toc ( fd ) < 0 )
goto print ;
2005-08-12 00:59:21 +04:00
2008-04-10 01:17:39 +04:00
/* get writable media state */
if ( cd_media_info ( fd ) < 0 )
goto print ;
print :
printf ( " ID_CDROM=1 \n " ) ;
if ( cd_cd_rom )
printf ( " ID_CDROM_CD=1 \n " ) ;
if ( cd_cd_r )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_CD_R=1 \n " ) ;
2008-04-10 01:17:39 +04:00
if ( cd_cd_rw )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_CD_RW=1 \n " ) ;
2008-04-10 01:17:39 +04:00
if ( cd_dvd_rom )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_DVD=1 \n " ) ;
2008-04-10 01:17:39 +04:00
if ( cd_dvd_r )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_DVD_R=1 \n " ) ;
2008-04-10 01:17:39 +04:00
if ( cd_dvd_rw )
printf ( " ID_CDROM_DVD_RW=1 \n " ) ;
if ( cd_dvd_ram )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_DVD_RAM=1 \n " ) ;
2008-04-10 01:17:39 +04:00
if ( cd_dvd_plus_r )
printf ( " ID_CDROM_DVD_PLUS_R=1 \n " ) ;
if ( cd_dvd_plus_rw )
printf ( " ID_CDROM_DVD_PLUS_RW=1 \n " ) ;
if ( cd_dvd_plus_r_dl )
printf ( " ID_CDROM_DVD_PLUS_R_DL=1 \n " ) ;
if ( cd_dvd_plus_rw_dl )
printf ( " ID_CDROM_DVD_PLUS_RW_DL=1 \n " ) ;
if ( cd_bd )
printf ( " ID_CDROM_BD=1 \n " ) ;
if ( cd_bd_r )
printf ( " ID_CDROM_BD_R=1 \n " ) ;
if ( cd_bd_re )
printf ( " ID_CDROM_BD_RE=1 \n " ) ;
if ( cd_hddvd )
printf ( " ID_CDROM_HDDVD=1 \n " ) ;
if ( cd_hddvd_r )
printf ( " ID_CDROM_HDDVD_R=1 \n " ) ;
if ( cd_hddvd_rw )
printf ( " ID_CDROM_HDDVD_RW=1 \n " ) ;
if ( cd_mo )
printf ( " ID_CDROM_MO=1 \n " ) ;
if ( cd_mrw )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_MRW=1 \n " ) ;
2008-04-10 01:17:39 +04:00
if ( cd_mrw_w )
2005-08-12 01:04:24 +04:00
printf ( " ID_CDROM_MRW_W=1 \n " ) ;
2005-08-12 01:38:33 +04:00
2008-04-10 01:17:39 +04:00
if ( cd_media_mo )
printf ( " ID_CDROM_MEDIA_MO=1 \n " ) ;
if ( cd_media_mrw )
printf ( " ID_CDROM_MEDIA_MRW=1 \n " ) ;
if ( cd_media_mrw_w )
printf ( " ID_CDROM_MEDIA_MRW_W=1 \n " ) ;
if ( cd_media_cd_rom )
printf ( " ID_CDROM_MEDIA_CD=1 \n " ) ;
if ( cd_media_cd_r )
printf ( " ID_CDROM_MEDIA_CD_R=1 \n " ) ;
if ( cd_media_cd_rw )
printf ( " ID_CDROM_MEDIA_CD_RW=1 \n " ) ;
if ( cd_media_dvd_rom )
printf ( " ID_CDROM_MEDIA_DVD=1 \n " ) ;
if ( cd_media_dvd_r )
printf ( " ID_CDROM_MEDIA_DVD_R=1 \n " ) ;
if ( cd_media_dvd_ram )
printf ( " ID_CDROM_MEDIA_DVD_RAM=1 \n " ) ;
if ( cd_media_dvd_rw )
printf ( " ID_CDROM_MEDIA_DVD_RW=1 \n " ) ;
if ( cd_media_dvd_plus_r )
printf ( " ID_CDROM_MEDIA_DVD_PLUS_R=1 \n " ) ;
if ( cd_media_dvd_plus_rw )
printf ( " ID_CDROM_MEDIA_DVD_PLUS_RW=1 \n " ) ;
if ( cd_media_dvd_plus_rw_dl )
printf ( " ID_CDROM_MEDIA_DVD_PLUS_RW_DL=1 \n " ) ;
if ( cd_media_dvd_plus_r_dl )
printf ( " ID_CDROM_MEDIA_DVD_PLUS_R_DL=1 \n " ) ;
if ( cd_media_bd )
printf ( " ID_CDROM_MEDIA_BD=1 \n " ) ;
if ( cd_media_bd_r )
printf ( " ID_CDROM_MEDIA_BD_R=1 \n " ) ;
if ( cd_media_bd_re )
printf ( " ID_CDROM_MEDIA_BD_RE=1 \n " ) ;
if ( cd_media_hddvd )
printf ( " ID_CDROM_MEDIA_HDDVD=1 \n " ) ;
if ( cd_media_hddvd_r )
printf ( " ID_CDROM_MEDIA_HDDVD_R=1 \n " ) ;
if ( cd_media_hddvd_rw )
printf ( " ID_CDROM_MEDIA_HDDVD_RW=1 \n " ) ;
if ( cd_media_state ! = NULL )
printf ( " ID_CDROM_MEDIA_STATE=%s \n " , cd_media_state ) ;
if ( cd_media_session_next > 0 )
printf ( " ID_CDROM_MEDIA_SESSION_NEXT=%d \n " , cd_media_session_next ) ;
if ( cd_media_session_count > 0 )
printf ( " ID_CDROM_MEDIA_SESSION_COUNT=%d \n " , cd_media_session_count ) ;
if ( cd_media_track_count > 0 )
printf ( " ID_CDROM_MEDIA_TRACK_COUNT=%d \n " , cd_media_track_count ) ;
2008-08-22 12:04:55 +04:00
if ( cd_media_track_count_audio > 0 )
2008-06-12 01:24:13 +04:00
printf ( " ID_CDROM_MEDIA_TRACK_COUNT_AUDIO=%d \n " , cd_media_track_count_audio ) ;
2008-08-22 12:04:55 +04:00
if ( cd_media_track_count_data > 0 )
2008-06-12 01:24:13 +04:00
printf ( " ID_CDROM_MEDIA_TRACK_COUNT_DATA=%d \n " , cd_media_track_count_data ) ;
2008-08-22 12:04:55 +04:00
if ( cd_media_session_last_offset > 0 )
2008-04-10 01:17:39 +04:00
printf ( " ID_CDROM_MEDIA_SESSION_LAST_OFFSET=%llu \n " , cd_media_session_last_offset ) ;
2005-08-12 00:59:21 +04:00
exit :
2008-04-10 01:17:39 +04:00
if ( fd > = 0 )
close ( fd ) ;
2005-08-12 00:59:21 +04:00
logging_close ( ) ;
return rc ;
}
2008-04-10 01:17:39 +04:00