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