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