]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/fd_plugins.h
backport code from master
[bacula/bacula] / bacula / src / filed / fd_plugins.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2012 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version three of the GNU Affero General Public
10    License as published by the Free Software Foundation, which is 
11    listed in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU Affero General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  * Application Programming Interface (API) definition for Bacula Plugins
30  *
31  * Kern Sibbald, October 2007
32  *
33  */
34  
35 #ifndef __FD_PLUGINS_H 
36 #define __FD_PLUGINS_H
37
38 #ifndef _BACULA_H
39 #ifdef __cplusplus
40 /* Workaround for SGI IRIX 6.5 */
41 #define _LANGUAGE_C_PLUS_PLUS 1
42 #endif
43 #define _REENTRANT    1
44 #define _THREAD_SAFE  1
45 #define _POSIX_PTHREAD_SEMANTICS 1
46 #define _FILE_OFFSET_BITS 64
47 #define _LARGEFILE_SOURCE 1
48 #define _LARGE_FILES 1
49 #endif  /* ! _BACULA_H */
50
51 #include <sys/types.h>
52
53 #if defined(HAVE_WIN32)
54 #if defined(HAVE_MINGW)
55 #include "mingwconfig.h"
56 #else
57 #include "winconfig.h"
58 #endif
59 #else  /* !HAVE_WIN32 */
60 #ifndef __CONFIG_H
61 #include "config.h"
62 #define __CONFIG_H
63 #endif
64 #endif
65
66 #include "../src/version.h"
67 #include "bc_types.h"
68 #include "lib/plugins.h"
69 #include <sys/stat.h>
70 #ifdef HAVE_WIN32
71 #include "../win32/filed/vss.h"
72 #endif
73
74 /*
75  * This packet is used for the restore objects
76  *  It is passed to the plugin when restoring
77  *  the object.
78  */
79 struct restore_object_pkt {
80    int32_t pkt_size;                  /* size of this packet */
81    char *object_name;                 /* Object name */
82    char *object;                      /* restore object data to save */
83    char *plugin_name;                 /* Plugin name */
84    int32_t object_type;               /* FT_xx for this file */             
85    int32_t object_len;                /* restore object length */
86    int32_t object_full_len;           /* restore object uncompressed length */
87    int32_t object_index;              /* restore object index */
88    int32_t object_compression;        /* set to compression type */
89    int32_t stream;                    /* attribute stream id */
90    uint32_t JobId;                    /* JobId object came from */
91    int32_t pkt_end;                   /* end packet sentinel */
92 };
93
94 /*
95  * This packet is used for file save info transfer.
96 */
97 struct save_pkt {
98    int32_t pkt_size;                  /* size of this packet */
99    char *fname;                       /* Full path and filename */
100    char *link;                        /* Link name if any */
101    struct stat statp;                 /* System stat() packet for file */
102    int32_t type;                      /* FT_xx for this file */             
103    uint32_t flags;                    /* Bacula internal flags */
104    bool no_read;                      /* During the save, the file should not be saved */
105    bool portable;                     /* set if data format is portable */
106    bool accurate_found;               /* Found in accurate list (valid after check_changes()) */
107    char *cmd;                         /* command */
108    uint32_t delta_seq;                /* Delta sequence number */
109    char *object_name;                 /* Object name to create */
110    char *object;                      /* restore object data to save */
111    int32_t object_len;                /* restore object length */
112    int32_t index;                     /* restore object index */
113    int32_t pkt_end;                   /* end packet sentinel */
114 };
115
116 /*
117  * This packet is used for file restore info transfer.
118 */
119 struct restore_pkt {
120    int32_t pkt_size;                  /* size of this packet */
121    int32_t stream;                    /* attribute stream id */
122    int32_t data_stream;               /* id of data stream to follow */
123    int32_t type;                      /* file type FT */
124    int32_t file_index;                /* file index */
125    int32_t LinkFI;                    /* file index to data if hard link */
126    uid_t uid;                         /* userid */
127    struct stat statp;                 /* decoded stat packet */
128    const char *attrEx;                /* extended attributes if any */
129    const char *ofname;                /* output filename */
130    const char *olname;                /* output link name */
131    const char *where;                 /* where */
132    const char *RegexWhere;            /* regex where */
133    int replace;                       /* replace flag */
134    int create_status;                 /* status from createFile() */
135    uint32_t delta_seq;                /* Delta sequence number */
136    int32_t pkt_end;                   /* end packet sentinel */
137 };
138
139 enum {
140    IO_OPEN = 1,
141    IO_READ = 2,
142    IO_WRITE = 3,
143    IO_CLOSE = 4,
144    IO_SEEK = 5
145 };
146
147 struct io_pkt {
148    int32_t pkt_size;                  /* Size of this packet */
149    int32_t func;                      /* Function code */
150    int32_t count;                     /* read/write count */
151    int32_t flags;                     /* Open flags */
152    mode_t mode;                       /* permissions for created files */
153    char *buf;                         /* read/write buffer */
154    const char *fname;                 /* open filename */
155    int32_t status;                    /* return status */
156    int32_t io_errno;                  /* errno code */  
157    int32_t lerror;                    /* Win32 error code */
158    int32_t whence;                    /* lseek argument */
159    boffset_t offset;                  /* lseek argument */
160    bool win32;                        /* Win32 GetLastError returned */
161    int32_t pkt_end;                   /* end packet sentinel */
162 };
163
164 /****************************************************************************
165  *                                                                          *
166  *                Bacula definitions                                        *
167  *                                                                          *
168  ****************************************************************************/
169
170 /* Bacula Variable Ids */
171 typedef enum {
172   bVarJobId     = 1,
173   bVarFDName    = 2,
174   bVarLevel     = 3,
175   bVarType      = 4,
176   bVarClient    = 5,
177   bVarJobName   = 6,
178   bVarJobStatus = 7,
179   bVarSinceTime = 8,
180   bVarAccurate  = 9,
181   bVarFileSeen  = 10,
182   bVarVssObject = 11,
183   bVarVssDllHandle = 12,
184   bVarWorkingDir = 13,
185   bVarWhere      = 14,
186   bVarRegexWhere = 15,
187   bVarExePath    = 16,
188   bVarVersion    = 17,
189   bVarDistName   = 18,
190   bVarBEEF       = 19,
191   bVarPrevJobName = 20,
192   bVarPrefixLinks = 21
193 } bVariable;
194
195 /* Events that are passed to plugin */
196 typedef enum {
197   bEventJobStart                        = 1,
198   bEventJobEnd                          = 2,
199   bEventStartBackupJob                  = 3,
200   bEventEndBackupJob                    = 4,
201   bEventStartRestoreJob                 = 5,
202   bEventEndRestoreJob                   = 6,
203   bEventStartVerifyJob                  = 7,
204   bEventEndVerifyJob                    = 8,
205   bEventBackupCommand                   = 9,
206   bEventRestoreCommand                  = 10,
207   bEventEstimateCommand                 = 11,
208   bEventLevel                           = 12,
209   bEventSince                           = 13,
210   bEventCancelCommand                   = 14, /* Executed by another thread */
211   bEventVssBackupAddComponents          = 15, /* Just before bEventVssPrepareSnapshot */
212   bEventVssRestoreLoadComponentMetadata = 16,
213   bEventVssRestoreSetComponentsSelected = 17,
214   bEventRestoreObject                   = 18,
215   bEventEndFileSet                      = 19,
216   bEventPluginCommand                   = 20, /* Sent during FileSet creation */
217   bEventVssBeforeCloseRestore           = 21,
218   /* Add drives to VSS snapshot 
219    *  argument: char[27] drivelist
220    * You need to add them without duplicates, 
221    * see fd_common.h add_drive() copy_drives() to get help
222    */
223   bEventVssPrepareSnapshot              = 22,
224   bEventOptionPlugin                    = 23,
225   bEventHandleBackupFile                = 24, /* Used with Options Plugin */
226   bEventComponentInfo                   = 25  /* Plugin component */
227 } bEventType;
228
229 typedef struct s_bEvent {
230    uint32_t eventType;
231 } bEvent;
232
233 typedef struct s_baculaInfo {
234    uint32_t size;
235    uint32_t version;
236 } bInfo;
237
238 /* Bacula Core Routines -- not used within a plugin */
239 #ifdef FILE_DAEMON
240 struct BFILE;                   /* forward referenced */
241 struct FF_PKT;
242 void load_fd_plugins(const char *plugin_dir);
243 void new_plugins(JCR *jcr);
244 void free_plugins(JCR *jcr);
245 void generate_plugin_event(JCR *jcr, bEventType event, void *value=NULL);
246 bool send_plugin_name(JCR *jcr, BSOCK *sd, bool start);
247 bool plugin_name_stream(JCR *jcr, char *name);    
248 int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace);
249 bool plugin_set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd);
250 int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
251 int plugin_estimate(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
252 bool plugin_check_file(JCR *jcr, char *fname);
253 bRC plugin_option_handle_file(JCR *jcr, FF_PKT *ff_pkt, struct save_pkt *sp);
254 #endif
255
256 #ifdef __cplusplus
257 extern "C" {
258 #endif
259
260 /* 
261  * Bacula interface version and function pointers -- 
262  *  i.e. callbacks from the plugin to Bacula
263  */
264 typedef struct s_baculaFuncs {  
265    uint32_t size;
266    uint32_t version;
267    bRC (*registerBaculaEvents)(bpContext *ctx, ...);
268    bRC (*getBaculaValue)(bpContext *ctx, bVariable var, void *value);
269    bRC (*setBaculaValue)(bpContext *ctx, bVariable var, void *value);
270    bRC (*JobMessage)(bpContext *ctx, const char *file, int line, 
271        int type, utime_t mtime, const char *fmt, ...);     
272    bRC (*DebugMessage)(bpContext *ctx, const char *file, int line,
273        int level, const char *fmt, ...);
274    void *(*baculaMalloc)(bpContext *ctx, const char *file, int line, 
275        size_t size);
276    void (*baculaFree)(bpContext *ctx, const char *file, int line, void *mem);
277    bRC (*AddExclude)(bpContext *ctx, const char *file);
278    bRC (*AddInclude)(bpContext *ctx, const char *file);
279    bRC (*AddOptions)(bpContext *ctx, const char *opts);
280    bRC (*AddRegex)(bpContext *ctx, const char *item, int type);
281    bRC (*AddWild)(bpContext *ctx, const char *item, int type);
282    bRC (*NewOptions)(bpContext *ctx);
283    bRC (*NewInclude)(bpContext *ctx);
284    bRC (*NewPreInclude)(bpContext *ctx);
285    bRC (*checkChanges)(bpContext *ctx, struct save_pkt *sp);
286    bRC (*AcceptFile)(bpContext *ctx, struct save_pkt *sp); /* Need fname and statp */
287 } bFuncs;
288
289
290
291
292 /****************************************************************************
293  *                                                                          *
294  *                Plugin definitions                                        *
295  *                                                                          *
296  ****************************************************************************/
297
298 typedef enum {
299   pVarName = 1,
300   pVarDescription = 2
301 } pVariable;
302
303 # define FD_PLUGIN_MAGIC  "*FDPluginData*" 
304
305 #define FD_PLUGIN_INTERFACE_VERSION  7
306
307 typedef struct s_pluginInfo {
308    uint32_t size;
309    uint32_t version;
310    const char *plugin_magic;
311    const char *plugin_license;
312    const char *plugin_author;
313    const char *plugin_date;
314    const char *plugin_version;
315    const char *plugin_description;
316 } pInfo;
317
318 /*
319  * This is a set of function pointers that Bacula can call
320  *  within the plugin.
321  */
322 typedef struct s_pluginFuncs {  
323    uint32_t size;
324    uint32_t version;
325    bRC (*newPlugin)(bpContext *ctx);
326    bRC (*freePlugin)(bpContext *ctx);
327    bRC (*getPluginValue)(bpContext *ctx, pVariable var, void *value);
328    bRC (*setPluginValue)(bpContext *ctx, pVariable var, void *value);
329    bRC (*handlePluginEvent)(bpContext *ctx, bEvent *event, void *value);
330    bRC (*startBackupFile)(bpContext *ctx, struct save_pkt *sp);
331    bRC (*endBackupFile)(bpContext *ctx);
332    bRC (*startRestoreFile)(bpContext *ctx, const char *cmd);
333    bRC (*endRestoreFile)(bpContext *ctx);
334    bRC (*pluginIO)(bpContext *ctx, struct io_pkt *io);
335    bRC (*createFile)(bpContext *ctx, struct restore_pkt *rp);
336    bRC (*setFileAttributes)(bpContext *ctx, struct restore_pkt *rp);
337    bRC (*checkFile)(bpContext *ctx, char *fname);
338 } pFuncs;
339
340 #define plug_func(plugin) ((pFuncs *)(plugin->pfuncs))
341 #define plug_info(plugin) ((pInfo *)(plugin->pinfo))
342
343 #ifdef __cplusplus
344 }
345 #endif
346
347 #endif /* __FD_PLUGINS_H */