1243 lines · plain
1============================2Summary of CDROM ioctl calls3============================4 5- Edward A. Falk <efalk@google.com>6 7November, 20048 9This document attempts to describe the ioctl(2) calls supported by10the CDROM layer. These are by-and-large implemented (as of Linux 2.6)11in drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c12 13ioctl values are listed in <linux/cdrom.h>. As of this writing, they14are as follows:15 16 ======================== ===============================================17 CDROMPAUSE Pause Audio Operation18 CDROMRESUME Resume paused Audio Operation19 CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)20 CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti)21 CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr)22 CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry)23 CDROMSTOP Stop the cdrom drive24 CDROMSTART Start the cdrom drive25 CDROMEJECT Ejects the cdrom media26 CDROMVOLCTRL Control output volume (struct cdrom_volctrl)27 CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl)28 CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes)29 (struct cdrom_read)30 CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes)31 (struct cdrom_read)32 CDROMREADAUDIO (struct cdrom_read_audio)33 CDROMEJECT_SW enable(1)/disable(0) auto-ejecting34 CDROMMULTISESSION Obtain the start-of-last-session35 address of multi session disks36 (struct cdrom_multisession)37 CDROM_GET_MCN Obtain the "Universal Product Code"38 if available (struct cdrom_mcn)39 CDROM_GET_UPC Deprecated, use CDROM_GET_MCN instead.40 CDROMRESET hard-reset the drive41 CDROMVOLREAD Get the drive's volume setting42 (struct cdrom_volctrl)43 CDROMREADRAW read data in raw mode (2352 Bytes)44 (struct cdrom_read)45 CDROMREADCOOKED read data in cooked mode46 CDROMSEEK seek msf address47 CDROMPLAYBLK scsi-cd only, (struct cdrom_blk)48 CDROMREADALL read all 2646 bytes49 CDROMGETSPINDOWN return 4-bit spindown value50 CDROMSETSPINDOWN set 4-bit spindown value51 CDROMCLOSETRAY pendant of CDROMEJECT52 CDROM_SET_OPTIONS Set behavior options53 CDROM_CLEAR_OPTIONS Clear behavior options54 CDROM_SELECT_SPEED Set the CD-ROM speed55 CDROM_SELECT_DISC Select disc (for juke-boxes)56 CDROM_MEDIA_CHANGED Check is media changed57 CDROM_TIMED_MEDIA_CHANGE Check if media changed58 since given time59 (struct cdrom_timed_media_change_info)60 CDROM_DRIVE_STATUS Get tray position, etc.61 CDROM_DISC_STATUS Get disc type, etc.62 CDROM_CHANGER_NSLOTS Get number of slots63 CDROM_LOCKDOOR lock or unlock door64 CDROM_DEBUG Turn debug messages on/off65 CDROM_GET_CAPABILITY get capabilities66 CDROMAUDIOBUFSIZ set the audio buffer size67 DVD_READ_STRUCT Read structure68 DVD_WRITE_STRUCT Write structure69 DVD_AUTH Authentication70 CDROM_SEND_PACKET send a packet to the drive71 CDROM_NEXT_WRITABLE get next writable block72 CDROM_LAST_WRITTEN get last block written on disc73 ======================== ===============================================74 75 76The information that follows was determined from reading kernel source77code. It is likely that some corrections will be made over time.78 79------------------------------------------------------------------------------80 81General:82 83 Unless otherwise specified, all ioctl calls return 0 on success84 and -1 with errno set to an appropriate value on error. (Some85 ioctls return non-negative data values.)86 87 Unless otherwise specified, all ioctl calls return -1 and set88 errno to EFAULT on a failed attempt to copy data to or from user89 address space.90 91 Individual drivers may return error codes not listed here.92 93 Unless otherwise specified, all data structures and constants94 are defined in <linux/cdrom.h>95 96------------------------------------------------------------------------------97 98 99CDROMPAUSE100 Pause Audio Operation101 102 103 usage::104 105 ioctl(fd, CDROMPAUSE, 0);106 107 108 inputs:109 none110 111 112 outputs:113 none114 115 116 error return:117 - ENOSYS cd drive not audio-capable.118 119 120CDROMRESUME121 Resume paused Audio Operation122 123 124 usage::125 126 ioctl(fd, CDROMRESUME, 0);127 128 129 inputs:130 none131 132 133 outputs:134 none135 136 137 error return:138 - ENOSYS cd drive not audio-capable.139 140 141CDROMPLAYMSF142 Play Audio MSF143 144 (struct cdrom_msf)145 146 147 usage::148 149 struct cdrom_msf msf;150 151 ioctl(fd, CDROMPLAYMSF, &msf);152 153 inputs:154 cdrom_msf structure, describing a segment of music to play155 156 157 outputs:158 none159 160 161 error return:162 - ENOSYS cd drive not audio-capable.163 164 notes:165 - MSF stands for minutes-seconds-frames166 - LBA stands for logical block address167 - Segment is described as start and end times, where each time168 is described as minutes:seconds:frames.169 A frame is 1/75 of a second.170 171 172CDROMPLAYTRKIND173 Play Audio Track/index174 175 (struct cdrom_ti)176 177 178 usage::179 180 struct cdrom_ti ti;181 182 ioctl(fd, CDROMPLAYTRKIND, &ti);183 184 inputs:185 cdrom_ti structure, describing a segment of music to play186 187 188 outputs:189 none190 191 192 error return:193 - ENOSYS cd drive not audio-capable.194 195 notes:196 - Segment is described as start and end times, where each time197 is described as a track and an index.198 199 200 201CDROMREADTOCHDR202 Read TOC header203 204 (struct cdrom_tochdr)205 206 207 usage::208 209 cdrom_tochdr header;210 211 ioctl(fd, CDROMREADTOCHDR, &header);212 213 inputs:214 cdrom_tochdr structure215 216 217 outputs:218 cdrom_tochdr structure219 220 221 error return:222 - ENOSYS cd drive not audio-capable.223 224 225 226CDROMREADTOCENTRY227 Read TOC entry228 229 (struct cdrom_tocentry)230 231 232 usage::233 234 struct cdrom_tocentry entry;235 236 ioctl(fd, CDROMREADTOCENTRY, &entry);237 238 inputs:239 cdrom_tocentry structure240 241 242 outputs:243 cdrom_tocentry structure244 245 246 error return:247 - ENOSYS cd drive not audio-capable.248 - EINVAL entry.cdte_format not CDROM_MSF or CDROM_LBA249 - EINVAL requested track out of bounds250 - EIO I/O error reading TOC251 252 notes:253 - TOC stands for Table Of Contents254 - MSF stands for minutes-seconds-frames255 - LBA stands for logical block address256 257 258 259CDROMSTOP260 Stop the cdrom drive261 262 263 usage::264 265 ioctl(fd, CDROMSTOP, 0);266 267 268 inputs:269 none270 271 272 outputs:273 none274 275 276 error return:277 - ENOSYS cd drive not audio-capable.278 279 notes:280 - Exact interpretation of this ioctl depends on the device,281 but most seem to spin the drive down.282 283 284CDROMSTART285 Start the cdrom drive286 287 288 usage::289 290 ioctl(fd, CDROMSTART, 0);291 292 293 inputs:294 none295 296 297 outputs:298 none299 300 301 error return:302 - ENOSYS cd drive not audio-capable.303 304 notes:305 - Exact interpretation of this ioctl depends on the device,306 but most seem to spin the drive up and/or close the tray.307 Other devices ignore the ioctl completely.308 309 310CDROMEJECT311 - Ejects the cdrom media312 313 314 usage::315 316 ioctl(fd, CDROMEJECT, 0);317 318 319 inputs:320 none321 322 323 outputs:324 none325 326 327 error returns:328 - ENOSYS cd drive not capable of ejecting329 - EBUSY other processes are accessing drive, or door is locked330 331 notes:332 - See CDROM_LOCKDOOR, below.333 334 335 336 337CDROMCLOSETRAY338 pendant of CDROMEJECT339 340 341 usage::342 343 ioctl(fd, CDROMCLOSETRAY, 0);344 345 346 inputs:347 none348 349 350 outputs:351 none352 353 354 error returns:355 - ENOSYS cd drive not capable of closing the tray356 - EBUSY other processes are accessing drive, or door is locked357 358 notes:359 - See CDROM_LOCKDOOR, below.360 361 362 363 364CDROMVOLCTRL365 Control output volume (struct cdrom_volctrl)366 367 368 usage::369 370 struct cdrom_volctrl volume;371 372 ioctl(fd, CDROMVOLCTRL, &volume);373 374 inputs:375 cdrom_volctrl structure containing volumes for up to 4376 channels.377 378 outputs:379 none380 381 382 error return:383 - ENOSYS cd drive not audio-capable.384 385 386 387CDROMVOLREAD388 Get the drive's volume setting389 390 (struct cdrom_volctrl)391 392 393 usage::394 395 struct cdrom_volctrl volume;396 397 ioctl(fd, CDROMVOLREAD, &volume);398 399 inputs:400 none401 402 403 outputs:404 The current volume settings.405 406 407 error return:408 - ENOSYS cd drive not audio-capable.409 410 411 412CDROMSUBCHNL413 Read subchannel data414 415 (struct cdrom_subchnl)416 417 418 usage::419 420 struct cdrom_subchnl q;421 422 ioctl(fd, CDROMSUBCHNL, &q);423 424 inputs:425 cdrom_subchnl structure426 427 428 outputs:429 cdrom_subchnl structure430 431 432 error return:433 - ENOSYS cd drive not audio-capable.434 - EINVAL format not CDROM_MSF or CDROM_LBA435 436 notes:437 - Format is converted to CDROM_MSF or CDROM_LBA438 as per user request on return439 440 441 442CDROMREADRAW443 read data in raw mode (2352 Bytes)444 445 (struct cdrom_read)446 447 usage::448 449 union {450 451 struct cdrom_msf msf; /* input */452 char buffer[CD_FRAMESIZE_RAW]; /* return */453 } arg;454 ioctl(fd, CDROMREADRAW, &arg);455 456 inputs:457 cdrom_msf structure indicating an address to read.458 459 Only the start values are significant.460 461 outputs:462 Data written to address provided by user.463 464 465 error return:466 - EINVAL address less than 0, or msf less than 0:2:0467 - ENOMEM out of memory468 469 notes:470 - As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this471 ioctl accepts a cdrom_read structure, but actual source code472 reads a cdrom_msf structure and writes a buffer of data to473 the same address.474 475 - MSF values are converted to LBA values via this formula::476 477 lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;478 479 480 481 482CDROMREADMODE1483 Read CDROM mode 1 data (2048 Bytes)484 485 (struct cdrom_read)486 487 notes:488 Identical to CDROMREADRAW except that block size is489 CD_FRAMESIZE (2048) bytes490 491 492 493CDROMREADMODE2494 Read CDROM mode 2 data (2336 Bytes)495 496 (struct cdrom_read)497 498 notes:499 Identical to CDROMREADRAW except that block size is500 CD_FRAMESIZE_RAW0 (2336) bytes501 502 503 504CDROMREADAUDIO505 (struct cdrom_read_audio)506 507 usage::508 509 struct cdrom_read_audio ra;510 511 ioctl(fd, CDROMREADAUDIO, &ra);512 513 inputs:514 cdrom_read_audio structure containing read start515 point and length516 517 outputs:518 audio data, returned to buffer indicated by ra519 520 521 error return:522 - EINVAL format not CDROM_MSF or CDROM_LBA523 - EINVAL nframes not in range [1 75]524 - ENXIO drive has no queue (probably means invalid fd)525 - ENOMEM out of memory526 527 528CDROMEJECT_SW529 enable(1)/disable(0) auto-ejecting530 531 532 usage::533 534 int val;535 536 ioctl(fd, CDROMEJECT_SW, val);537 538 inputs:539 Flag specifying auto-eject flag.540 541 542 outputs:543 none544 545 546 error return:547 - ENOSYS Drive is not capable of ejecting.548 - EBUSY Door is locked549 550 551 552 553CDROMMULTISESSION554 Obtain the start-of-last-session address of multi session disks555 556 (struct cdrom_multisession)557 558 usage::559 560 struct cdrom_multisession ms_info;561 562 ioctl(fd, CDROMMULTISESSION, &ms_info);563 564 inputs:565 cdrom_multisession structure containing desired566 567 format.568 569 outputs:570 cdrom_multisession structure is filled with last_session571 information.572 573 error return:574 - EINVAL format not CDROM_MSF or CDROM_LBA575 576 577CDROM_GET_MCN578 Obtain the "Universal Product Code"579 if available580 581 (struct cdrom_mcn)582 583 584 usage::585 586 struct cdrom_mcn mcn;587 588 ioctl(fd, CDROM_GET_MCN, &mcn);589 590 inputs:591 none592 593 594 outputs:595 Universal Product Code596 597 598 error return:599 - ENOSYS Drive is not capable of reading MCN data.600 601 notes:602 - Source code comments state::603 604 The following function is implemented, although very few605 audio discs give Universal Product Code information, which606 should just be the Medium Catalog Number on the box. Note,607 that the way the code is written on the CD is /not/ uniform608 across all discs!609 610 611 612 613CDROM_GET_UPC614 CDROM_GET_MCN (deprecated)615 616 617 Not implemented, as of 2.6.8.1618 619 620 621CDROMRESET622 hard-reset the drive623 624 625 usage::626 627 ioctl(fd, CDROMRESET, 0);628 629 630 inputs:631 none632 633 634 outputs:635 none636 637 638 error return:639 - EACCES Access denied: requires CAP_SYS_ADMIN640 - ENOSYS Drive is not capable of resetting.641 642 643 644 645CDROMREADCOOKED646 read data in cooked mode647 648 649 usage::650 651 u8 buffer[CD_FRAMESIZE]652 653 ioctl(fd, CDROMREADCOOKED, buffer);654 655 inputs:656 none657 658 659 outputs:660 2048 bytes of data, "cooked" mode.661 662 663 notes:664 Not implemented on all drives.665 666 667 668 669 670CDROMREADALL671 read all 2646 bytes672 673 674 Same as CDROMREADCOOKED, but reads 2646 bytes.675 676 677 678CDROMSEEK679 seek msf address680 681 682 usage::683 684 struct cdrom_msf msf;685 686 ioctl(fd, CDROMSEEK, &msf);687 688 inputs:689 MSF address to seek to.690 691 692 outputs:693 none694 695 696 697 698CDROMPLAYBLK699 scsi-cd only700 701 (struct cdrom_blk)702 703 704 usage::705 706 struct cdrom_blk blk;707 708 ioctl(fd, CDROMPLAYBLK, &blk);709 710 inputs:711 Region to play712 713 714 outputs:715 none716 717 718 719 720CDROMGETSPINDOWN721 Obsolete, was ide-cd only722 723 724 usage::725 726 char spindown;727 728 ioctl(fd, CDROMGETSPINDOWN, &spindown);729 730 inputs:731 none732 733 734 outputs:735 The value of the current 4-bit spindown value.736 737 738 739 740 741CDROMSETSPINDOWN742 Obsolete, was ide-cd only743 744 745 usage::746 747 char spindown748 749 ioctl(fd, CDROMSETSPINDOWN, &spindown);750 751 inputs:752 4-bit value used to control spindown (TODO: more detail here)753 754 755 outputs:756 none757 758 759 760 761 762 763CDROM_SET_OPTIONS764 Set behavior options765 766 767 usage::768 769 int options;770 771 ioctl(fd, CDROM_SET_OPTIONS, options);772 773 inputs:774 New values for drive options. The logical 'or' of:775 776 ============== ==================================777 CDO_AUTO_CLOSE close tray on first open(2)778 CDO_AUTO_EJECT open tray on last release779 CDO_USE_FFLAGS use O_NONBLOCK information on open780 CDO_LOCK lock tray on open files781 CDO_CHECK_TYPE check type on open for data782 ============== ==================================783 784 outputs:785 Returns the resulting options settings in the786 ioctl return value. Returns -1 on error.787 788 error return:789 - ENOSYS selected option(s) not supported by drive.790 791 792 793 794CDROM_CLEAR_OPTIONS795 Clear behavior options796 797 798 Same as CDROM_SET_OPTIONS, except that selected options are799 turned off.800 801 802 803CDROM_SELECT_SPEED804 Set the CD-ROM speed805 806 807 usage::808 809 int speed;810 811 ioctl(fd, CDROM_SELECT_SPEED, speed);812 813 inputs:814 New drive speed.815 816 817 outputs:818 none819 820 821 error return:822 - ENOSYS speed selection not supported by drive.823 824 825 826CDROM_SELECT_DISC827 Select disc (for juke-boxes)828 829 830 usage::831 832 int disk;833 834 ioctl(fd, CDROM_SELECT_DISC, disk);835 836 inputs:837 Disk to load into drive.838 839 840 outputs:841 none842 843 844 error return:845 - EINVAL Disk number beyond capacity of drive846 847 848 849CDROM_MEDIA_CHANGED850 Check is media changed851 852 853 usage::854 855 int slot;856 857 ioctl(fd, CDROM_MEDIA_CHANGED, slot);858 859 inputs:860 Slot number to be tested, always zero except for jukeboxes.861 862 May also be special values CDSL_NONE or CDSL_CURRENT863 864 outputs:865 Ioctl return value is 0 or 1 depending on whether the media866 867 has been changed, or -1 on error.868 869 error returns:870 - ENOSYS Drive can't detect media change871 - EINVAL Slot number beyond capacity of drive872 - ENOMEM Out of memory873 874 875 876CDROM_DRIVE_STATUS877 Get tray position, etc.878 879 880 usage::881 882 int slot;883 884 ioctl(fd, CDROM_DRIVE_STATUS, slot);885 886 inputs:887 Slot number to be tested, always zero except for jukeboxes.888 889 May also be special values CDSL_NONE or CDSL_CURRENT890 891 outputs:892 Ioctl return value will be one of the following values893 894 from <linux/cdrom.h>:895 896 =================== ==========================897 CDS_NO_INFO Information not available.898 CDS_NO_DISC899 CDS_TRAY_OPEN900 CDS_DRIVE_NOT_READY901 CDS_DISC_OK902 -1 error903 =================== ==========================904 905 error returns:906 - ENOSYS Drive can't detect drive status907 - EINVAL Slot number beyond capacity of drive908 - ENOMEM Out of memory909 910 911 912 913CDROM_DISC_STATUS914 Get disc type, etc.915 916 917 usage::918 919 ioctl(fd, CDROM_DISC_STATUS, 0);920 921 922 inputs:923 none924 925 926 outputs:927 Ioctl return value will be one of the following values928 929 from <linux/cdrom.h>:930 931 - CDS_NO_INFO932 - CDS_AUDIO933 - CDS_MIXED934 - CDS_XA_2_2935 - CDS_XA_2_1936 - CDS_DATA_1937 938 error returns:939 none at present940 941 notes:942 - Source code comments state::943 944 945 Ok, this is where problems start. The current interface for946 the CDROM_DISC_STATUS ioctl is flawed. It makes the false947 assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.948 Unfortunately, while this is often the case, it is also949 very common for CDs to have some tracks with data, and some950 tracks with audio. Just because I feel like it, I declare951 the following to be the best way to cope. If the CD has952 ANY data tracks on it, it will be returned as a data CD.953 If it has any XA tracks, I will return it as that. Now I954 could simplify this interface by combining these returns with955 the above, but this more clearly demonstrates the problem956 with the current interface. Too bad this wasn't designed957 to use bitmasks... -Erik958 959 Well, now we have the option CDS_MIXED: a mixed-type CD.960 User level programmers might feel the ioctl is not very961 useful.962 ---david963 964 965 966 967CDROM_CHANGER_NSLOTS968 Get number of slots969 970 971 usage::972 973 ioctl(fd, CDROM_CHANGER_NSLOTS, 0);974 975 976 inputs:977 none978 979 980 outputs:981 The ioctl return value will be the number of slots in a982 CD changer. Typically 1 for non-multi-disk devices.983 984 error returns:985 none986 987 988 989CDROM_LOCKDOOR990 lock or unlock door991 992 993 usage::994 995 int lock;996 997 ioctl(fd, CDROM_LOCKDOOR, lock);998 999 inputs:1000 Door lock flag, 1=lock, 0=unlock1001 1002 1003 outputs:1004 none1005 1006 1007 error returns:1008 - EDRIVE_CANT_DO_THIS1009 1010 Door lock function not supported.1011 - EBUSY1012 1013 Attempt to unlock when multiple users1014 have the drive open and not CAP_SYS_ADMIN1015 1016 notes:1017 As of 2.6.8.1, the lock flag is a global lock, meaning that1018 all CD drives will be locked or unlocked together. This is1019 probably a bug.1020 1021 The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h>1022 and is currently (2.6.8.1) the same as EOPNOTSUPP1023 1024 1025 1026CDROM_DEBUG1027 Turn debug messages on/off1028 1029 1030 usage::1031 1032 int debug;1033 1034 ioctl(fd, CDROM_DEBUG, debug);1035 1036 inputs:1037 Cdrom debug flag, 0=disable, 1=enable1038 1039 1040 outputs:1041 The ioctl return value will be the new debug flag.1042 1043 1044 error return:1045 - EACCES Access denied: requires CAP_SYS_ADMIN1046 1047 1048 1049CDROM_GET_CAPABILITY1050 get capabilities1051 1052 1053 usage::1054 1055 ioctl(fd, CDROM_GET_CAPABILITY, 0);1056 1057 1058 inputs:1059 none1060 1061 1062 outputs:1063 The ioctl return value is the current device capability1064 flags. See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc.1065 1066 1067 1068CDROMAUDIOBUFSIZ1069 set the audio buffer size1070 1071 1072 usage::1073 1074 int arg;1075 1076 ioctl(fd, CDROMAUDIOBUFSIZ, val);1077 1078 inputs:1079 New audio buffer size1080 1081 1082 outputs:1083 The ioctl return value is the new audio buffer size, or -11084 on error.1085 1086 error return:1087 - ENOSYS Not supported by this driver.1088 1089 notes:1090 Not supported by all drivers.1091 1092 1093 1094 1095DVD_READ_STRUCT Read structure1096 1097 usage::1098 1099 dvd_struct s;1100 1101 ioctl(fd, DVD_READ_STRUCT, &s);1102 1103 inputs:1104 dvd_struct structure, containing:1105 1106 =================== ==========================================1107 type specifies the information desired, one of1108 DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT,1109 DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA,1110 DVD_STRUCT_MANUFACT1111 physical.layer_num desired layer, indexed from 01112 copyright.layer_num desired layer, indexed from 01113 disckey.agid1114 =================== ==========================================1115 1116 outputs:1117 dvd_struct structure, containing:1118 1119 =================== ================================1120 physical for type == DVD_STRUCT_PHYSICAL1121 copyright for type == DVD_STRUCT_COPYRIGHT1122 disckey.value for type == DVD_STRUCT_DISCKEY1123 bca.{len,value} for type == DVD_STRUCT_BCA1124 manufact.{len,valu} for type == DVD_STRUCT_MANUFACT1125 =================== ================================1126 1127 error returns:1128 - EINVAL physical.layer_num exceeds number of layers1129 - EIO Received invalid response from drive1130 1131 1132 1133DVD_WRITE_STRUCT Write structure1134 1135 Not implemented, as of 2.6.8.11136 1137 1138 1139DVD_AUTH Authentication1140 1141 usage::1142 1143 dvd_authinfo ai;1144 1145 ioctl(fd, DVD_AUTH, &ai);1146 1147 inputs:1148 dvd_authinfo structure. See <linux/cdrom.h>1149 1150 1151 outputs:1152 dvd_authinfo structure.1153 1154 1155 error return:1156 - ENOTTY ai.type not recognized.1157 1158 1159 1160CDROM_SEND_PACKET1161 send a packet to the drive1162 1163 1164 usage::1165 1166 struct cdrom_generic_command cgc;1167 1168 ioctl(fd, CDROM_SEND_PACKET, &cgc);1169 1170 inputs:1171 cdrom_generic_command structure containing the packet to send.1172 1173 1174 outputs:1175 none1176 1177 cdrom_generic_command structure containing results.1178 1179 error return:1180 - EIO1181 1182 command failed.1183 - EPERM1184 1185 Operation not permitted, either because a1186 write command was attempted on a drive which1187 is opened read-only, or because the command1188 requires CAP_SYS_RAWIO1189 - EINVAL1190 1191 cgc.data_direction not set1192 1193 1194 1195CDROM_NEXT_WRITABLE1196 get next writable block1197 1198 1199 usage::1200 1201 long next;1202 1203 ioctl(fd, CDROM_NEXT_WRITABLE, &next);1204 1205 inputs:1206 none1207 1208 1209 outputs:1210 The next writable block.1211 1212 1213 notes:1214 If the device does not support this ioctl directly, the1215 1216 ioctl will return CDROM_LAST_WRITTEN + 7.1217 1218 1219 1220CDROM_LAST_WRITTEN1221 get last block written on disc1222 1223 1224 usage::1225 1226 long last;1227 1228 ioctl(fd, CDROM_LAST_WRITTEN, &last);1229 1230 inputs:1231 none1232 1233 1234 outputs:1235 The last block written on disc1236 1237 1238 notes:1239 If the device does not support this ioctl directly, the1240 result is derived from the disc's table of contents. If the1241 table of contents can't be read, this ioctl returns an1242 error.1243