2 * Record, and label definitions for Bacula
9 Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2 of
14 the License, or (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public
22 License along with this program; if not, write to the Free
23 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
32 /* Return codes from read_device_volume_label() */
33 #define VOL_NOT_READ 0 /* Volume label not read */
34 #define VOL_OK 1 /* volume name OK */
35 #define VOL_NO_LABEL 2 /* volume not labeled */
36 #define VOL_IO_ERROR 3 /* volume I/O error */
37 #define VOL_NAME_ERROR 4 /* Volume name mismatch */
38 #define VOL_CREATE_ERROR 5 /* Error creating label */
39 #define VOL_VERSION_ERROR 6 /* Bacula version error */
40 #define VOL_LABEL_ERROR 7 /* Bad label type */
41 #define VOL_NO_MEDIA 8 /* Hard error -- no media present */
44 /* See block.h for RECHDR_LENGTH */
47 * This is the Media structure for a record header.
48 * NB: when it is written it is serialized.
50 uint32_t VolSessionId;
51 uint32_t VolSessionTime;
53 * The above 8 bytes are only written in a BB01 block, BB02
54 * and later blocks contain these values in the block header
55 * rather than the record header.
63 /* Record state bit definitions */
64 #define REC_NO_HEADER (1<<0) /* No header read */
65 #define REC_PARTIAL_RECORD (1<<1) /* returning partial record */
66 #define REC_BLOCK_EMPTY (1<<2) /* not enough data in block */
67 #define REC_NO_MATCH (1<<3) /* No match on continuation data */
68 #define REC_CONTINUATION (1<<4) /* Continuation record found */
69 #define REC_ISTAPE (1<<5) /* Set if device is tape */
71 #define is_partial_record(r) ((r)->state & REC_PARTIAL_RECORD)
72 #define is_block_empty(r) ((r)->state & REC_BLOCK_EMPTY)
75 * DEV_RECORD for reading and writing records.
76 * It consists of a Record Header, and the Record Data
78 * This is the memory structure for the record header.
81 int sync; /* synchronous */
82 /* File and Block are always returned on reading records, but
83 * only returned on writing if sync is set (obviously).
85 uint32_t File; /* File number */
86 uint32_t Block; /* Block number */
87 uint32_t VolSessionId; /* sequential id within this session */
88 uint32_t VolSessionTime; /* session start time */
89 int32_t FileIndex; /* sequential file number */
90 int32_t Stream; /* stream number */
91 uint32_t data_len; /* current record length */
92 uint32_t remainder; /* remaining bytes to read/write */
93 uint32_t state; /* state bits */
94 uint8_t ser_buf[WRITE_RECHDR_LENGTH]; /* serialized record header goes here */
95 POOLMEM *data; /* Record data. This MUST be a memory pool item */
100 * Values for LabelType that are put into the FileIndex field
101 * Note, these values are negative to distinguish them
102 * from user records where the FileIndex is forced positive.
104 #define PRE_LABEL -1 /* Vol label on unwritten tape */
105 #define VOL_LABEL -2 /* Volume label first file */
106 #define EOM_LABEL -3 /* Writen at end of tape */
107 #define SOS_LABEL -4 /* Start of Session */
108 #define EOS_LABEL -5 /* End of Session */
109 #define EOT_LABEL -6 /* End of physical tape (2 eofs) */
112 * Volume Label Record. This is the in-memory definition. The
113 * tape definition is defined in the serialization code itself
114 * ser_volume_label() and unser_volume_label() and is slightly different.
118 struct Volume_Label {
120 * The first items in this structure are saved
121 * in the DEVICE buffer, but are not actually written
124 int32_t LabelType; /* This is written in header only */
125 uint32_t LabelSize; /* length of serialized label */
127 * The items below this line are stored on
130 char Id[32]; /* Bacula Immortal ... */
132 uint32_t VerNum; /* Label version number */
135 float64_t label_date; /* Date tape labeled */
136 float64_t label_time; /* Time tape labeled */
139 btime_t label_btime; /* tdate tape labeled */
140 btime_t write_btime; /* tdate tape written */
142 /* Unused with VerNum >= 11 */
143 float64_t write_date; /* Date this label written */
144 float64_t write_time; /* Time this label written */
146 char VolName[MAX_NAME_LENGTH]; /* Volume name */
147 char PrevVolName[MAX_NAME_LENGTH]; /* Previous Volume Name */
148 char PoolName[MAX_NAME_LENGTH]; /* Pool name */
149 char PoolType[MAX_NAME_LENGTH]; /* Pool type */
150 char MediaType[MAX_NAME_LENGTH]; /* Type of this media */
152 char HostName[MAX_NAME_LENGTH]; /* Host name of writing computer */
153 char LabelProg[50]; /* Label program name */
154 char ProgVersion[50]; /* Program version */
155 char ProgDate[50]; /* Program build date/time */
158 #define SER_LENGTH_Volume_Label 1024 /* max serialised length of volume label */
159 #define SER_LENGTH_Session_Label 1024 /* max serialised length of session label */
161 typedef struct Volume_Label VOLUME_LABEL;
164 * Session Start/End Label
165 * This record is at the beginning and end of each session
167 struct Session_Label {
168 char Id[32]; /* Bacula Immortal ... */
170 uint32_t VerNum; /* Label version number */
172 uint32_t JobId; /* Job id */
173 uint32_t VolumeIndex; /* Sequence no of volume for this job */
176 btime_t write_btime; /* Tdate this label written */
179 float64_t write_date; /* Date this label written */
181 /* Unused VerNum >= 11 */
182 float64_t write_time; /* Time this label written */
184 char PoolName[MAX_NAME_LENGTH]; /* Pool name */
185 char PoolType[MAX_NAME_LENGTH]; /* Pool type */
186 char JobName[MAX_NAME_LENGTH]; /* base Job name */
187 char ClientName[MAX_NAME_LENGTH];
188 char Job[MAX_NAME_LENGTH]; /* Unique name of this Job */
189 char FileSetName[MAX_NAME_LENGTH];
190 char FileSetMD5[MAX_NAME_LENGTH];
193 /* The remainder are part of EOS label only */
201 uint32_t JobStatus; /* Job status */
204 typedef struct Session_Label SESSION_LABEL;
206 #define SERIAL_BUFSIZE 1024 /* volume serialisation buffer size */