1*f1880105Sjsg /* $OpenBSD: cdio.h,v 1.17 2017/10/24 09:36:13 jsg Exp $ */ 261c17101Sbriggs /* $NetBSD: cdio.h,v 1.11 1996/02/19 18:29:04 scottr Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt #ifndef _SYS_CDIO_H_ 5df930be7Sderaadt #define _SYS_CDIO_H_ 6df930be7Sderaadt 771b3c6bbSangelos #include <sys/types.h> 871b3c6bbSangelos #include <sys/ioccom.h> 971b3c6bbSangelos 10df930be7Sderaadt /* Shared between kernel & process */ 11df930be7Sderaadt 1244470ae7Sderaadt union msf_lba { 1344470ae7Sderaadt struct { 1444470ae7Sderaadt u_char unused; 1544470ae7Sderaadt u_char minute; 1644470ae7Sderaadt u_char second; 1744470ae7Sderaadt u_char frame; 1844470ae7Sderaadt } msf; 1976fd3256Scsapuntz u_int32_t lba; 2044470ae7Sderaadt u_char addr[4]; 2144470ae7Sderaadt }; 2244470ae7Sderaadt 23df930be7Sderaadt struct cd_toc_entry { 24df930be7Sderaadt u_char nothing1; 25e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 269e04eb1aSderaadt u_int control:4; 279e04eb1aSderaadt u_int addr_type:4; 2861c17101Sbriggs #endif 29e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 309e04eb1aSderaadt u_int addr_type:4; 319e04eb1aSderaadt u_int control:4; 3261c17101Sbriggs #endif 33df930be7Sderaadt u_char track; 34df930be7Sderaadt u_char nothing2; 3544470ae7Sderaadt union msf_lba addr; 36df930be7Sderaadt }; 37df930be7Sderaadt 38df930be7Sderaadt struct cd_sub_channel_header { 39df930be7Sderaadt u_char nothing1; 40df930be7Sderaadt u_char audio_status; 41df930be7Sderaadt #define CD_AS_AUDIO_INVALID 0x00 42df930be7Sderaadt #define CD_AS_PLAY_IN_PROGRESS 0x11 43df930be7Sderaadt #define CD_AS_PLAY_PAUSED 0x12 44df930be7Sderaadt #define CD_AS_PLAY_COMPLETED 0x13 45df930be7Sderaadt #define CD_AS_PLAY_ERROR 0x14 46df930be7Sderaadt #define CD_AS_NO_STATUS 0x15 47df930be7Sderaadt u_char data_len[2]; 48df930be7Sderaadt }; 49df930be7Sderaadt 509881dce0Sderaadt struct cd_sub_channel_q_data { 519881dce0Sderaadt u_char data_format; 52e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 539e04eb1aSderaadt u_int control:4; 549e04eb1aSderaadt u_int addr_type:4; 559881dce0Sderaadt #endif 56e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 579e04eb1aSderaadt u_int addr_type:4; 589e04eb1aSderaadt u_int control:4; 599881dce0Sderaadt #endif 609881dce0Sderaadt u_char track_number; 619881dce0Sderaadt u_char index_number; 629881dce0Sderaadt u_char absaddr[4]; 639881dce0Sderaadt u_char reladdr[4]; 64e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 659e04eb1aSderaadt u_int :7; 669e04eb1aSderaadt u_int mc_valid:1; 679881dce0Sderaadt #endif 68e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 699e04eb1aSderaadt u_int mc_valid:1; 709e04eb1aSderaadt u_int :7; 719881dce0Sderaadt #endif 729881dce0Sderaadt u_char mc_number[15]; 73e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 749e04eb1aSderaadt u_int :7; 759e04eb1aSderaadt u_int ti_valid:1; 769881dce0Sderaadt #endif 77e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 789e04eb1aSderaadt u_int ti_valid:1; 799e04eb1aSderaadt u_int :7; 809881dce0Sderaadt #endif 819881dce0Sderaadt u_char ti_number[15]; 829881dce0Sderaadt }; 839881dce0Sderaadt 84df930be7Sderaadt struct cd_sub_channel_position_data { 85df930be7Sderaadt u_char data_format; 86e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 879e04eb1aSderaadt u_int control:4; 889e04eb1aSderaadt u_int addr_type:4; 8961c17101Sbriggs #endif 90e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 919e04eb1aSderaadt u_int addr_type:4; 929e04eb1aSderaadt u_int control:4; 9361c17101Sbriggs #endif 94df930be7Sderaadt u_char track_number; 95df930be7Sderaadt u_char index_number; 9644470ae7Sderaadt union msf_lba absaddr; 9744470ae7Sderaadt union msf_lba reladdr; 98df930be7Sderaadt }; 99df930be7Sderaadt 100df930be7Sderaadt struct cd_sub_channel_media_catalog { 101df930be7Sderaadt u_char data_format; 102df930be7Sderaadt u_char nothing1; 103df930be7Sderaadt u_char nothing2; 104df930be7Sderaadt u_char nothing3; 105e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 1069e04eb1aSderaadt u_int :7; 1079e04eb1aSderaadt u_int mc_valid:1; 10861c17101Sbriggs #endif 109e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 1109e04eb1aSderaadt u_int mc_valid:1; 1119e04eb1aSderaadt u_int :7; 11261c17101Sbriggs #endif 113df930be7Sderaadt u_char mc_number[15]; 114df930be7Sderaadt }; 115df930be7Sderaadt 116df930be7Sderaadt struct cd_sub_channel_track_info { 117df930be7Sderaadt u_char data_format; 118df930be7Sderaadt u_char nothing1; 119df930be7Sderaadt u_char track_number; 120df930be7Sderaadt u_char nothing2; 121e9bf9556Stedu #if _BYTE_ORDER == _LITTLE_ENDIAN 1229e04eb1aSderaadt u_int :7; 1239e04eb1aSderaadt u_int ti_valid:1; 12461c17101Sbriggs #endif 125e9bf9556Stedu #if _BYTE_ORDER == _BIG_ENDIAN 1269e04eb1aSderaadt u_int ti_valid:1; 1279e04eb1aSderaadt u_int :7; 12861c17101Sbriggs #endif 129df930be7Sderaadt u_char ti_number[15]; 130df930be7Sderaadt }; 131df930be7Sderaadt 132df930be7Sderaadt struct cd_sub_channel_info { 133df930be7Sderaadt struct cd_sub_channel_header header; 134df930be7Sderaadt union { 13576fd3256Scsapuntz struct cd_sub_channel_q_data q_data; 136df930be7Sderaadt struct cd_sub_channel_position_data position; 137df930be7Sderaadt struct cd_sub_channel_media_catalog media_catalog; 138df930be7Sderaadt struct cd_sub_channel_track_info track_info; 139df930be7Sderaadt } what; 140df930be7Sderaadt }; 141df930be7Sderaadt 142df930be7Sderaadt /* 143df930be7Sderaadt * Ioctls for the CD drive 144df930be7Sderaadt */ 145df930be7Sderaadt struct ioc_play_track { 146df930be7Sderaadt u_char start_track; 147df930be7Sderaadt u_char start_index; 148df930be7Sderaadt u_char end_track; 149df930be7Sderaadt u_char end_index; 150df930be7Sderaadt }; 151df930be7Sderaadt 152df930be7Sderaadt #define CDIOCPLAYTRACKS _IOW('c', 1, struct ioc_play_track) 153df930be7Sderaadt struct ioc_play_blocks { 154df930be7Sderaadt int blk; 155df930be7Sderaadt int len; 156df930be7Sderaadt }; 157df930be7Sderaadt #define CDIOCPLAYBLOCKS _IOW('c', 2, struct ioc_play_blocks) 158df930be7Sderaadt 159df930be7Sderaadt struct ioc_read_subchannel { 160df930be7Sderaadt u_char address_format; 161df930be7Sderaadt #define CD_LBA_FORMAT 1 162df930be7Sderaadt #define CD_MSF_FORMAT 2 163df930be7Sderaadt u_char data_format; 164df930be7Sderaadt #define CD_SUBQ_DATA 0 165df930be7Sderaadt #define CD_CURRENT_POSITION 1 166df930be7Sderaadt #define CD_MEDIA_CATALOG 2 167df930be7Sderaadt #define CD_TRACK_INFO 3 168df930be7Sderaadt u_char track; 169df930be7Sderaadt int data_len; 170df930be7Sderaadt struct cd_sub_channel_info *data; 171df930be7Sderaadt }; 172df930be7Sderaadt #define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel) 173df930be7Sderaadt 174df930be7Sderaadt struct ioc_toc_header { 175df930be7Sderaadt u_short len; 176df930be7Sderaadt u_char starting_track; 177df930be7Sderaadt u_char ending_track; 178df930be7Sderaadt }; 179df930be7Sderaadt 180df930be7Sderaadt #define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header) 181df930be7Sderaadt 182df930be7Sderaadt struct ioc_read_toc_entry { 183df930be7Sderaadt u_char address_format; 184df930be7Sderaadt u_char starting_track; 185b3ca5396Spedro #define CD_TRACK_LEADOUT 0xaa 186df930be7Sderaadt u_short data_len; 187df930be7Sderaadt struct cd_toc_entry *data; 188df930be7Sderaadt }; 18976fd3256Scsapuntz #define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry) 1909a150b5fSmickey #define CDIOREADTOCENTRYS CDIOREADTOCENTRIES 191df930be7Sderaadt 19276fd3256Scsapuntz /* read LBA start of a given session; 0=last, others not yet supported */ 19376fd3256Scsapuntz #define CDIOREADMSADDR _IOWR('c', 6, int) 19476fd3256Scsapuntz 195df930be7Sderaadt struct ioc_patch { 196df930be7Sderaadt u_char patch[4]; /* one for each channel */ 197df930be7Sderaadt }; 198df930be7Sderaadt #define CDIOCSETPATCH _IOW('c', 9, struct ioc_patch) 199df930be7Sderaadt 200df930be7Sderaadt struct ioc_vol { 201df930be7Sderaadt u_char vol[4]; /* one for each channel */ 202df930be7Sderaadt }; 203df930be7Sderaadt #define CDIOCGETVOL _IOR('c', 10, struct ioc_vol) 204df930be7Sderaadt #define CDIOCSETVOL _IOW('c', 11, struct ioc_vol) 205df930be7Sderaadt #define CDIOCSETMONO _IO('c', 12) 206df930be7Sderaadt #define CDIOCSETSTEREO _IO('c', 13) 207df930be7Sderaadt #define CDIOCSETMUTE _IO('c', 14) 208df930be7Sderaadt #define CDIOCSETLEFT _IO('c', 15) 209df930be7Sderaadt #define CDIOCSETRIGHT _IO('c', 16) 210df930be7Sderaadt #define CDIOCSETDEBUG _IO('c', 17) 211df930be7Sderaadt #define CDIOCCLRDEBUG _IO('c', 18) 212df930be7Sderaadt #define CDIOCPAUSE _IO('c', 19) 213df930be7Sderaadt #define CDIOCRESUME _IO('c', 20) 214df930be7Sderaadt #define CDIOCRESET _IO('c', 21) 215df930be7Sderaadt #define CDIOCSTART _IO('c', 22) 216df930be7Sderaadt #define CDIOCSTOP _IO('c', 23) 217df930be7Sderaadt #define CDIOCEJECT _IO('c', 24) 218df930be7Sderaadt #define CDIOCALLOW _IO('c', 25) 219df930be7Sderaadt #define CDIOCPREVENT _IO('c', 26) 22076fd3256Scsapuntz #define CDIOCCLOSE _IO('c', 27) 221df930be7Sderaadt 222df930be7Sderaadt struct ioc_play_msf { 223df930be7Sderaadt u_char start_m; 224df930be7Sderaadt u_char start_s; 225df930be7Sderaadt u_char start_f; 226df930be7Sderaadt u_char end_m; 227df930be7Sderaadt u_char end_s; 228df930be7Sderaadt u_char end_f; 229df930be7Sderaadt }; 230df930be7Sderaadt #define CDIOCPLAYMSF _IOW('c', 25, struct ioc_play_msf) 231df930be7Sderaadt 23276fd3256Scsapuntz struct ioc_load_unload { 23376fd3256Scsapuntz u_char options; 23476fd3256Scsapuntz #define CD_LU_ABORT 0x1 /* NOTE: These are the same as the ATAPI */ 23576fd3256Scsapuntz #define CD_LU_UNLOAD 0x2 /* op values for the LOAD_UNLOAD command */ 23676fd3256Scsapuntz #define CD_LU_LOAD 0x3 23776fd3256Scsapuntz u_char slot; 23876fd3256Scsapuntz }; 23976fd3256Scsapuntz #define CDIOCLOADUNLOAD _IOW('c', 26, struct ioc_load_unload) 24076fd3256Scsapuntz 24171b3c6bbSangelos /* DVD definitions */ 24271b3c6bbSangelos 24371b3c6bbSangelos /* DVD-ROM Specific ioctls */ 24471b3c6bbSangelos #define DVD_READ_STRUCT _IOWR('d', 0, union dvd_struct) 24571b3c6bbSangelos #define DVD_WRITE_STRUCT _IOWR('d', 1, union dvd_struct) 24671b3c6bbSangelos #define DVD_AUTH _IOWR('d', 2, union dvd_authinfo) 24771b3c6bbSangelos 24871b3c6bbSangelos #define GPCMD_READ_DVD_STRUCTURE 0xad 24971b3c6bbSangelos #define GPCMD_SEND_DVD_STRUCTURE 0xad 25071b3c6bbSangelos #define GPCMD_REPORT_KEY 0xa4 25171b3c6bbSangelos #define GPCMD_SEND_KEY 0xa3 25271b3c6bbSangelos 25371b3c6bbSangelos /* DVD struct types */ 25471b3c6bbSangelos #define DVD_STRUCT_PHYSICAL 0x00 25571b3c6bbSangelos #define DVD_STRUCT_COPYRIGHT 0x01 25671b3c6bbSangelos #define DVD_STRUCT_DISCKEY 0x02 25771b3c6bbSangelos #define DVD_STRUCT_BCA 0x03 25871b3c6bbSangelos #define DVD_STRUCT_MANUFACT 0x04 25971b3c6bbSangelos 26071b3c6bbSangelos struct dvd_layer { 26171b3c6bbSangelos u_int8_t book_version; 26271b3c6bbSangelos u_int8_t book_type; 26371b3c6bbSangelos u_int8_t min_rate; 26471b3c6bbSangelos u_int8_t disc_size; 26571b3c6bbSangelos u_int8_t layer_type; 26671b3c6bbSangelos u_int8_t track_path; 26771b3c6bbSangelos u_int8_t nlayers; 26871b3c6bbSangelos u_int8_t track_density; 26971b3c6bbSangelos u_int8_t linear_density; 27071b3c6bbSangelos u_int8_t bca; 27171b3c6bbSangelos u_int32_t start_sector; 27271b3c6bbSangelos u_int32_t end_sector; 27371b3c6bbSangelos u_int32_t end_sector_l0; 27471b3c6bbSangelos }; 27571b3c6bbSangelos 27671b3c6bbSangelos struct dvd_physical { 27771b3c6bbSangelos u_int8_t type; 27871b3c6bbSangelos 27971b3c6bbSangelos u_int8_t layer_num; 28071b3c6bbSangelos struct dvd_layer layer[4]; 28171b3c6bbSangelos }; 28271b3c6bbSangelos 28371b3c6bbSangelos struct dvd_copyright { 28471b3c6bbSangelos u_int8_t type; 28571b3c6bbSangelos 28671b3c6bbSangelos u_int8_t layer_num; 28771b3c6bbSangelos u_int8_t cpst; 28871b3c6bbSangelos u_int8_t rmi; 28971b3c6bbSangelos }; 29071b3c6bbSangelos 29171b3c6bbSangelos struct dvd_disckey { 29271b3c6bbSangelos u_int8_t type; 29371b3c6bbSangelos 29471b3c6bbSangelos u_int8_t agid; 29571b3c6bbSangelos u_int8_t value[2048]; 29671b3c6bbSangelos }; 29771b3c6bbSangelos 29871b3c6bbSangelos struct dvd_bca { 29971b3c6bbSangelos u_int8_t type; 30071b3c6bbSangelos 30171b3c6bbSangelos int len; 30271b3c6bbSangelos u_int8_t value[188]; 30371b3c6bbSangelos }; 30471b3c6bbSangelos 30571b3c6bbSangelos struct dvd_manufact { 30671b3c6bbSangelos u_int8_t type; 30771b3c6bbSangelos 30871b3c6bbSangelos u_int8_t layer_num; 30971b3c6bbSangelos int len; 31071b3c6bbSangelos u_int8_t value[2048]; 31171b3c6bbSangelos }; 31271b3c6bbSangelos 31371b3c6bbSangelos union dvd_struct { 31471b3c6bbSangelos u_int8_t type; 31571b3c6bbSangelos 31671b3c6bbSangelos struct dvd_physical physical; 31771b3c6bbSangelos struct dvd_copyright copyright; 31871b3c6bbSangelos struct dvd_disckey disckey; 31971b3c6bbSangelos struct dvd_bca bca; 32071b3c6bbSangelos struct dvd_manufact manufact; 32171b3c6bbSangelos }; 32271b3c6bbSangelos 32371b3c6bbSangelos /* 32471b3c6bbSangelos * DVD authentication ioctl 32571b3c6bbSangelos */ 32671b3c6bbSangelos 32771b3c6bbSangelos /* Authentication states */ 32871b3c6bbSangelos #define DVD_LU_SEND_AGID 0 32971b3c6bbSangelos #define DVD_HOST_SEND_CHALLENGE 1 33071b3c6bbSangelos #define DVD_LU_SEND_KEY1 2 33171b3c6bbSangelos #define DVD_LU_SEND_CHALLENGE 3 33271b3c6bbSangelos #define DVD_HOST_SEND_KEY2 4 33371b3c6bbSangelos 33471b3c6bbSangelos /* Termination states */ 33571b3c6bbSangelos #define DVD_AUTH_ESTABLISHED 5 33671b3c6bbSangelos #define DVD_AUTH_FAILURE 6 33771b3c6bbSangelos 33871b3c6bbSangelos /* Other functions */ 33971b3c6bbSangelos #define DVD_LU_SEND_TITLE_KEY 7 34071b3c6bbSangelos #define DVD_LU_SEND_ASF 8 34171b3c6bbSangelos #define DVD_INVALIDATE_AGID 9 342b2a24b2bSkrw #define DVD_LU_SEND_RPC_STATE 10 343b2a24b2bSkrw #define DVD_HOST_SEND_RPC_STATE 11 34471b3c6bbSangelos 34571b3c6bbSangelos #if 0 34671b3c6bbSangelos /* State data */ 34771b3c6bbSangelos typedef u_int8_t dvd_key[5]; /* 40-bit value, MSB is first elem. */ 34871b3c6bbSangelos typedef u_int8_t dvd_challenge[10]; /* 80-bit value, MSB is first elem. */ 34971b3c6bbSangelos #endif 35071b3c6bbSangelos 35171b3c6bbSangelos #define DVD_KEY_SIZE 5 35271b3c6bbSangelos #define DVD_CHALLENGE_SIZE 10 35371b3c6bbSangelos 35471b3c6bbSangelos struct dvd_lu_send_agid { 35571b3c6bbSangelos u_int8_t type; 35671b3c6bbSangelos 35771b3c6bbSangelos u_int8_t agid; 35871b3c6bbSangelos }; 35971b3c6bbSangelos 36071b3c6bbSangelos struct dvd_host_send_challenge { 36171b3c6bbSangelos u_int8_t type; 36271b3c6bbSangelos 36371b3c6bbSangelos u_int8_t agid; 36471b3c6bbSangelos u_int8_t chal[DVD_CHALLENGE_SIZE]; 36571b3c6bbSangelos }; 36671b3c6bbSangelos 36771b3c6bbSangelos struct dvd_send_key { 36871b3c6bbSangelos u_int8_t type; 36971b3c6bbSangelos 37071b3c6bbSangelos u_int8_t agid; 37171b3c6bbSangelos u_int8_t key[DVD_KEY_SIZE]; 37271b3c6bbSangelos }; 37371b3c6bbSangelos 37471b3c6bbSangelos struct dvd_lu_send_challenge { 37571b3c6bbSangelos u_int8_t type; 37671b3c6bbSangelos 37771b3c6bbSangelos u_int8_t agid; 37871b3c6bbSangelos u_int8_t chal[DVD_CHALLENGE_SIZE]; 37971b3c6bbSangelos }; 38071b3c6bbSangelos 38171b3c6bbSangelos #define DVD_CPM_NO_COPYRIGHT 0 38271b3c6bbSangelos #define DVD_CPM_COPYRIGHTED 1 38371b3c6bbSangelos 38471b3c6bbSangelos #define DVD_CP_SEC_NONE 0 38571b3c6bbSangelos #define DVD_CP_SEC_EXIST 1 38671b3c6bbSangelos 38771b3c6bbSangelos #define DVD_CGMS_UNRESTRICTED 0 38871b3c6bbSangelos #define DVD_CGMS_SINGLE 2 38971b3c6bbSangelos #define DVD_CGMS_RESTRICTED 3 39071b3c6bbSangelos 39171b3c6bbSangelos struct dvd_lu_send_title_key { 39271b3c6bbSangelos u_int8_t type; 39371b3c6bbSangelos 39471b3c6bbSangelos u_int8_t agid; 39571b3c6bbSangelos u_int8_t title_key[DVD_KEY_SIZE]; 39671b3c6bbSangelos int lba; 39771b3c6bbSangelos u_int8_t cpm; 39871b3c6bbSangelos u_int8_t cp_sec; 39971b3c6bbSangelos u_int8_t cgms; 40071b3c6bbSangelos }; 40171b3c6bbSangelos 40271b3c6bbSangelos struct dvd_lu_send_asf { 40371b3c6bbSangelos u_int8_t type; 40471b3c6bbSangelos 40571b3c6bbSangelos u_int8_t agid; 40671b3c6bbSangelos u_int8_t asf; 40771b3c6bbSangelos }; 40871b3c6bbSangelos 409b2a24b2bSkrw struct dvd_host_send_rpcstate { 410b2a24b2bSkrw u_int8_t type; 411b2a24b2bSkrw u_int8_t pdrc; 412b2a24b2bSkrw }; 413b2a24b2bSkrw 414b2a24b2bSkrw struct dvd_lu_send_rpcstate { 415b2a24b2bSkrw u_int8_t type; 416b2a24b2bSkrw u_int8_t vra; 417b2a24b2bSkrw u_int8_t ucca; 418b2a24b2bSkrw u_int8_t region_mask; 419b2a24b2bSkrw u_int8_t rpc_scheme; 420b2a24b2bSkrw }; 421b2a24b2bSkrw 42271b3c6bbSangelos union dvd_authinfo { 42371b3c6bbSangelos u_int8_t type; 42471b3c6bbSangelos 42571b3c6bbSangelos struct dvd_lu_send_agid lsa; 42671b3c6bbSangelos struct dvd_host_send_challenge hsc; 42771b3c6bbSangelos struct dvd_send_key lsk; 42871b3c6bbSangelos struct dvd_lu_send_challenge lsc; 42971b3c6bbSangelos struct dvd_send_key hsk; 43071b3c6bbSangelos struct dvd_lu_send_title_key lstk; 43171b3c6bbSangelos struct dvd_lu_send_asf lsasf; 432b2a24b2bSkrw struct dvd_host_send_rpcstate hrpcs; 433b2a24b2bSkrw struct dvd_lu_send_rpcstate lrpcs; 43471b3c6bbSangelos }; 435df930be7Sderaadt #endif /* !_SYS_CDIO_H_ */ 436