2 Bacula(R) - The Network Backup Solution
4 Copyright (C) 2000-2015 Kern Sibbald
5 Copyright (C) 2001-2014 Free Software Foundation Europe e.V.
7 The original author of Bacula is Kern Sibbald, with contributions
8 from many others, a complete list can be found in the file AUTHORS.
10 You may use this file and others of this release according to the
11 license defined in the LICENSE file, which includes the Affero General
12 Public License, v3.0 ("AGPLv3") and some additional permissions and
13 terms pursuant to its AGPLv3 Section 7.
15 This notice must be preserved when any source code is
16 conveyed and/or propagated.
18 Bacula(R) is a registered trademark of Kern Sibbald.
22 * record-util.c -- Utilities for record handling
24 * Kern Sibbald, October MMXII
32 * Convert a FileIndex into a printable
33 * ASCII string. Not reentrant.
34 * If the FileIndex is negative, it flags the
35 * record as a Label, otherwise it is simply
36 * the FileIndex of the current file.
38 const char *FI_to_ascii(char *buf, int fi)
41 sprintf(buf, "%d", fi);
65 sprintf(buf, _("unknown: %d"), fi);
71 * Convert a Stream ID into a printable
72 * ASCII string. Not reentrant.
74 * A negative stream number represents
75 * stream data that is continued from a
76 * record in the previous block.
77 * If the FileIndex is negative, we are
78 * dealing with a Label, hence the
79 * stream is the JobId.
81 const char *stream_to_ascii(char *buf, int stream, int fi)
85 sprintf(buf, "%d", stream);
90 stream &= STREAMMASK_TYPE;
91 /* Stream was negative => all are continuation items */
93 case STREAM_UNIX_ATTRIBUTES:
95 case STREAM_FILE_DATA:
97 case STREAM_WIN32_DATA:
98 return "contWIN32-DATA";
99 case STREAM_WIN32_GZIP_DATA:
100 return "contWIN32-GZIP";
101 case STREAM_WIN32_COMPRESSED_DATA:
102 return "contWIN32-COMPRESSED";
103 case STREAM_MD5_DIGEST:
105 case STREAM_SHA1_DIGEST:
107 case STREAM_GZIP_DATA:
109 case STREAM_COMPRESSED_DATA:
110 return "contCOMPRESSED";
111 case STREAM_UNIX_ATTRIBUTES_EX:
112 return "contUNIX-ATTR-EX";
113 case STREAM_RESTORE_OBJECT:
114 return "contRESTORE-OBJECT";
115 case STREAM_SPARSE_DATA:
116 return "contSPARSE-DATA";
117 case STREAM_SPARSE_GZIP_DATA:
118 return "contSPARSE-GZIP";
119 case STREAM_SPARSE_COMPRESSED_DATA:
120 return "contSPARSE-COMPRESSED";
121 case STREAM_PROGRAM_NAMES:
122 return "contPROG-NAMES";
123 case STREAM_PROGRAM_DATA:
124 return "contPROG-DATA";
125 case STREAM_MACOS_FORK_DATA:
126 return "contMACOS-RSRC";
127 case STREAM_HFSPLUS_ATTRIBUTES:
128 return "contHFSPLUS-ATTR";
129 case STREAM_SHA256_DIGEST:
131 case STREAM_SHA512_DIGEST:
133 case STREAM_SIGNED_DIGEST:
134 return "contSIGNED-DIGEST";
135 case STREAM_ENCRYPTED_SESSION_DATA:
136 return "contENCRYPTED-SESSION-DATA";
137 case STREAM_ENCRYPTED_FILE_DATA:
138 return "contENCRYPTED-FILE";
139 case STREAM_ENCRYPTED_FILE_GZIP_DATA:
140 return "contENCRYPTED-GZIP";
141 case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA:
142 return "contENCRYPTED-COMPRESSED";
143 case STREAM_ENCRYPTED_WIN32_DATA:
144 return "contENCRYPTED-WIN32-DATA";
145 case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
146 return "contENCRYPTED-WIN32-GZIP";
147 case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA:
148 return "contENCRYPTED-WIN32-COMPRESSED";
149 case STREAM_ENCRYPTED_MACOS_FORK_DATA:
150 return "contENCRYPTED-MACOS-RSRC";
151 case STREAM_PLUGIN_NAME:
152 return "contPLUGIN-NAME";
155 sprintf(buf, "%d", -stream);
160 switch (stream & STREAMMASK_TYPE) {
161 case STREAM_UNIX_ATTRIBUTES:
163 case STREAM_FILE_DATA:
165 case STREAM_WIN32_DATA:
167 case STREAM_WIN32_GZIP_DATA:
169 case STREAM_WIN32_COMPRESSED_DATA:
170 return "WIN32-COMPRESSED";
171 case STREAM_MD5_DIGEST:
173 case STREAM_SHA1_DIGEST:
175 case STREAM_GZIP_DATA:
177 case STREAM_COMPRESSED_DATA:
179 case STREAM_UNIX_ATTRIBUTES_EX:
180 return "UNIX-ATTR-EX";
181 case STREAM_RESTORE_OBJECT:
182 return "RESTORE-OBJECT";
183 case STREAM_SPARSE_DATA:
184 return "SPARSE-DATA";
185 case STREAM_SPARSE_GZIP_DATA:
186 return "SPARSE-GZIP";
187 case STREAM_SPARSE_COMPRESSED_DATA:
188 return "SPARSE-COMPRESSED";
189 case STREAM_PROGRAM_NAMES:
191 case STREAM_PROGRAM_DATA:
193 case STREAM_PLUGIN_NAME:
194 return "PLUGIN-NAME";
195 case STREAM_MACOS_FORK_DATA:
197 case STREAM_HFSPLUS_ATTRIBUTES:
198 return "HFSPLUS-ATTR";
199 case STREAM_SHA256_DIGEST:
201 case STREAM_SHA512_DIGEST:
203 case STREAM_SIGNED_DIGEST:
204 return "SIGNED-DIGEST";
205 case STREAM_ENCRYPTED_SESSION_DATA:
206 return "ENCRYPTED-SESSION-DATA";
207 case STREAM_ENCRYPTED_FILE_DATA:
208 return "ENCRYPTED-FILE";
209 case STREAM_ENCRYPTED_FILE_GZIP_DATA:
210 return "ENCRYPTED-GZIP";
211 case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA:
212 return "ENCRYPTED-COMPRESSED";
213 case STREAM_ENCRYPTED_WIN32_DATA:
214 return "ENCRYPTED-WIN32-DATA";
215 case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
216 return "ENCRYPTED-WIN32-GZIP";
217 case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA:
218 return "ENCRYPTED-WIN32-COMPRESSED";
219 case STREAM_ENCRYPTED_MACOS_FORK_DATA:
220 return "ENCRYPTED-MACOS-RSRC";
223 sprintf(buf, "%d", stream);
229 * Return a new record entity
231 DEV_RECORD *new_record(void)
235 rec = (DEV_RECORD *)get_memory(sizeof(DEV_RECORD));
236 memset(rec, 0, sizeof(DEV_RECORD));
237 rec->data = get_pool_memory(PM_MESSAGE);
238 rec->wstate = st_none;
239 rec->rstate = st_none;
243 void empty_record(DEV_RECORD *rec)
245 rec->File = rec->Block = 0;
246 rec->VolSessionId = rec->VolSessionTime = 0;
247 rec->FileIndex = rec->Stream = 0;
248 rec->data_len = rec->remainder = 0;
249 rec->state_bits &= ~(REC_PARTIAL_RECORD|REC_BLOCK_EMPTY|REC_NO_MATCH|REC_CONTINUATION);
250 rec->wstate = st_none;
251 rec->rstate = st_none;
255 * Free the record entity
258 void free_record(DEV_RECORD *rec)
260 Dmsg0(950, "Enter free_record.\n");
262 free_pool_memory(rec->data);
264 Dmsg0(950, "Data buf is freed.\n");
265 free_pool_memory((POOLMEM *)rec);
266 Dmsg0(950, "Leave free_record.\n");
270 * Test if we can write whole record to the block
272 * Returns: false on failure
273 * true on success (all bytes can be written)
275 bool can_write_record_to_block(DEV_BLOCK *block, DEV_RECORD *rec)
279 remlen = block->buf_len - block->binbuf;
280 if (rec->remainder == 0) {
281 if (remlen >= WRITE_RECHDR_LENGTH) {
282 remlen -= WRITE_RECHDR_LENGTH;
283 rec->remainder = rec->data_len;
290 if (rec->remainder > 0 && remlen < rec->remainder) {
296 uint64_t get_record_address(DEV_RECORD *rec)
298 return ((uint64_t)rec->File)<<32 | rec->Block;