Linux-2.6.12-rc2
[linux-3.10.git] / Documentation / ioctl / cdrom.txt
1                 Summary of CDROM ioctl calls.
2                 ============================
3
4                 Edward A. Falk <efalk@google.com>
5
6                 November, 2004
7
8 This document attempts to describe the ioctl(2) calls supported by
9 the CDROM layer.  These are by-and-large implemented (as of Linux 2.6)
10 in drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c
11
12 ioctl values are listed in <linux/cdrom.h>.  As of this writing, they
13 are 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
70 The information that follows was determined from reading kernel source
71 code.  It is likely that some corrections will be made over time.
72
73
74
75
76
77
78
79 General:
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
97 CDROMPAUSE                      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
111 CDROMRESUME                     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
125 CDROMPLAYMSF                    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
149 CDROMPLAYTRKIND                 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
170 CDROMREADTOCHDR                 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
188 CDROMREADTOCENTRY               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
214 CDROMSTOP                       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
232 CDROMSTART                      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
251 CDROMEJECT                      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
270 CDROMCLOSETRAY                  pendant of CDROMEJECT
271
272         usage:
273
274           ioctl(fd, CDROMEJECT, 0);
275
276         inputs:         none
277
278         outputs:        none
279
280         error returns:
281           ENOSYS        cd drive not capable of ejecting
282           EBUSY         other processes are accessing drive, or door is locked
283
284         notes:
285           See CDROM_LOCKDOOR, below.
286
287
288
289 CDROMVOLCTRL                    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
307 CDROMVOLREAD                    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
325 CDROMSUBCHNL                    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
347 CDROMREADRAW                    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
382 CDROMREADMODE1                  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
391 CDROMREADMODE2                  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
400 CDROMREADAUDIO                  (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
421 CDROMEJECT_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
440 CDROMMULTISESSION               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
460 CDROM_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
488 CDROM_GET_UPC                   CDROM_GET_MCN  (deprecated)
489
490         Not implemented, as of 2.6.8.1
491
492
493
494 CDROMRESET                      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
511 CDROMREADCOOKED                 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
529 CDROMREADALL                    read all 2646 bytes
530
531         Same as CDROMREADCOOKED, but reads 2646 bytes.
532
533
534
535 CDROMSEEK                       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
549 CDROMPLAYBLK                    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
563 CDROMGETSPINDOWN
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
578 CDROMSETSPINDOWN
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
594 CDROM_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
619 CDROM_CLEAR_OPTIONS             Clear behavior options
620
621         Same as CDROM_SET_OPTIONS, except that selected options are
622         turned off.
623
624
625
626 CDROM_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
643 CDROM_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
660 CDROM_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
682 CDROM_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
712 CDROM_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             Unfortunatly, 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
757 CDROM_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
773 CDROM_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
800 CDROM_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
818 CDROM_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
832 CDROMAUDIOBUFSIZ                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
854 DVD_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           Recieved invalid response from drive
882
883
884
885 DVD_WRITE_STRUCT                Write structure
886
887         Not implemented, as of 2.6.8.1
888
889
890
891 DVD_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
909 CDROM_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
932 CDROM_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
950 CDROM_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.