1 /*
2 BAREOS® - Backup Archiving REcovery Open Sourced
3
4 Copyright (C) 2007-2012 Free Software Foundation Europe e.V.
5 Copyright (C) 2016-2020 Bareos GmbH & Co. KG
6
7 This program is Free Software; you can redistribute it and/or
8 modify it under the terms of version three of the GNU Affero General Public
9 License as published by the Free Software Foundation, which is
10 listed in the file LICENSE.
11
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Affero General Public License for more details.
16
17 You should have received a copy of the GNU Affero General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.
21 */
22 /*
23 * Kern Sibbald, October 2007
24 */
25 /**
26 * @file
27 * A simple test plugin for the Bareos File Daemon derived from
28 * the bpipe plugin, but used for testing new features.
29 */
30 #include "include/bareos.h"
31 #include "filed/fd_plugins.h"
32 #include "plugins/include/common.h"
33 #include "lib/ini.h"
34 #include <wchar.h>
35
36 namespace filedaemon {
37
38 static const int debuglevel = 000;
39
40 #define PLUGIN_LICENSE "Bareos AGPLv3"
41 #define PLUGIN_AUTHOR "Kern Sibbald"
42 #define PLUGIN_DATE "May 2011"
43 #define PLUGIN_VERSION "3"
44 #define PLUGIN_DESCRIPTION "Bareos Test File Daemon Plugin"
45
46 /* Forward referenced functions */
47 static bRC newPlugin(PluginContext* ctx);
48 static bRC freePlugin(PluginContext* ctx);
49 static bRC getPluginValue(PluginContext* ctx, pVariable var, void* value);
50 static bRC setPluginValue(PluginContext* ctx, pVariable var, void* value);
51 static bRC handlePluginEvent(PluginContext* ctx, bEvent* event, void* value);
52 static bRC startBackupFile(PluginContext* ctx, struct save_pkt* sp);
53 static bRC endBackupFile(PluginContext* ctx);
54 static bRC pluginIO(PluginContext* ctx, struct io_pkt* io);
55 static bRC startRestoreFile(PluginContext* ctx, const char* cmd);
56 static bRC endRestoreFile(PluginContext* ctx);
57 static bRC createFile(PluginContext* ctx, struct restore_pkt* rp);
58 static bRC setFileAttributes(PluginContext* ctx, struct restore_pkt* rp);
59 static bRC checkFile(PluginContext* ctx, char* fname);
60 static bRC getAcl(PluginContext* ctx, acl_pkt* ap);
61 static bRC setAcl(PluginContext* ctx, acl_pkt* ap);
62 static bRC getXattr(PluginContext* ctx, xattr_pkt* xp);
63 static bRC setXattr(PluginContext* ctx, xattr_pkt* xp);
64
65 /* Pointers to Bareos functions */
66 static CoreFunctions* bareos_core_functions = NULL;
67 static PluginApiDefinition* bareos_plugin_interface_version = NULL;
68
69 /* Plugin Information block */
70 static PluginInformation pluginInfo
71 = {sizeof(pluginInfo), FD_PLUGIN_INTERFACE_VERSION,
72 FD_PLUGIN_MAGIC, PLUGIN_LICENSE,
73 PLUGIN_AUTHOR, PLUGIN_DATE,
74 PLUGIN_VERSION, PLUGIN_DESCRIPTION};
75
76 /* Plugin entry points for Bareos */
77 static PluginFunctions pluginFuncs
78 = {sizeof(pluginFuncs), FD_PLUGIN_INTERFACE_VERSION,
79
80 /* Entry points into plugin */
81 newPlugin, /* new plugin instance */
82 freePlugin, /* free plugin instance */
83 getPluginValue, setPluginValue, handlePluginEvent, startBackupFile,
84 endBackupFile, startRestoreFile, endRestoreFile, pluginIO, createFile,
85 setFileAttributes, checkFile, getAcl, setAcl, getXattr, setXattr};
86
87 static struct ini_items test_items[] = {
88 // name type comment required
89 {"string1", INI_CFG_TYPE_STR, "Special String", 1},
90 {"string2", INI_CFG_TYPE_STR, "2nd String", 0},
91 {"ok", INI_CFG_TYPE_BOOL, "boolean", 0},
92 // We can also use the ITEMS_DEFAULT
93 // { "ok", INI_CFG_TYPE_BOOL, "boolean", 0, ITEMS_DEFAULT },
94 {NULL, 0, NULL, 0}};
95
96 /**
97 * Plugin private context
98 */
99 struct plugin_ctx {
100 boffset_t offset;
101 FILE* fd; /* pipe file descriptor */
102 char* cmd; /* plugin command line */
103 char* fname; /* filename to "backup/restore" */
104 char* reader; /* reader program for backup */
105 char* writer; /* writer program for backup */
106
107 char where[512];
108 int replace;
109
110 int nb_obj; /* Number of objects created */
111 POOLMEM* buf; /* store ConfigFile */
112 };
113
114 #ifdef __cplusplus
115 extern "C" {
116 #endif
117
118 /**
119 * loadPlugin() and unloadPlugin() are entry points that are
120 * exported, so Bareos can directly call these two entry points
121 * they are common to all Bareos plugins.
122 */
123 /**
124 * External entry point called by Bareos to "load" the plugin
125 */
loadPlugin(PluginApiDefinition * lbareos_plugin_interface_version,CoreFunctions * lbareos_core_functions,PluginInformation ** plugin_information,PluginFunctions ** plugin_functions)126 bRC loadPlugin(PluginApiDefinition* lbareos_plugin_interface_version,
127 CoreFunctions* lbareos_core_functions,
128 PluginInformation** plugin_information,
129 PluginFunctions** plugin_functions)
130 {
131 bareos_core_functions
132 = lbareos_core_functions; /* set Bareos funct pointers */
133 bareos_plugin_interface_version = lbareos_plugin_interface_version;
134 *plugin_information = &pluginInfo; /* return pointer to our info */
135 *plugin_functions = &pluginFuncs; /* return pointer to our functions */
136
137 return bRC_OK;
138 }
139
140 /**
141 * External entry point to unload the plugin
142 */
unloadPlugin()143 bRC unloadPlugin() { return bRC_OK; }
144
145 #ifdef __cplusplus
146 }
147 #endif
148
149 /**
150 * The following entry points are accessed through the function
151 * pointers we supplied to Bareos. Each plugin type (dir, fd, sd)
152 * has its own set of entry points that the plugin must define.
153 */
154 /**
155 * Create a new instance of the plugin i.e. allocate our private storage
156 */
newPlugin(PluginContext * ctx)157 static bRC newPlugin(PluginContext* ctx)
158 {
159 struct plugin_ctx* p_ctx
160 = (struct plugin_ctx*)malloc(sizeof(struct plugin_ctx));
161 if (!p_ctx) { return bRC_Error; }
162 p_ctx = (plugin_ctx*)memset(p_ctx, 0, sizeof(struct plugin_ctx));
163 ctx->plugin_private_context = (void*)p_ctx; /* set our context pointer */
164
165 bareos_core_functions->registerBareosEvents(
166 ctx, 5, bEventJobStart, bEventEndFileSet, bEventRestoreObject,
167 bEventEstimateCommand, bEventBackupCommand);
168
169 return bRC_OK;
170 }
171
172 /**
173 * Free a plugin instance, i.e. release our private storage
174 */
freePlugin(PluginContext * ctx)175 static bRC freePlugin(PluginContext* ctx)
176 {
177 struct plugin_ctx* p_ctx = (struct plugin_ctx*)ctx->plugin_private_context;
178 if (!p_ctx) { return bRC_Error; }
179 if (p_ctx->buf) { FreePoolMemory(p_ctx->buf); }
180 if (p_ctx->cmd) { free(p_ctx->cmd); /* free any allocated command string */ }
181 free(p_ctx); /* free our private context */
182 ctx->plugin_private_context = NULL;
183 return bRC_OK;
184 }
185
186 /**
187 * Return some plugin value (none defined)
188 */
getPluginValue(PluginContext * ctx,pVariable var,void * value)189 static bRC getPluginValue(PluginContext* ctx, pVariable var, void* value)
190 {
191 return bRC_OK;
192 }
193
194 /**
195 * Set a plugin value (none defined)
196 */
setPluginValue(PluginContext * ctx,pVariable var,void * value)197 static bRC setPluginValue(PluginContext* ctx, pVariable var, void* value)
198 {
199 return bRC_OK;
200 }
201
202 /**
203 * Handle an event that was generated in Bareos
204 */
handlePluginEvent(PluginContext * ctx,bEvent * event,void * value)205 static bRC handlePluginEvent(PluginContext* ctx, bEvent* event, void* value)
206 {
207 struct plugin_ctx* p_ctx = (struct plugin_ctx*)ctx->plugin_private_context;
208 restore_object_pkt* rop;
209 if (!p_ctx) { return bRC_Error; }
210
211 // char *name;
212
213 switch (event->eventType) {
214 case bEventJobStart:
215 Dmsg(ctx, debuglevel, "test-plugin-fd: JobStart=%s\n", (char*)value);
216 break;
217 case bEventEndFileSet:
218 /*
219 * End of Dir FileSet commands, now we can add excludes
220 */
221 bareos_core_functions->NewOptions(ctx);
222 bareos_core_functions->AddWild(ctx, "*.c", ' ');
223 bareos_core_functions->AddWild(ctx, "*.cpp", ' ');
224 bareos_core_functions->AddOptions(ctx, "ei"); /* exclude, ignore case */
225 bareos_core_functions->AddExclude(ctx,
226 "/home/user/bareos/regress/README");
227 break;
228 case bEventRestoreObject: {
229 FILE* fp;
230 POOLMEM* q;
231 char* working;
232 static int _nb = 0;
233
234 printf("Plugin RestoreObject\n");
235 if (!value) {
236 Dmsg(ctx, debuglevel, "test-plugin-fd: End restore objects\n");
237 break;
238 }
239 rop = (restore_object_pkt*)value;
240 Dmsg(ctx, debuglevel,
241 "Get RestoreObject len=%d JobId=%d oname=%s type=%d data=%.127s\n",
242 rop->object_len, rop->JobId, rop->object_name, rop->object_type,
243 rop->object);
244 q = GetPoolMemory(PM_FNAME);
245
246 bareos_core_functions->getBareosValue(ctx, bVarWorkingDir, &working);
247 Mmsg(q, "%s/restore.%d", working, _nb++);
248 if ((fp = fopen(q, "w")) != NULL) {
249 fwrite(rop->object, rop->object_len, 1, fp);
250 fclose(fp);
251 }
252
253 FreePoolMemory(q);
254
255 if (!strcmp(rop->object_name, INI_RESTORE_OBJECT_NAME)) {
256 ConfigFile ini;
257 if (!ini.DumpString(rop->object, rop->object_len)) { break; }
258 ini.RegisterItems(test_items, sizeof(struct ini_items));
259 if (ini.parse(ini.out_fname)) {
260 Jmsg(ctx, M_INFO, "string1 = %s\n", ini.items[0].val.strval);
261 } else {
262 Jmsg(ctx, M_ERROR, "Can't parse config\n");
263 }
264 }
265
266 break;
267 }
268 case bEventEstimateCommand:
269 /* Fall-through wanted */
270 case bEventBackupCommand: {
271 /*
272 * Plugin command e.g. plugin = <plugin-name>:<name-space>:read
273 * command:write command
274 */
275 char* p;
276
277 Dmsg(ctx, debuglevel, "test-plugin-fd: pluginEvent cmd=%s\n",
278 (char*)value);
279 p_ctx->cmd = strdup((char*)value);
280 p = strchr(p_ctx->cmd, ':');
281 if (!p) {
282 Jmsg(ctx, M_FATAL, "Plugin terminator not found: %s\n", (char*)value);
283 Dmsg(ctx, debuglevel, "Plugin terminator not found: %s\n",
284 (char*)value);
285 return bRC_Error;
286 }
287 *p++ = 0; /* Terminate plugin */
288 p_ctx->fname = p;
289 p = strchr(p, ':');
290 if (!p) {
291 Jmsg(ctx, M_FATAL, "File terminator not found: %s\n", (char*)value);
292 Dmsg(ctx, debuglevel, "File terminator not found: %s\n", (char*)value);
293 return bRC_Error;
294 }
295 *p++ = 0; /* Terminate file */
296 p_ctx->reader = p;
297 p = strchr(p, ':');
298 if (!p) {
299 Jmsg(ctx, M_FATAL, "Reader terminator not found: %s\n", (char*)value);
300 Dmsg(ctx, debuglevel, "Reader terminator not found: %s\n",
301 (char*)value);
302 return bRC_Error;
303 }
304 *p++ = 0; /* Terminate reader string */
305 p_ctx->writer = p;
306 Dmsg(ctx, debuglevel,
307 "test-plugin-fd: plugin=%s fname=%s reader=%s writer=%s\n",
308 p_ctx->cmd, p_ctx->fname, p_ctx->reader, p_ctx->writer);
309 break;
310 }
311 default:
312 Dmsg(ctx, debuglevel, "test-plugin-fd: unknown event=%d\n",
313 event->eventType);
314 break;
315 }
316
317 return bRC_OK;
318 }
319
320 /**
321 * Start the backup of a specific file
322 */
startBackupFile(PluginContext * ctx,struct save_pkt * sp)323 static bRC startBackupFile(PluginContext* ctx, struct save_pkt* sp)
324 {
325 struct plugin_ctx* p_ctx = (struct plugin_ctx*)ctx->plugin_private_context;
326 if (!p_ctx) { return bRC_Error; }
327
328 if (p_ctx->nb_obj == 0) {
329 sp->fname = (char*)"takeme.h";
330 Dmsg(ctx, debuglevel, "AcceptFile=%s = %d\n", sp->fname,
331 bareos_core_functions->AcceptFile(ctx, sp));
332
333 sp->fname = (char*)"/path/to/excludeme.o";
334 Dmsg(ctx, debuglevel, "AcceptFile=%s = %d\n", sp->fname,
335 bareos_core_functions->AcceptFile(ctx, sp));
336
337 sp->fname = (char*)"/path/to/excludeme.c";
338 Dmsg(ctx, debuglevel, "AcceptFile=%s = %d\n", sp->fname,
339 bareos_core_functions->AcceptFile(ctx, sp));
340 }
341
342 if (p_ctx->nb_obj == 0) {
343 sp->object_name = (char*)"james.xml";
344 sp->object = (char *)"This is test data for the restore object. "
345 "garbage=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
346 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
347 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
348 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
349 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
350 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
351 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
352 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
353 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
354 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
355 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
356 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
357 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
358 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
359 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
360 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
361 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
362 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
363 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
364 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
365 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
366 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
367 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
368 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
369 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
370 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
371 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
372 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
373 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
374 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
375 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
376 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
377 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
378 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
379 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
380 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
381 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
382 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
383 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
384 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
385 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
386 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
387 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
388 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
389 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
390 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
391 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
392 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
393 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
394 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
395 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
396 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
397 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
398 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
399 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
400 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
401 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
402 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
403 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
404 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
405 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
406 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
407 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
408 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
409 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
410 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
411 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
412 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
413 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
414 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
415 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
416 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
417 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
418 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
419 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
420 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
421 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
422 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
423 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
424 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
425 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
426 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
427 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
428 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
429 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
430 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
431 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
432 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
433 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
434 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
435 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
436 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
437 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
438 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
439 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
440 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
441 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
442 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
443 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
444 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
445 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
446 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
447 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
448 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
449 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
450 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
451 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
452 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
453 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
454 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
455 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
456 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
457 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
458 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
459 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
460 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
461 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
462 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
463 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
464 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
465 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
466 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
467 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
468 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
469 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
470 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
471 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
472 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
473 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
474 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
475 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
476 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
477 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
478 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
479 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
480 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
481 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
482 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
483 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
484 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
485 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
486 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
487 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
488 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
489 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
490 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
491 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
492 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
493 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
494 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
495 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
496 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
497 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
498 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
499 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
500 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
501 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
502 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
503 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
504 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
505 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
506 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
507 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
508 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
509 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
510 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
511 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
512 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
513 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
514 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
515 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
516 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
517 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
518 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
519 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
520 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
521 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
522 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
523 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
524 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
525 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
526 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
527 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
528 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
529 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
530 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
531 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
532 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
533 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
534 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
535 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
536 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
537 "\0secret";
538 sp->object_len = strlen(sp->object) + 1 + 6 + 1; /* str + 0 + secret + 0 */
539 sp->type = FT_RESTORE_FIRST;
540
541 static int _nb = 0;
542 POOLMEM* q = GetPoolMemory(PM_FNAME);
543 char* working;
544 FILE* fp;
545
546 bareos_core_functions->getBareosValue(ctx, bVarWorkingDir, &working);
547 Mmsg(q, "%s/torestore.%d", working, _nb++);
548 if ((fp = fopen(q, "w")) != NULL) {
549 fwrite(sp->object, sp->object_len, 1, fp);
550 fclose(fp);
551 }
552 FreePoolMemory(q);
553
554 } else if (p_ctx->nb_obj == 1) {
555 ConfigFile ini;
556
557 p_ctx->buf = GetPoolMemory(PM_BSOCK);
558 Dmsg(ctx, debuglevel, "p_ctx->buf = 0x%x\n", p_ctx->buf);
559 ini.RegisterItems(test_items, sizeof(struct ini_items));
560
561 sp->object_name = (char*)INI_RESTORE_OBJECT_NAME;
562 sp->object_len = ini.Serialize(p_ctx->buf);
563 sp->object = p_ctx->buf;
564 sp->type = FT_PLUGIN_CONFIG;
565
566 Dmsg(ctx, debuglevel, "RestoreOptions=<%s>\n", p_ctx->buf);
567 }
568
569 time_t now = time(NULL);
570 sp->index = ++p_ctx->nb_obj;
571 sp->statp.st_mode = 0700 | S_IFREG;
572 sp->statp.st_ctime = now;
573 sp->statp.st_mtime = now;
574 sp->statp.st_atime = now;
575 sp->statp.st_size = sp->object_len;
576 sp->statp.st_blksize = 4096;
577 sp->statp.st_blocks = 1;
578 Dmsg(ctx, debuglevel, "Creating RestoreObject len=%d oname=%s data=%.127s\n",
579 sp->object_len, sp->object_name, sp->object);
580 Dmsg(ctx, debuglevel, "test-plugin-fd: startBackupFile\n");
581 return bRC_OK;
582 }
583
getAcl(PluginContext * ctx,acl_pkt * ap)584 static bRC getAcl(PluginContext* ctx, acl_pkt* ap) { return bRC_OK; }
585
setAcl(PluginContext * ctx,acl_pkt * ap)586 static bRC setAcl(PluginContext* ctx, acl_pkt* ap) { return bRC_OK; }
587
getXattr(PluginContext * ctx,xattr_pkt * xp)588 static bRC getXattr(PluginContext* ctx, xattr_pkt* xp) { return bRC_OK; }
589
setXattr(PluginContext * ctx,xattr_pkt * xp)590 static bRC setXattr(PluginContext* ctx, xattr_pkt* xp) { return bRC_OK; }
591
592 /**
593 * Done with backup of this file
594 */
endBackupFile(PluginContext * ctx)595 static bRC endBackupFile(PluginContext* ctx)
596 {
597 /*
598 * We would return bRC_More if we wanted startBackupFile to be
599 * called again to backup another file
600 */
601 return bRC_OK;
602 }
603
604
605 /**
606 * Bareos is calling us to do the actual I/O
607 */
pluginIO(PluginContext * ctx,struct io_pkt * io)608 static bRC pluginIO(PluginContext* ctx, struct io_pkt* io)
609 {
610 struct plugin_ctx* p_ctx = (struct plugin_ctx*)ctx->plugin_private_context;
611 if (!p_ctx) { return bRC_Error; }
612
613 io->status = 0;
614 io->io_errno = 0;
615 return bRC_OK;
616 }
617
618 /**
619 * Bareos is notifying us that a plugin name string was found, and
620 * passing us the plugin command, so we can prepare for a restore.
621 */
startRestoreFile(PluginContext * ctx,const char * cmd)622 static bRC startRestoreFile(PluginContext* ctx, const char* cmd)
623 {
624 printf("test-plugin-fd: startRestoreFile cmd=%s\n", cmd);
625 return bRC_OK;
626 }
627
628 /**
629 * Bareos is notifying us that the plugin data has terminated, so
630 * the restore for this particular file is done.
631 */
endRestoreFile(PluginContext * ctx)632 static bRC endRestoreFile(PluginContext* ctx)
633 {
634 printf("test-plugin-fd: endRestoreFile\n");
635 return bRC_OK;
636 }
637
638 /**
639 * This is called during restore to create the file (if necessary)
640 * We must return in rp->create_status:
641 *
642 * CF_ERROR -- error
643 * CF_SKIP -- skip processing this file
644 * CF_EXTRACT -- extract the file (i.e.call i/o routines)
645 * CF_CREATED -- created, but no content to extract (typically directories)
646 *
647 */
createFile(PluginContext * ctx,struct restore_pkt * rp)648 static bRC createFile(PluginContext* ctx, struct restore_pkt* rp)
649 {
650 printf("test-plugin-fd: createFile\n");
651 if (strlen(rp->where) > 512) {
652 printf("Restore target dir too long. Restricting to first 512 bytes.\n");
653 }
654 bstrncpy(((struct plugin_ctx*)ctx->plugin_private_context)->where, rp->where,
655 513);
656 ((struct plugin_ctx*)ctx->plugin_private_context)->replace = rp->replace;
657 rp->create_status = CF_EXTRACT;
658 return bRC_OK;
659 }
660
setFileAttributes(PluginContext * ctx,struct restore_pkt * rp)661 static bRC setFileAttributes(PluginContext* ctx, struct restore_pkt* rp)
662 {
663 printf("test-plugin-fd: setFileAttributes\n");
664 return bRC_OK;
665 }
666
667 /* When using Incremental dump, all previous dumps are necessary */
checkFile(PluginContext * ctx,char * fname)668 static bRC checkFile(PluginContext* ctx, char* fname) { return bRC_OK; }
669 } /* namespace filedaemon */
670