"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 */