1 Summary of CDROM ioctl calls. 2 ============================ 3 4 Edward A. Falk <efalk@google.com> 5 6 November, 2004 7 8This document attempts to describe the ioctl(2) calls supported by 9the CDROM layer. These are by-and-large implemented (as of Linux 2.6) 10in drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c 11 12ioctl values are listed in <linux/cdrom.h>. As of this writing, they 13are as follows: 14 15 CDROMPAUSE Pause Audio Operation 16 CDROMRESUME Resume paused Audio Operation 17 CDROMPLAYMSF Play Audio MSF (struct cdrom_msf) 18 CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti) 19 CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr) 20 CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry) 21 CDROMSTOP Stop the cdrom drive 22 CDROMSTART Start the cdrom drive 23 CDROMEJECT Ejects the cdrom media 24 CDROMVOLCTRL Control output volume (struct cdrom_volctrl) 25 CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl) 26 CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes) 27 (struct cdrom_read) 28 CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes) 29 (struct cdrom_read) 30 CDROMREADAUDIO (struct cdrom_read_audio) 31 CDROMEJECT_SW enable(1)/disable(0) auto-ejecting 32 CDROMMULTISESSION Obtain the start-of-last-session 33 address of multi session disks 34 (struct cdrom_multisession) 35 CDROM_GET_MCN Obtain the "Universal Product Code" 36 if available (struct cdrom_mcn) 37 CDROM_GET_UPC Deprecated, use CDROM_GET_MCN instead. 38 CDROMRESET hard-reset the drive 39 CDROMVOLREAD Get the drive's volume setting 40 (struct cdrom_volctrl) 41 CDROMREADRAW read data in raw mode (2352 Bytes) 42 (struct cdrom_read) 43 CDROMREADCOOKED read data in cooked mode 44 CDROMSEEK seek msf address 45 CDROMPLAYBLK scsi-cd only, (struct cdrom_blk) 46 CDROMREADALL read all 2646 bytes 47 CDROMGETSPINDOWN return 4-bit spindown value 48 CDROMSETSPINDOWN set 4-bit spindown value 49 CDROMCLOSETRAY pendant of CDROMEJECT 50 CDROM_SET_OPTIONS Set behavior options 51 CDROM_CLEAR_OPTIONS Clear behavior options 52 CDROM_SELECT_SPEED Set the CD-ROM speed 53 CDROM_SELECT_DISC Select disc (for juke-boxes) 54 CDROM_MEDIA_CHANGED Check is media changed 55 CDROM_DRIVE_STATUS Get tray position, etc. 56 CDROM_DISC_STATUS Get disc type, etc. 57 CDROM_CHANGER_NSLOTS Get number of slots 58 CDROM_LOCKDOOR lock or unlock door 59 CDROM_DEBUG Turn debug messages on/off 60 CDROM_GET_CAPABILITY get capabilities 61 CDROMAUDIOBUFSIZ set the audio buffer size 62 DVD_READ_STRUCT Read structure 63 DVD_WRITE_STRUCT Write structure 64 DVD_AUTH Authentication 65 CDROM_SEND_PACKET send a packet to the drive 66 CDROM_NEXT_WRITABLE get next writable block 67 CDROM_LAST_WRITTEN get last block written on disc 68 69 70The information that follows was determined from reading kernel source 71code. It is likely that some corrections will be made over time. 72 73 74 75 76 77 78 79General: 80 81 Unless otherwise specified, all ioctl calls return 0 on success 82 and -1 with errno set to an appropriate value on error. (Some 83 ioctls return non-negative data values.) 84 85 Unless otherwise specified, all ioctl calls return -1 and set 86 errno to EFAULT on a failed attempt to copy data to or from user 87 address space. 88 89 Individual drivers may return error codes not listed here. 90 91 Unless otherwise specified, all data structures and constants 92 are defined in <linux/cdrom.h> 93 94 95 96 97CDROMPAUSE Pause Audio Operation 98 99 usage: 100 101 ioctl(fd, CDROMPAUSE, 0); 102 103 inputs: none 104 105 outputs: none 106 107 error return: 108 ENOSYS cd drive not audio-capable. 109 110 111CDROMRESUME Resume paused Audio Operation 112 113 usage: 114 115 ioctl(fd, CDROMRESUME, 0); 116 117 inputs: none 118 119 outputs: none 120 121 error return: 122 ENOSYS cd drive not audio-capable. 123 124 125CDROMPLAYMSF Play Audio MSF (struct cdrom_msf) 126 127 usage: 128 129 struct cdrom_msf msf; 130 ioctl(fd, CDROMPLAYMSF, &msf); 131 132 inputs: 133 cdrom_msf structure, describing a segment of music to play 134 135 outputs: none 136 137 error return: 138 ENOSYS cd drive not audio-capable. 139 140 notes: 141 MSF stands for minutes-seconds-frames 142 LBA stands for logical block address 143 144 Segment is described as start and end times, where each time 145 is described as minutes:seconds:frames. A frame is 1/75 of 146 a second. 147 148 149CDROMPLAYTRKIND Play Audio Track/index (struct cdrom_ti) 150 151 usage: 152 153 struct cdrom_ti ti; 154 ioctl(fd, CDROMPLAYTRKIND, &ti); 155 156 inputs: 157 cdrom_ti structure, describing a segment of music to play 158 159 outputs: none 160 161 error return: 162 ENOSYS cd drive not audio-capable. 163 164 notes: 165 Segment is described as start and end times, where each time 166 is described as a track and an index. 167 168 169 170CDROMREADTOCHDR Read TOC header (struct cdrom_tochdr) 171 172 usage: 173 174 cdrom_tochdr header; 175 ioctl(fd, CDROMREADTOCHDR, &header); 176 177 inputs: 178 cdrom_tochdr structure 179 180 outputs: 181 cdrom_tochdr structure 182 183 error return: 184 ENOSYS cd drive not audio-capable. 185 186 187 188CDROMREADTOCENTRY Read TOC entry (struct cdrom_tocentry) 189 190 usage: 191 192 struct cdrom_tocentry entry; 193 ioctl(fd, CDROMREADTOCENTRY, &entry); 194 195 inputs: 196 cdrom_tocentry structure 197 198 outputs: 199 cdrom_tocentry structure 200 201 error return: 202 ENOSYS cd drive not audio-capable. 203 EINVAL entry.cdte_format not CDROM_MSF or CDROM_LBA 204 EINVAL requested track out of bounds 205 EIO I/O error reading TOC 206 207 notes: 208 TOC stands for Table Of Contents 209 MSF stands for minutes-seconds-frames 210 LBA stands for logical block address 211 212 213 214CDROMSTOP Stop the cdrom drive 215 216 usage: 217 218 ioctl(fd, CDROMSTOP, 0); 219 220 inputs: none 221 222 outputs: none 223 224 error return: 225 ENOSYS cd drive not audio-capable. 226 227 notes: 228 Exact interpretation of this ioctl depends on the device, 229 but most seem to spin the drive down. 230 231 232CDROMSTART Start the cdrom drive 233 234 usage: 235 236 ioctl(fd, CDROMSTART, 0); 237 238 inputs: none 239 240 outputs: none 241 242 error return: 243 ENOSYS cd drive not audio-capable. 244 245 notes: 246 Exact interpretation of this ioctl depends on the device, 247 but most seem to spin the drive up and/or close the tray. 248 Other devices ignore the ioctl completely. 249 250 251CDROMEJECT Ejects the cdrom media 252 253 usage: 254 255 ioctl(fd, CDROMEJECT, 0); 256 257 inputs: none 258 259 outputs: none 260 261 error returns: 262 ENOSYS cd drive not capable of ejecting 263 EBUSY other processes are accessing drive, or door is locked 264 265 notes: 266 See CDROM_LOCKDOOR, below. 267 268 269 270CDROMCLOSETRAY pendant of CDROMEJECT 271 272 usage: 273 274 ioctl(fd, CDROMCLOSETRAY, 0); 275 276 inputs: none 277 278 outputs: none 279 280 error returns: 281 ENOSYS cd drive not capable of closing the tray 282 EBUSY other processes are accessing drive, or door is locked 283 284 notes: 285 See CDROM_LOCKDOOR, below. 286 287 288 289CDROMVOLCTRL Control output volume (struct cdrom_volctrl) 290 291 usage: 292 293 struct cdrom_volctrl volume; 294 ioctl(fd, CDROMVOLCTRL, &volume); 295 296 inputs: 297 cdrom_volctrl structure containing volumes for up to 4 298 channels. 299 300 outputs: none 301 302 error return: 303 ENOSYS cd drive not audio-capable. 304 305 306 307CDROMVOLREAD Get the drive's volume setting 308 (struct cdrom_volctrl) 309 310 usage: 311 312 struct cdrom_volctrl volume; 313 ioctl(fd, CDROMVOLREAD, &volume); 314 315 inputs: none 316 317 outputs: 318 The current volume settings. 319 320 error return: 321 ENOSYS cd drive not audio-capable. 322 323 324 325CDROMSUBCHNL Read subchannel data (struct cdrom_subchnl) 326 327 usage: 328 329 struct cdrom_subchnl q; 330 ioctl(fd, CDROMSUBCHNL, &q); 331 332 inputs: 333 cdrom_subchnl structure 334 335 outputs: 336 cdrom_subchnl structure 337 338 error return: 339 ENOSYS cd drive not audio-capable. 340 EINVAL format not CDROM_MSF or CDROM_LBA 341 342 notes: 343 Format is converted to CDROM_MSF on return 344 345 346 347CDROMREADRAW read data in raw mode (2352 Bytes) 348 (struct cdrom_read) 349 350 usage: 351 352 union { 353 struct cdrom_msf msf; /* input */ 354 char buffer[CD_FRAMESIZE_RAW]; /* return */ 355 } arg; 356 ioctl(fd, CDROMREADRAW, &arg); 357 358 inputs: 359 cdrom_msf structure indicating an address to read. 360 Only the start values are significant. 361 362 outputs: 363 Data written to address provided by user. 364 365 error return: 366 EINVAL address less than 0, or msf less than 0:2:0 367 ENOMEM out of memory 368 369 notes: 370 As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this 371 ioctl accepts a cdrom_read structure, but actual source code 372 reads a cdrom_msf structure and writes a buffer of data to 373 the same address. 374 375 MSF values are converted to LBA values via this formula: 376 377 lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET; 378 379 380 381 382CDROMREADMODE1 Read CDROM mode 1 data (2048 Bytes) 383 (struct cdrom_read) 384 385 notes: 386 Identical to CDROMREADRAW except that block size is 387 CD_FRAMESIZE (2048) bytes 388 389 390 391CDROMREADMODE2 Read CDROM mode 2 data (2336 Bytes) 392 (struct cdrom_read) 393 394 notes: 395 Identical to CDROMREADRAW except that block size is 396 CD_FRAMESIZE_RAW0 (2336) bytes 397 398 399 400CDROMREADAUDIO (struct cdrom_read_audio) 401 402 usage: 403 404 struct cdrom_read_audio ra; 405 ioctl(fd, CDROMREADAUDIO, &ra); 406 407 inputs: 408 cdrom_read_audio structure containing read start 409 point and length 410 411 outputs: 412 audio data, returned to buffer indicated by ra 413 414 error return: 415 EINVAL format not CDROM_MSF or CDROM_LBA 416 EINVAL nframes not in range [1 75] 417 ENXIO drive has no queue (probably means invalid fd) 418 ENOMEM out of memory 419 420 421CDROMEJECT_SW enable(1)/disable(0) auto-ejecting 422 423 usage: 424 425 int val; 426 ioctl(fd, CDROMEJECT_SW, val); 427 428 inputs: 429 Flag specifying auto-eject flag. 430 431 outputs: none 432 433 error return: 434 ENOSYS Drive is not capable of ejecting. 435 EBUSY Door is locked 436 437 438 439 440CDROMMULTISESSION Obtain the start-of-last-session 441 address of multi session disks 442 (struct cdrom_multisession) 443 usage: 444 445 struct cdrom_multisession ms_info; 446 ioctl(fd, CDROMMULTISESSION, &ms_info); 447 448 inputs: 449 cdrom_multisession structure containing desired 450 format. 451 452 outputs: 453 cdrom_multisession structure is filled with last_session 454 information. 455 456 error return: 457 EINVAL format not CDROM_MSF or CDROM_LBA 458 459 460CDROM_GET_MCN Obtain the "Universal Product Code" 461 if available (struct cdrom_mcn) 462 463 usage: 464 465 struct cdrom_mcn mcn; 466 ioctl(fd, CDROM_GET_MCN, &mcn); 467 468 inputs: none 469 470 outputs: 471 Universal Product Code 472 473 error return: 474 ENOSYS Drive is not capable of reading MCN data. 475 476 notes: 477 Source code comments state: 478 479 The following function is implemented, although very few 480 audio discs give Universal Product Code information, which 481 should just be the Medium Catalog Number on the box. Note, 482 that the way the code is written on the CD is /not/ uniform 483 across all discs! 484 485 486 487 488CDROM_GET_UPC CDROM_GET_MCN (deprecated) 489 490 Not implemented, as of 2.6.8.1 491 492 493 494CDROMRESET hard-reset the drive 495 496 usage: 497 498 ioctl(fd, CDROMRESET, 0); 499 500 inputs: none 501 502 outputs: none 503 504 error return: 505 EACCES Access denied: requires CAP_SYS_ADMIN 506 ENOSYS Drive is not capable of resetting. 507 508 509 510 511CDROMREADCOOKED read data in cooked mode 512 513 usage: 514 515 u8 buffer[CD_FRAMESIZE] 516 ioctl(fd, CDROMREADCOOKED, buffer); 517 518 inputs: none 519 520 outputs: 521 2048 bytes of data, "cooked" mode. 522 523 notes: 524 Not implemented on all drives. 525 526 527 528 529CDROMREADALL read all 2646 bytes 530 531 Same as CDROMREADCOOKED, but reads 2646 bytes. 532 533 534 535CDROMSEEK seek msf address 536 537 usage: 538 539 struct cdrom_msf msf; 540 ioctl(fd, CDROMSEEK, &msf); 541 542 inputs: 543 MSF address to seek to. 544 545 outputs: none 546 547 548 549CDROMPLAYBLK scsi-cd only, (struct cdrom_blk) 550 551 usage: 552 553 struct cdrom_blk blk; 554 ioctl(fd, CDROMPLAYBLK, &blk); 555 556 inputs: 557 Region to play 558 559 outputs: none 560 561 562 563CDROMGETSPINDOWN 564 565 usage: 566 567 char spindown; 568 ioctl(fd, CDROMGETSPINDOWN, &spindown); 569 570 inputs: none 571 572 outputs: 573 The value of the current 4-bit spindown value. 574 575 576 577 578CDROMSETSPINDOWN 579 580 usage: 581 582 char spindown 583 ioctl(fd, CDROMSETSPINDOWN, &spindown); 584 585 inputs: 586 4-bit value used to control spindown (TODO: more detail here) 587 588 outputs: none 589 590 591 592 593 594CDROM_SET_OPTIONS Set behavior options 595 596 usage: 597 598 int options; 599 ioctl(fd, CDROM_SET_OPTIONS, options); 600 601 inputs: 602 New values for drive options. The logical 'or' of: 603 CDO_AUTO_CLOSE close tray on first open(2) 604 CDO_AUTO_EJECT open tray on last release 605 CDO_USE_FFLAGS use O_NONBLOCK information on open 606 CDO_LOCK lock tray on open files 607 CDO_CHECK_TYPE check type on open for data 608 609 outputs: 610 Returns the resulting options settings in the 611 ioctl return value. Returns -1 on error. 612 613 error return: 614 ENOSYS selected option(s) not supported by drive. 615 616 617 618 619CDROM_CLEAR_OPTIONS Clear behavior options 620 621 Same as CDROM_SET_OPTIONS, except that selected options are 622 turned off. 623 624 625 626CDROM_SELECT_SPEED Set the CD-ROM speed 627 628 usage: 629 630 int speed; 631 ioctl(fd, CDROM_SELECT_SPEED, speed); 632 633 inputs: 634 New drive speed. 635 636 outputs: none 637 638 error return: 639 ENOSYS speed selection not supported by drive. 640 641 642 643CDROM_SELECT_DISC Select disc (for juke-boxes) 644 645 usage: 646 647 int disk; 648 ioctl(fd, CDROM_SELECT_DISC, disk); 649 650 inputs: 651 Disk to load into drive. 652 653 outputs: none 654 655 error return: 656 EINVAL Disk number beyond capacity of drive 657 658 659 660CDROM_MEDIA_CHANGED Check is media changed 661 662 usage: 663 664 int slot; 665 ioctl(fd, CDROM_MEDIA_CHANGED, slot); 666 667 inputs: 668 Slot number to be tested, always zero except for jukeboxes. 669 May also be special values CDSL_NONE or CDSL_CURRENT 670 671 outputs: 672 Ioctl return value is 0 or 1 depending on whether the media 673 has been changed, or -1 on error. 674 675 error returns: 676 ENOSYS Drive can't detect media change 677 EINVAL Slot number beyond capacity of drive 678 ENOMEM Out of memory 679 680 681 682CDROM_DRIVE_STATUS Get tray position, etc. 683 684 usage: 685 686 int slot; 687 ioctl(fd, CDROM_DRIVE_STATUS, slot); 688 689 inputs: 690 Slot number to be tested, always zero except for jukeboxes. 691 May also be special values CDSL_NONE or CDSL_CURRENT 692 693 outputs: 694 Ioctl return value will be one of the following values 695 from <linux/cdrom.h>: 696 697 CDS_NO_INFO Information not available. 698 CDS_NO_DISC 699 CDS_TRAY_OPEN 700 CDS_DRIVE_NOT_READY 701 CDS_DISC_OK 702 -1 error 703 704 error returns: 705 ENOSYS Drive can't detect drive status 706 EINVAL Slot number beyond capacity of drive 707 ENOMEM Out of memory 708 709 710 711 712CDROM_DISC_STATUS Get disc type, etc. 713 714 usage: 715 716 ioctl(fd, CDROM_DISC_STATUS, 0); 717 718 inputs: none 719 720 outputs: 721 Ioctl return value will be one of the following values 722 from <linux/cdrom.h>: 723 CDS_NO_INFO 724 CDS_AUDIO 725 CDS_MIXED 726 CDS_XA_2_2 727 CDS_XA_2_1 728 CDS_DATA_1 729 730 error returns: none at present 731 732 notes: 733 Source code comments state: 734 735 Ok, this is where problems start. The current interface for 736 the CDROM_DISC_STATUS ioctl is flawed. It makes the false 737 assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc. 738 Unfortunately, while this is often the case, it is also 739 very common for CDs to have some tracks with data, and some 740 tracks with audio. Just because I feel like it, I declare 741 the following to be the best way to cope. If the CD has 742 ANY data tracks on it, it will be returned as a data CD. 743 If it has any XA tracks, I will return it as that. Now I 744 could simplify this interface by combining these returns with 745 the above, but this more clearly demonstrates the problem 746 with the current interface. Too bad this wasn't designed 747 to use bitmasks... -Erik 748 749 Well, now we have the option CDS_MIXED: a mixed-type CD. 750 User level programmers might feel the ioctl is not very 751 useful. 752 ---david 753 754 755 756 757CDROM_CHANGER_NSLOTS Get number of slots 758 759 usage: 760 761 ioctl(fd, CDROM_CHANGER_NSLOTS, 0); 762 763 inputs: none 764 765 outputs: 766 The ioctl return value will be the number of slots in a 767 CD changer. Typically 1 for non-multi-disk devices. 768 769 error returns: none 770 771 772 773CDROM_LOCKDOOR lock or unlock door 774 775 usage: 776 777 int lock; 778 ioctl(fd, CDROM_LOCKDOOR, lock); 779 780 inputs: 781 Door lock flag, 1=lock, 0=unlock 782 783 outputs: none 784 785 error returns: 786 EDRIVE_CANT_DO_THIS Door lock function not supported. 787 EBUSY Attempt to unlock when multiple users 788 have the drive open and not CAP_SYS_ADMIN 789 790 notes: 791 As of 2.6.8.1, the lock flag is a global lock, meaning that 792 all CD drives will be locked or unlocked together. This is 793 probably a bug. 794 795 The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h> 796 and is currently (2.6.8.1) the same as EOPNOTSUPP 797 798 799 800CDROM_DEBUG Turn debug messages on/off 801 802 usage: 803 804 int debug; 805 ioctl(fd, CDROM_DEBUG, debug); 806 807 inputs: 808 Cdrom debug flag, 0=disable, 1=enable 809 810 outputs: 811 The ioctl return value will be the new debug flag. 812 813 error return: 814 EACCES Access denied: requires CAP_SYS_ADMIN 815 816 817 818CDROM_GET_CAPABILITY get capabilities 819 820 usage: 821 822 ioctl(fd, CDROM_GET_CAPABILITY, 0); 823 824 inputs: none 825 826 outputs: 827 The ioctl return value is the current device capability 828 flags. See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc. 829 830 831 832CDROMAUDIOBUFSIZ set the audio buffer size 833 834 usage: 835 836 int arg; 837 ioctl(fd, CDROMAUDIOBUFSIZ, val); 838 839 inputs: 840 New audio buffer size 841 842 outputs: 843 The ioctl return value is the new audio buffer size, or -1 844 on error. 845 846 error return: 847 ENOSYS Not supported by this driver. 848 849 notes: 850 Not supported by all drivers. 851 852 853 854DVD_READ_STRUCT Read structure 855 856 usage: 857 858 dvd_struct s; 859 ioctl(fd, DVD_READ_STRUCT, &s); 860 861 inputs: 862 dvd_struct structure, containing: 863 type specifies the information desired, one of 864 DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT, 865 DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA, 866 DVD_STRUCT_MANUFACT 867 physical.layer_num desired layer, indexed from 0 868 copyright.layer_num desired layer, indexed from 0 869 disckey.agid 870 871 outputs: 872 dvd_struct structure, containing: 873 physical for type == DVD_STRUCT_PHYSICAL 874 copyright for type == DVD_STRUCT_COPYRIGHT 875 disckey.value for type == DVD_STRUCT_DISCKEY 876 bca.{len,value} for type == DVD_STRUCT_BCA 877 manufact.{len,valu} for type == DVD_STRUCT_MANUFACT 878 879 error returns: 880 EINVAL physical.layer_num exceeds number of layers 881 EIO Received invalid response from drive 882 883 884 885DVD_WRITE_STRUCT Write structure 886 887 Not implemented, as of 2.6.8.1 888 889 890 891DVD_AUTH Authentication 892 893 usage: 894 895 dvd_authinfo ai; 896 ioctl(fd, DVD_AUTH, &ai); 897 898 inputs: 899 dvd_authinfo structure. See <linux/cdrom.h> 900 901 outputs: 902 dvd_authinfo structure. 903 904 error return: 905 ENOTTY ai.type not recognized. 906 907 908 909CDROM_SEND_PACKET send a packet to the drive 910 911 usage: 912 913 struct cdrom_generic_command cgc; 914 ioctl(fd, CDROM_SEND_PACKET, &cgc); 915 916 inputs: 917 cdrom_generic_command structure containing the packet to send. 918 919 outputs: none 920 cdrom_generic_command structure containing results. 921 922 error return: 923 EIO command failed. 924 EPERM Operation not permitted, either because a 925 write command was attempted on a drive which 926 is opened read-only, or because the command 927 requires CAP_SYS_RAWIO 928 EINVAL cgc.data_direction not set 929 930 931 932CDROM_NEXT_WRITABLE get next writable block 933 934 usage: 935 936 long next; 937 ioctl(fd, CDROM_NEXT_WRITABLE, &next); 938 939 inputs: none 940 941 outputs: 942 The next writable block. 943 944 notes: 945 If the device does not support this ioctl directly, the 946 ioctl will return CDROM_LAST_WRITTEN + 7. 947 948 949 950CDROM_LAST_WRITTEN get last block written on disc 951 952 usage: 953 954 long last; 955 ioctl(fd, CDROM_LAST_WRITTEN, &last); 956 957 inputs: none 958 959 outputs: 960 The last block written on disc 961 962 notes: 963 If the device does not support this ioctl directly, the 964 result is derived from the disc's table of contents. If the 965 table of contents can't be read, this ioctl returns an 966 error. 967