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