X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Frecord.h;h=2267d8a4733579c802fd7f2bad7ce3a5c963a738;hb=dc43fa5c6823b93c4206888e3bf639982af4563b;hp=fe6f41cea1505a8c16d754059ee021038dd64d5c;hpb=6184700b6c631a3ea1852687dbf4f8661b2608e4;p=bacula%2Fbacula diff --git a/bacula/src/stored/record.h b/bacula/src/stored/record.h index fe6f41cea1..2267d8a473 100644 --- a/bacula/src/stored/record.h +++ b/bacula/src/stored/record.h @@ -2,11 +2,13 @@ * Record, and label definitions for Bacula * media data format. * + * Kern Sibbald, MM + * * Version $Id$ * */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2000-2004 Kern Sibbald and John Walker This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -38,28 +40,38 @@ #define VOL_CREATE_ERROR 5 /* Error creating label */ #define VOL_VERSION_ERROR 6 /* Bacula version error */ #define VOL_LABEL_ERROR 7 /* Bad label type */ +#define VOL_NO_MEDIA 8 /* Hard error -- no media present */ -/* Length of Record Header (5 * 4 bytes) */ -#define RECHDR_LENGTH 20 +/* See block.h for RECHDR_LENGTH */ /* * This is the Media structure for a record header. * NB: when it is written it is serialized. - */ -typedef struct s_record_hdr { + uint32_t VolSessionId; uint32_t VolSessionTime; + + * The above 8 bytes are only written in a BB01 block, BB02 + * and later blocks contain these values in the block header + * rather than the record header. + int32_t FileIndex; int32_t Stream; uint32_t data_len; -} RECORD_HDR; -#define REC_NO_HEADER 0x01 /* No header read */ -#define REC_PARTIAL_RECORD 0x02 /* returning partial record */ -#define REC_BLOCK_EMPTY 0x04 /* not enough data in block */ -#define REC_NO_MATCH 0x08 /* No match on continuation data */ -#define REC_CONTINUATION 0x10 /* Continuation record found */ + */ + +/* Record state bit definitions */ +#define REC_NO_HEADER (1<<0) /* No header read */ +#define REC_PARTIAL_RECORD (1<<1) /* returning partial record */ +#define REC_BLOCK_EMPTY (1<<2) /* not enough data in block */ +#define REC_NO_MATCH (1<<3) /* No match on continuation data */ +#define REC_CONTINUATION (1<<4) /* Continuation record found */ +#define REC_ISTAPE (1<<5) /* Set if device is tape */ + +#define is_partial_record(r) ((r)->state & REC_PARTIAL_RECORD) +#define is_block_empty(r) ((r)->state & REC_BLOCK_EMPTY) /* * DEV_RECORD for reading and writing records. @@ -67,10 +79,11 @@ typedef struct s_record_hdr { * * This is the memory structure for the record header. */ -typedef struct s_dev_rec { - int sync; /* synchronous */ - /* File and Block are always returned on reading records, but - * only returned on writing if sync is set (obviously). +struct BSR; /* satisfy forward reference */ +struct DEV_RECORD { + dlink link; /* link for chaining in read_record.c */ + /* File and Block are always returned during reading + * and writing records. */ uint32_t File; /* File number */ uint32_t Block; /* Block number */ @@ -81,9 +94,10 @@ typedef struct s_dev_rec { uint32_t data_len; /* current record length */ uint32_t remainder; /* remaining bytes to read/write */ uint32_t state; /* state bits */ - uint8_t ser_buf[RECHDR_LENGTH]; /* serialized record header goes here */ + BSR *bsr; /* pointer to bsr that matched */ + uint8_t ser_buf[WRITE_RECHDR_LENGTH]; /* serialized record header goes here */ POOLMEM *data; /* Record data. This MUST be a memory pool item */ -} DEV_RECORD; +}; /* @@ -96,11 +110,15 @@ typedef struct s_dev_rec { #define EOM_LABEL -3 /* Writen at end of tape */ #define SOS_LABEL -4 /* Start of Session */ #define EOS_LABEL -5 /* End of Session */ - +#define EOT_LABEL -6 /* End of physical tape (2 eofs) */ /* - * Volume Label Record + * Volume Label Record. This is the in-memory definition. The + * tape definition is defined in the serialization code itself + * ser_volume_label() and unser_volume_label() and is slightly different. */ + + struct Volume_Label { /* * The first items in this structure are saved @@ -117,8 +135,15 @@ struct Volume_Label { uint32_t VerNum; /* Label version number */ + /* VerNum <= 10 */ float64_t label_date; /* Date tape labeled */ float64_t label_time; /* Time tape labeled */ + + /* VerNum >= 11 */ + btime_t label_btime; /* tdate tape labeled */ + btime_t write_btime; /* tdate tape written */ + + /* Unused with VerNum >= 11 */ float64_t write_date; /* Date this label written */ float64_t write_time; /* Time this label written */ @@ -129,9 +154,9 @@ struct Volume_Label { char MediaType[MAX_NAME_LENGTH]; /* Type of this media */ char HostName[MAX_NAME_LENGTH]; /* Host name of writing computer */ - char LabelProg[32]; /* Label program name */ - char ProgVersion[32]; /* Program version */ - char ProgDate[32]; /* Program build date/time */ + char LabelProg[50]; /* Label program name */ + char ProgVersion[50]; /* Program version */ + char ProgDate[50]; /* Program build date/time */ }; #define SER_LENGTH_Volume_Label 1024 /* max serialised length of volume label */ @@ -151,7 +176,13 @@ struct Session_Label { uint32_t JobId; /* Job id */ uint32_t VolumeIndex; /* Sequence no of volume for this job */ + /* VerNum >= 11 */ + btime_t write_btime; /* Tdate this label written */ + + /* VerNum < 11 */ float64_t write_date; /* Date this label written */ + + /* Unused VerNum >= 11 */ float64_t write_time; /* Time this label written */ char PoolName[MAX_NAME_LENGTH]; /* Pool name */ @@ -160,16 +191,18 @@ struct Session_Label { char ClientName[MAX_NAME_LENGTH]; char Job[MAX_NAME_LENGTH]; /* Unique name of this Job */ char FileSetName[MAX_NAME_LENGTH]; + char FileSetMD5[MAX_NAME_LENGTH]; uint32_t JobType; uint32_t JobLevel; /* The remainder are part of EOS label only */ uint32_t JobFiles; uint64_t JobBytes; - uint32_t start_block; - uint32_t end_block; - uint32_t start_file; - uint32_t end_file; + uint32_t StartBlock; + uint32_t EndBlock; + uint32_t StartFile; + uint32_t EndFile; uint32_t JobErrors; + uint32_t JobStatus; /* Job status */ }; typedef struct Session_Label SESSION_LABEL;