]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/fd_plugins.h
Add bVarWorkingDir to filed plugins
[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   bVarWorkingDir = 13
177 } bVariable;
178
179 /* Events that are passed to plugin */
180 typedef enum {
181   bEventJobStart                        = 1,
182   bEventJobEnd                          = 2,
183   bEventStartBackupJob                  = 3,
184   bEventEndBackupJob                    = 4,
185   bEventStartRestoreJob                 = 5,
186   bEventEndRestoreJob                   = 6,
187   bEventStartVerifyJob                  = 7,
188   bEventEndVerifyJob                    = 8,
189   bEventBackupCommand                   = 9,
190   bEventRestoreCommand                  = 10,
191   bEventLevel                           = 11,
192   bEventSince                           = 12,
193   bEventCancelCommand                   = 13,
194   bEventVssBackupAddComponents          = 14,
195   bEventVssRestoreLoadComponentMetadata = 15,
196   bEventVssRestoreSetComponentsSelected = 16,
197   bEventRestoreObject                   = 17,
198 } bEventType;
199
200 typedef struct s_bEvent {
201    uint32_t eventType;
202 } bEvent;
203
204 typedef struct s_baculaInfo {
205    uint32_t size;
206    uint32_t version;
207 } bInfo;
208
209 /* Bacula Core Routines -- not used within a plugin */
210 #ifdef FILE_DAEMON
211 struct BFILE;                   /* forward referenced */
212 struct FF_PKT;
213 void load_fd_plugins(const char *plugin_dir);
214 void new_plugins(JCR *jcr);
215 void free_plugins(JCR *jcr);
216 void generate_plugin_event(JCR *jcr, bEventType event, void *value=NULL);
217 bool send_plugin_name(JCR *jcr, BSOCK *sd, bool start);
218 bool plugin_name_stream(JCR *jcr, char *name);    
219 int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace);
220 bool plugin_set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd);
221 int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
222 bool plugin_check_file(JCR *jcr, char *fname);
223 #endif
224
225 #ifdef __cplusplus
226 extern "C" {
227 #endif
228
229 /* 
230  * Bacula interface version and function pointers -- 
231  *  i.e. callbacks from the plugin to Bacula
232  */
233 typedef struct s_baculaFuncs {  
234    uint32_t size;
235    uint32_t version;
236    bRC (*registerBaculaEvents)(bpContext *ctx, ...);
237    bRC (*getBaculaValue)(bpContext *ctx, bVariable var, void *value);
238    bRC (*setBaculaValue)(bpContext *ctx, bVariable var, void *value);
239    bRC (*JobMessage)(bpContext *ctx, const char *file, int line, 
240        int type, utime_t mtime, const char *fmt, ...);     
241    bRC (*DebugMessage)(bpContext *ctx, const char *file, int line,
242        int level, const char *fmt, ...);
243    void *(*baculaMalloc)(bpContext *ctx, const char *file, int line, 
244        size_t size);
245    void (*baculaFree)(bpContext *ctx, const char *file, int line, void *mem);
246    bRC (*AddExclude)(bpContext *ctx, const char *file);
247 } bFuncs;
248
249
250
251
252 /****************************************************************************
253  *                                                                          *
254  *                Plugin definitions                                        *
255  *                                                                          *
256  ****************************************************************************/
257
258 typedef enum {
259   pVarName = 1,
260   pVarDescription = 2
261 } pVariable;
262
263
264 #define FD_PLUGIN_MAGIC     "*FDPluginData*" 
265 #define FD_PLUGIN_INTERFACE_VERSION  4
266
267 typedef struct s_pluginInfo {
268    uint32_t size;
269    uint32_t version;
270    const char *plugin_magic;
271    const char *plugin_license;
272    const char *plugin_author;
273    const char *plugin_date;
274    const char *plugin_version;
275    const char *plugin_description;
276 } pInfo;
277
278 /*
279  * This is a set of function pointers that Bacula can call
280  *  within the plugin.
281  */
282 typedef struct s_pluginFuncs {  
283    uint32_t size;
284    uint32_t version;
285    bRC (*newPlugin)(bpContext *ctx);
286    bRC (*freePlugin)(bpContext *ctx);
287    bRC (*getPluginValue)(bpContext *ctx, pVariable var, void *value);
288    bRC (*setPluginValue)(bpContext *ctx, pVariable var, void *value);
289    bRC (*handlePluginEvent)(bpContext *ctx, bEvent *event, void *value);
290    bRC (*startBackupFile)(bpContext *ctx, struct save_pkt *sp);
291    bRC (*endBackupFile)(bpContext *ctx);
292    bRC (*startRestoreFile)(bpContext *ctx, const char *cmd);
293    bRC (*endRestoreFile)(bpContext *ctx);
294    bRC (*pluginIO)(bpContext *ctx, struct io_pkt *io);
295    bRC (*createFile)(bpContext *ctx, struct restore_pkt *rp);
296    bRC (*setFileAttributes)(bpContext *ctx, struct restore_pkt *rp);
297    bRC (*checkFile)(bpContext *ctx, char *fname);
298 } pFuncs;
299
300 #define plug_func(plugin) ((pFuncs *)(plugin->pfuncs))
301 #define plug_info(plugin) ((pInfo *)(plugin->pinfo))
302
303 #ifdef __cplusplus
304 }
305 #endif
306
307 #endif /* __FD_PLUGINS_H */