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