]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/fd_plugins.h
Tweak new restore object code
[bacula/bacula] / bacula / src / filed / fd_plugins.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2010 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 two of the GNU 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 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 "bc_types.h"
67 #include "lib/plugins.h"
68 #include <sys/stat.h>
69 #ifdef HAVE_WIN32
70 #include "../win32/filed/vss.h"
71 #endif
72
73 /*
74  * This packet is used for the restore objects
75  *  It is passed to the plugin when restoring
76  *  the object.
77  */
78 struct restore_object_pkt {
79    int32_t pkt_size;                  /* size of this packet */
80    char *object_name;                 /* Object name */
81    char *object;                      /* restore object data to save */
82    int32_t object_type;               /* FT_xx for this file */             
83    int32_t object_len;                /* restore object length */
84    int32_t object_index;              /* restore object index */
85    int32_t stream;                    /* attribute stream id */
86    uint32_t JobId;                    /* JobId object came from */
87    int32_t pkt_end;                   /* end packet sentinel */
88 };
89
90 /*
91  * This packet is used for file save info transfer.
92 */
93 struct save_pkt {
94    int32_t pkt_size;                  /* size of this packet */
95    char *fname;                       /* Full path and filename */
96    char *link;                        /* Link name if any */
97    struct stat statp;                 /* System stat() packet for file */
98    int32_t type;                      /* FT_xx for this file */             
99    uint32_t flags;                    /* Bacula internal flags */
100    bool portable;                     /* set if data format is portable */
101    char *cmd;                         /* command */
102    char *object_name;                 /* Object name to create */
103    char *object;                      /* restore object data to save */
104    int32_t object_len;                /* restore object length */
105    int32_t index;                     /* restore object index */
106    int32_t pkt_end;                   /* end packet sentinel */
107 };
108
109 /*
110  * This packet is used for file restore info transfer.
111 */
112 struct restore_pkt {
113    int32_t pkt_size;                  /* size of this packet */
114    int32_t stream;                    /* attribute stream id */
115    int32_t data_stream;               /* id of data stream to follow */
116    int32_t type;                      /* file type FT */
117    int32_t file_index;                /* file index */
118    int32_t LinkFI;                    /* file index to data if hard link */
119    uid_t uid;                         /* userid */
120    struct stat statp;                 /* decoded stat packet */
121    const char *attrEx;                /* extended attributes if any */
122    const char *ofname;                /* output filename */
123    const char *olname;                /* output link name */
124    const char *where;                 /* where */
125    const char *RegexWhere;            /* regex where */
126    int replace;                       /* replace flag */
127    int create_status;                 /* status from createFile() */
128    int32_t pkt_end;                   /* end packet sentinel */
129 };
130
131 enum {
132    IO_OPEN = 1,
133    IO_READ = 2,
134    IO_WRITE = 3,
135    IO_CLOSE = 4,
136    IO_SEEK = 5
137 };
138
139 struct io_pkt {
140    int32_t pkt_size;                  /* Size of this packet */
141    int32_t func;                      /* Function code */
142    int32_t count;                     /* read/write count */
143    int32_t flags;                     /* Open flags */
144    mode_t mode;                       /* permissions for created files */
145    char *buf;                         /* read/write buffer */
146    const char *fname;                 /* open filename */
147    int32_t status;                    /* return status */
148    int32_t io_errno;                  /* errno code */  
149    int32_t lerror;                    /* Win32 error code */
150    int32_t whence;                    /* lseek argument */
151    boffset_t offset;                  /* lseek argument */
152    bool win32;                        /* Win32 GetLastError returned */
153    int32_t pkt_end;                   /* end packet sentinel */
154 };
155
156 /****************************************************************************
157  *                                                                          *
158  *                Bacula definitions                                        *
159  *                                                                          *
160  ****************************************************************************/
161
162 /* Bacula Variable Ids */
163 typedef enum {
164   bVarJobId     = 1,
165   bVarFDName    = 2,
166   bVarLevel     = 3,
167   bVarType      = 4,
168   bVarClient    = 5,
169   bVarJobName   = 6,
170   bVarJobStatus = 7,
171   bVarSinceTime = 8,
172   bVarAccurate  = 9,
173   bVarFileSeen  = 10,
174   bVarVssObject = 11,
175   bVarVssDllHandle = 12
176 } bVariable;
177
178 /* Events that are passed to plugin */
179 typedef enum {
180   bEventJobStart                        = 1,
181   bEventJobEnd                          = 2,
182   bEventStartBackupJob                  = 3,
183   bEventEndBackupJob                    = 4,
184   bEventStartRestoreJob                 = 5,
185   bEventEndRestoreJob                   = 6,
186   bEventStartVerifyJob                  = 7,
187   bEventEndVerifyJob                    = 8,
188   bEventBackupCommand                   = 9,
189   bEventRestoreCommand                  = 10,
190   bEventLevel                           = 11,
191   bEventSince                           = 12,
192   bEventCancelCommand                   = 13,
193   bEventVssBackupAddComponents          = 14,
194   bEventVssRestoreLoadComponentMetadata = 15,
195   bEventVssRestoreSetComponentsSelected = 16,
196   bEventRestoreObject                   = 17,
197 } bEventType;
198
199 typedef struct s_bEvent {
200    uint32_t eventType;
201 } bEvent;
202
203 typedef struct s_baculaInfo {
204    uint32_t size;
205    uint32_t version;
206 } bInfo;
207
208 /* Bacula Core Routines -- not used within a plugin */
209 #ifdef FILE_DAEMON
210 struct BFILE;                   /* forward referenced */
211 struct FF_PKT;
212 void load_fd_plugins(const char *plugin_dir);
213 void new_plugins(JCR *jcr);
214 void free_plugins(JCR *jcr);
215 void generate_plugin_event(JCR *jcr, bEventType event, void *value=NULL);
216 bool send_plugin_name(JCR *jcr, BSOCK *sd, bool start);
217 bool plugin_name_stream(JCR *jcr, char *name);    
218 int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace);
219 bool plugin_set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd);
220 int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
221 bool plugin_check_file(JCR *jcr, char *fname);
222 #endif
223
224 #ifdef __cplusplus
225 extern "C" {
226 #endif
227
228 /* 
229  * Bacula interface version and function pointers -- 
230  *  i.e. callbacks from the plugin to Bacula
231  */
232 typedef struct s_baculaFuncs {  
233    uint32_t size;
234    uint32_t version;
235    bRC (*registerBaculaEvents)(bpContext *ctx, ...);
236    bRC (*getBaculaValue)(bpContext *ctx, bVariable var, void *value);
237    bRC (*setBaculaValue)(bpContext *ctx, bVariable var, void *value);
238    bRC (*JobMessage)(bpContext *ctx, const char *file, int line, 
239        int type, utime_t mtime, const char *fmt, ...);     
240    bRC (*DebugMessage)(bpContext *ctx, const char *file, int line,
241        int level, const char *fmt, ...);
242    void *(*baculaMalloc)(bpContext *ctx, const char *file, int line, 
243        size_t size);
244    void (*baculaFree)(bpContext *ctx, const char *file, int line, void *mem);
245    bRC (*AddExclude)(bpContext *ctx, const char *file);
246 } bFuncs;
247
248
249
250
251 /****************************************************************************
252  *                                                                          *
253  *                Plugin definitions                                        *
254  *                                                                          *
255  ****************************************************************************/
256
257 typedef enum {
258   pVarName = 1,
259   pVarDescription = 2
260 } pVariable;
261
262
263 #define FD_PLUGIN_MAGIC     "*FDPluginData*" 
264 #define FD_PLUGIN_INTERFACE_VERSION  4
265
266 typedef struct s_pluginInfo {
267    uint32_t size;
268    uint32_t version;
269    const char *plugin_magic;
270    const char *plugin_license;
271    const char *plugin_author;
272    const char *plugin_date;
273    const char *plugin_version;
274    const char *plugin_description;
275 } pInfo;
276
277 /*
278  * This is a set of function pointers that Bacula can call
279  *  within the plugin.
280  */
281 typedef struct s_pluginFuncs {  
282    uint32_t size;
283    uint32_t version;
284    bRC (*newPlugin)(bpContext *ctx);
285    bRC (*freePlugin)(bpContext *ctx);
286    bRC (*getPluginValue)(bpContext *ctx, pVariable var, void *value);
287    bRC (*setPluginValue)(bpContext *ctx, pVariable var, void *value);
288    bRC (*handlePluginEvent)(bpContext *ctx, bEvent *event, void *value);
289    bRC (*startBackupFile)(bpContext *ctx, struct save_pkt *sp);
290    bRC (*endBackupFile)(bpContext *ctx);
291    bRC (*startRestoreFile)(bpContext *ctx, const char *cmd);
292    bRC (*endRestoreFile)(bpContext *ctx);
293    bRC (*pluginIO)(bpContext *ctx, struct io_pkt *io);
294    bRC (*createFile)(bpContext *ctx, struct restore_pkt *rp);
295    bRC (*setFileAttributes)(bpContext *ctx, struct restore_pkt *rp);
296    bRC (*checkFile)(bpContext *ctx, char *fname);
297 } pFuncs;
298
299 #define plug_func(plugin) ((pFuncs *)(plugin->pfuncs))
300 #define plug_info(plugin) ((pInfo *)(plugin->pinfo))
301
302 #ifdef __cplusplus
303 }
304 #endif
305
306 #endif /* __FD_PLUGINS_H */