"Fossies" - the Fresh Open Source Software Archive 
Member "xorriso-1.5.4/libburn/transport.h" (30 Jan 2021, 15481 Bytes) of package /linux/misc/xorriso-1.5.4.pl02.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "transport.h" see the
Fossies "Dox" file reference documentation and the last
Fossies "Diffs" side-by-side code changes report:
1.5.2_vs_1.5.4.
1 /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
2
3 /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
4 Copyright (c) 2006 - 2020 Thomas Schmitt <scdbackup@gmx.net>
5 Provided under GPL version 2 or later.
6 */
7
8
9 #ifndef __TRANSPORT
10 #define __TRANSPORT
11
12 #include "libburn.h"
13 #include "os.h"
14
15 #include <pthread.h>
16 /* sg data structures */
17 #include <sys/types.h>
18
19
20 /* see os.h for name of particular os-*.h where this is defined */
21 #define BUFFER_SIZE BURN_OS_TRANSPORT_BUFFER_SIZE
22
23
24 enum transfer_direction
25 { TO_DRIVE, FROM_DRIVE, NO_TRANSFER };
26
27 /* end of sg data structures */
28
29 /* generic 'drive' data structures */
30
31 struct cue_sheet
32 {
33 int count;
34 unsigned char *data;
35 };
36
37 struct params
38 {
39 int speed;
40 int retries;
41 };
42
43 struct buffer
44 {
45 /* ts A61219:
46 Added 4096 bytes reserve against possible buffer overflows.
47 (Changed in sector.c buffer flush test from >= to > BUFFER_SIZE .
48 This can at most cause a 1 sector overlap. Sometimes an offset
49 of 16 byte is applied to the output data (in some RAW mode). )
50 burn_write_opts.cdxa_conversion can imply an offset of 8 bytes.
51 */
52 unsigned char data[BUFFER_SIZE + 4096];
53 int sectors;
54 int bytes;
55 };
56
57 struct command
58 {
59 unsigned char opcode[16];
60 int oplen;
61 int dir;
62 int dxfer_len;
63 unsigned char sense[128];
64 int sense_len;
65 int error;
66 int retry;
67 struct buffer *page;
68 int timeout; /* milliseconds */
69
70 double start_time;
71 double end_time;
72
73 int retry_count;
74 int last_retry_key;
75 int last_retry_asc;
76 int last_retry_ascq;
77 };
78
79 struct burn_scsi_inquiry_data
80 {
81 char peripheral; /* bit0-4: device type should be 5
82 bit5-7: qualifier must be 0 */
83
84 char version; /* should be 3 (SPC-1) to 5 (SPC-3) (or higher ?)
85 but is often 0. */
86
87 char vendor[9];
88 char product[17];
89 char revision[5];
90
91 int valid;
92 };
93
94
95 struct scsi_mode_data
96 {
97 int p2a_valid;
98 int buffer_size;
99 int dvdram_read;
100 int dvdram_write;
101 int dvdr_read;
102 int dvdr_write;
103 int dvdrom_read;
104 int cdrw_read;
105 int cdrw_write;
106 int cdr_read;
107 int cdr_write;
108 int simulate;
109 int c2_pointers;
110 int underrun_proof;
111
112 int max_read_speed;
113 int cur_read_speed;
114 int max_write_speed;
115 int cur_write_speed;
116
117 /* ts A61021 */
118 int min_write_speed;
119
120 /* ts A61225 : Results from ACh GET PERFORMANCE, Type 03h
121 Speed values go into *_*_speed */
122 int min_end_lba;
123 int max_end_lba;
124 struct burn_speed_descriptor *speed_descriptors;
125
126 int retry_page_length;
127 int retry_page_valid;
128 int write_page_length;
129 int write_page_valid;
130 };
131
132
133 /* ts A70112 : represents a single Formattable Capacity Descriptor as of
134 mmc5r03c.pdf 6.24.3.3 . There can at most be 32 of them. */
135 struct burn_format_descr {
136 /* format type: e.g 0x00 is "Full", 0x15 is "Quick" */
137 int type;
138
139 /* the size in bytes derived from Number of Blocks */
140 off_t size;
141
142 /* the Type Dependent Parameter (usually the write alignment size) */
143 unsigned int tdp;
144 };
145
146
147 /* ts B40106 : represents a Feature Descriptor as of mmc5r03c.pdf 5.2.2
148 There can be many of them. Thus a linked list.
149 */
150 struct burn_feature_descr {
151 unsigned short feature_code;
152
153 unsigned char flags; /* bit0= current
154 bit1= persistent
155 bit2-5= version
156 */
157
158 unsigned char data_lenght;
159
160 /* Additional bytes after the first 4 bytes of the descriptor */
161 unsigned char *data;
162
163 struct burn_feature_descr *next;
164 };
165
166
167 /** Gets initialized in enumerate_common() and burn_drive_register() */
168 struct burn_drive
169 {
170 /* ts A70902:
171 0=null-emulation
172 1=MMC drive ,
173 2=stdio random read-write
174 3=stdio sequential write-only
175 4=stdio random read-only
176 5=stdio random write-only
177 */
178 int drive_role;
179
180 int bus_no;
181 int host;
182 int id;
183 int channel;
184 int lun;
185 char *devname;
186
187 /* ts A70302: mmc5r03c.pdf 5.3.2 Physical Interface Standard */
188 int phys_if_std; /* 1=SCSI, 2=ATAPI, 3,4,6=FireWire, 7=SATA, 8=USB */
189 char phys_if_name[80]; /* MMC-5 5.3.2 table 91 , e.g. "SCSI Family" */
190
191 /* see os.h for name of particular os-*.h where this is defined */
192 BURN_OS_TRANSPORT_DRIVE_ELEMENTS
193
194
195 /* ts A60904 : ticket 62, contribution by elmom */
196 /**
197 Tells the index in scanned burn_drive_info array.
198 -1 if fallen victim to burn_drive_info_forget()
199 */
200 int global_index;
201
202 pthread_mutex_t access_lock;
203
204 enum burn_disc_status status;
205 int erasable;
206
207 /* ts A61201 from 46h GET CONFIGURATION */
208 int current_profile;
209 char current_profile_text[80];
210 int current_is_cd_profile;
211 int current_is_supported_profile;
212 /* ts A90603 */
213 int current_is_guessed_profile;
214 /* ts A90815 */
215 unsigned char all_profiles[256];
216 int num_profiles;
217
218 /* ts B40106 : All feature descriptors as read from drive */
219 struct burn_feature_descr *features;
220
221 /* ts A70128 : MMC-to-MMC feature info from 46h for DVD-RW.
222 Quite internal. Regard as opaque :)
223 */
224 /* 1 = incremental recording available, 0 = not available */
225 int current_has_feat21h;
226
227 /* Some drives announce feature 21h on fast-blanked DVD-RW
228 although they cannot write them in Incremental mode.
229 0= does not look like the recent write run failed due to
230 Incremental on fast blanked DVD-RW
231 1= it seems to have happened
232 2= it seems to have happened with write address 0
233 */
234 int was_feat21h_failure;
235
236 /* Link Size item number 0 from feature 0021h descriptor */
237 int current_feat21h_link_size;
238
239 /* Flags from feature 0023h for formatting BD mmc5r03c.pdf 5.3.13
240 Byte 4 BD-RE:
241 bit0= Cert format 30h sub-type 10b
242 bit1= QCert format 30h sub-type 11b
243 bit2= Expand format 01h
244 bit3= RENoSA format 31h
245 Byte 8 BD-R:
246 bit0= RRM format 32h sub-type 10b
247 */
248 int current_feat23h_byte4;
249 int current_feat23h_byte8;
250
251
252 /* Flags from feature 002Fh feature descriptor mmc5r03c.pdf 5.3.25 :
253 bit1= DVD-RW supported
254 bit2= Test Write available
255 bit3= DVD-R DL supported
256 bit6= Buffer Under-run Free recording available (page 05h BUFE)
257 Value -1 indicates that no 002Fh was current in the features list.
258 */
259 int current_feat2fh_byte4;
260
261 /* ts B51016 : Result from feature 108h : Drive Serial Number
262 */
263 char *drive_serial_number;
264 int drive_serial_number_len;
265
266 /* ts B51016 : Result from command AB READ MEDIA SERIAL NUMBER
267 */
268 char *media_serial_number;
269 int media_serial_number_len;
270
271 /* ts B10524 : whether the damage bit was set for the future track.
272 bit0= damage bit , bit1= nwa valid bit
273 */
274 int next_track_damaged;
275
276 /* ts A70114 : whether a DVD-RW media holds an incomplete session
277 (which could need closing after write) */
278 int needs_close_session;
279 /* ts A71003 : whether a random write operation was done and no
280 synchronize cache has happened yet */
281 int needs_sync_cache;
282
283 /* ts A80412 : whether to use WRITE12 with Streaming bit set
284 rather than WRITE10. Speeds up DVD-RAM. Might help
285 with BD-RE */
286 int do_stream_recording;
287
288 /* ts A90227 : the LBA where stream recording shall start.
289 Writing to lower LBA will be done without streaming.
290 */
291 int stream_recording_start;
292
293 /* ts A61218 from 51h READ DISC INFORMATION */
294 int last_lead_in;
295 int last_lead_out;
296 int num_opc_tables; /* ts A91104: -1= not yet known */
297 int bg_format_status; /* 0=needs format start, 1=needs format restart*/
298 int disc_type; /* 0="CD-DA or CD-ROM", 0x10="CD-I", 0x20="CD-ROM XA" */
299 unsigned int disc_id; /* a "32 bit binary integer" */
300 char disc_bar_code[9];
301 int disc_app_code;
302 int disc_info_valid; /* bit0= disc_type , bit1= disc_id ,
303 bit2= disc_bar_code , bit3= disc_app_code
304 bit4= URU bit is set (= unrestricted use)
305 bit5= Erasable bit was set in reply
306 */
307
308 /* ts A70108 from 23h READ FORMAT CAPACITY mmc5r03c.pdf 6.24 */
309 int format_descr_type; /* 1=unformatted, 2=formatted, 3=unclear */
310 off_t format_curr_max_size; /* meaning depends on format_descr_type */
311 unsigned int format_curr_blsas; /* dito */
312 int best_format_type;
313 off_t best_format_size;
314
315 /* The complete list of format descriptors as read with 23h */
316 int num_format_descr;
317 struct burn_format_descr format_descriptors[32];
318
319
320 volatile int released;
321
322 /* ts A61106 */
323 /* 0= report errors
324 1= do not report errors
325 2= do not report errors which the libburn function indicates in
326 member .had_particular_error
327 3= report errors with severity DEBUG
328 */
329 int silent_on_scsi_error;
330
331 /* ts B21023 */
332 /* bit0= 5 64 00 occurred with READ10 in mmc_read_10()
333 */
334 int had_particular_error;
335
336 int stdio_fd;
337
338 int nwa; /* next writeable address */
339 int alba; /* absolute lba */
340 int rlba; /* relative lba in section */
341 int start_lba;
342 int end_lba;
343
344 /* ts B61116 */
345 int do_simulate;
346
347 /* ts A70131 : from 51h READ DISC INFORMATION Number of Sessions (-1)*/
348 int complete_sessions;
349 /* ts A90107 */
350 int state_of_last_session;
351
352 #ifdef Libburn_disc_with_incomplete_sessioN
353 /* ts B30112 */
354 int incomplete_sessions;
355 #endif
356
357
358 /* ts A70129 :
359 from 51h READ DISC INFORMATION Last Track Number in Last Session */
360 int last_track_no;
361
362 /* ts B10730 : whether a default mode page 05 was already sent.
363 */
364 int sent_default_page_05;
365 /* ts A70212 : from various sources : free space on media (in bytes)
366 With CD this might change after particular write
367 parameters have been set and nwa has been inquired.
368 (e.g. by d->send_write_parameters() ; d->get_nwa()).
369 */
370 off_t media_capacity_remaining;
371 /* ts A70215 : if > 0 : first lba on media that is too high for write*/
372 int media_lba_limit;
373
374 /* ts A81210 : Upper limit of readable data size,
375 0x7fffffff = unknown
376 0x7ffffff0 = 32 bit overflow, or unknown stdio size
377 */
378 int media_read_capacity;
379 /* ts B60305 : Whether READ CAPACITY of CD is credible:
380 -1= no READ CAPACITY yet , 0= untrusted READ CAPACITY
381 1= READ CAPACITY confirmed or corrected by other commands
382 */
383 int mr_capacity_trusted;
384
385 /* ts B10314 : Next Writeable Address for drive_role == 5 */
386 int role_5_nwa;
387
388 /* ts B60730 */
389 int do_no_immed;
390
391 int toc_temp;
392 struct burn_disc *disc; /* disc structure */
393 int block_types[4];
394 struct buffer *buffer;
395 struct burn_progress progress;
396
397 /* To be used by mmc.c, sbc.c, spc.c for SCSI commands where the struct
398 content surely does not have to persist while another command gets
399 composed and executed.
400 (Inherently, sending SCSI commands to the same drive cannot be
401 thread-safe. But there are functions which send SCSI commands
402 and also call other such functions. These shall use own allocated
403 command structs and not this struct here.)
404 */
405 struct command casual_command;
406
407 /* ts A70711 : keeping an eye on the drive buffer */
408 off_t pessimistic_buffer_free;
409 int pbf_altered;
410 int wait_for_buffer_free;
411 int nominal_write_speed;
412 unsigned int wfb_min_usec;
413 unsigned int wfb_max_usec;
414 unsigned int wfb_timeout_sec;
415 unsigned int wfb_min_percent;
416 unsigned int wfb_max_percent;
417 unsigned int pessimistic_writes;
418 unsigned int waited_writes;
419 unsigned int waited_tries;
420 unsigned int waited_usec;
421
422 volatile int cancel;
423 volatile enum burn_drive_status busy;
424
425 /* During write runs, this points to a copy of the applied
426 struct burn_write_opts. Only read this underneath
427 burn_disc_write_sync() which removes the copy when done.
428 Especially do not read it from outside the write thread.
429 */
430 struct burn_write_opts *write_opts;
431
432 /* ts A70929 */
433 pid_t thread_pid;
434 int thread_pid_valid;
435 /* ts B00225 */
436 pthread_t thread_tid;
437
438 /* ts B90513 */
439 unsigned int write_retry_count;
440
441 /* ts C00806 */
442 /* 0=no change, 1=change, -1=already urged OS to revalidate medium */
443 int medium_state_changed;
444
445 /* ts C00822 */
446 /* If set, use Exact bit with SET STREAMING and use SET STREAMING
447 even if the medium is a CD.
448 */
449 int set_streaming_exact_bit;
450 int set_streaming_err;
451
452 /* transport functions */
453 int (*grab) (struct burn_drive *);
454 int (*release) (struct burn_drive *);
455
456 /* ts A61021 */
457 int (*drive_is_open) (struct burn_drive *);
458
459 int (*issue_command) (struct burn_drive *, struct command *);
460
461 /* lower level functions */
462 void (*erase) (struct burn_drive *, int);
463 void (*getcaps) (struct burn_drive *);
464
465 /* ts A61021 */
466 void (*read_atip) (struct burn_drive *);
467
468 int (*write) (struct burn_drive *, int, struct buffer *);
469 void (*read_toc) (struct burn_drive *);
470 void (*lock) (struct burn_drive *);
471 void (*unlock) (struct burn_drive *);
472 void (*eject) (struct burn_drive *);
473 void (*load) (struct burn_drive *);
474 int (*start_unit) (struct burn_drive *);
475
476 /* ts A90824 : Calming down noisy drives */
477 int (*stop_unit) (struct burn_drive *);
478 int is_stopped;
479
480 void (*read_disc_info) (struct burn_drive *);
481 int (*read_cd) (struct burn_drive *, int start, int len,
482 int sec_type, int main_ch,
483 const struct burn_read_opts *, struct buffer *,
484 int flag);
485 void (*perform_opc) (struct burn_drive *);
486 void (*set_speed) (struct burn_drive *, int, int);
487 void (*send_parameters) (struct burn_drive *,
488 const struct burn_read_opts *);
489 void (*send_write_parameters) (struct burn_drive *,
490 struct burn_session *, int tno,
491 const struct burn_write_opts *);
492 int (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
493
494 /* ts A70205 : Announce size of a DVD-R[W] DAO session. */
495 int (*reserve_track) (struct burn_drive *d, off_t size);
496
497 void (*sync_cache) (struct burn_drive *);
498 int (*get_erase_progress) (struct burn_drive *);
499 int (*get_nwa) (struct burn_drive *, int trackno, int *lba, int *nwa);
500
501 /* ts A70131 : obtain (possibly fake) TOC number and start lba of
502 first track in last complete session */
503 int (*read_multi_session_c1)(struct burn_drive *d,
504 int *trackno, int *start);
505
506 /* ts A61009 : removed d in favor of o->drive */
507 /* void (*close_disc) (struct burn_drive * d,
508 struct burn_write_opts * o);
509 void (*close_session) (struct burn_drive * d,
510 struct burn_write_opts * o);
511 */
512 void (*close_disc) (struct burn_write_opts * o);
513 void (*close_session) ( struct burn_write_opts * o);
514
515 /* ts A61029 */
516 void (*close_track_session) ( struct burn_drive *d,
517 int session, int track);
518
519 int (*test_unit_ready) (struct burn_drive * d);
520 void (*probe_write_modes) (struct burn_drive * d);
521 struct params params;
522 struct burn_scsi_inquiry_data *idata;
523 struct scsi_mode_data *mdata;
524 int toc_entries;
525 struct burn_toc_entry *toc_entry;
526
527 /* ts A61023 : get size and free space of drive buffer */
528 int (*read_buffer_capacity) (struct burn_drive *d);
529
530 /* ts A61220 : format media (e.g. DVD+RW) */
531 int (*format_unit) (struct burn_drive *d, off_t size, int flag);
532
533 /* ts A70108 */
534 /* mmc5r03c.pdf 6.24 : get list of available formats */
535 int (*read_format_capacities) (struct burn_drive *d, int top_wanted);
536
537 /* ts A70812 */
538 /* mmc5r03c.pdf 6.15 : read data sectors (start and amount in LBA) */
539 int (*read_10) (struct burn_drive *d, int start, int amount,
540 struct buffer *buf);
541
542 };
543
544 /* end of generic 'drive' data structures */
545
546 /* ts A80422 : centralizing this setting for debugging purposes
547 */
548 int burn_drive_set_media_capacity_remaining(struct burn_drive *d, off_t value);
549
550
551 #endif /* __TRANSPORT */