]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/fd-plugins.h
Plugin restore works
[bacula/bacula] / bacula / src / filed / fd-plugins.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2007-2008 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 John Walker.
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
50
51 #include <sys/types.h>
52 #ifndef __CONFIG_H
53 #define __CONFIG_H
54 #include "config.h"
55 #endif
56 #include "bc_types.h"
57 #include "lib/plugins.h"
58 #include <sys/stat.h>
59
60 /*
61  * This packet is used for file save info transfer.
62 */
63 struct save_pkt {
64   char *fname;                        /* Full path and filename */
65   char *link;                         /* Link name if any */
66   struct stat statp;                  /* System stat() packet for file */
67   int32_t type;                       /* FT_xx for this file */             
68   uint32_t flags;                     /* Bacula internal flags */
69   bool portable;                      /* set if data format is portable */
70   char *cmd;                          /* command */
71 };
72
73 /*
74  * This packet is used for file restore info transfer.
75 */
76 struct restore_pkt {
77    int32_t stream;                    /* attribute stream id */
78    int32_t data_stream;               /* id of data stream to follow */
79    int32_t type;                      /* file type FT */
80    int32_t file_index;                /* file index */
81    int32_t LinkFI;                    /* file index to data if hard link */
82    uid_t uid;                         /* userid */
83    struct stat statp;                 /* decoded stat packet */
84    const char *attrEx;                /* extended attributes if any */
85    const char *ofname;                /* output filename */
86    const char *olname;                /* output link name */
87 };
88
89 enum {
90    IO_OPEN = 1,
91    IO_READ = 2,
92    IO_WRITE = 3,
93    IO_CLOSE = 4,
94    IO_SEEK = 5
95 };
96
97 struct io_pkt {
98    int32_t func;                      /* Function code */
99    int32_t count;                     /* read/write count */
100    mode_t mode;                       /* permissions for created files */
101    int32_t flags;                     /* open flags (e.g. O_WRONLY ...) */
102    char *buf;                         /* read/write buffer */
103    int32_t status;                    /* return status */
104    int32_t io_errno;                  /* errno code */  
105    int32_t whence;
106    boffset_t offset;
107 };
108
109 /****************************************************************************
110  *                                                                          *
111  *                Bacula definitions                                        *
112  *                                                                          *
113  ****************************************************************************/
114
115 /* Bacula Variable Ids */
116 typedef enum {
117   bVarJobId     = 1,
118   bVarFDName    = 2,
119   bVarLevel     = 3,
120   bVarType      = 4,
121   bVarClient    = 5,
122   bVarJobName   = 6,
123   bVarJobStatus = 7,
124   bVarSinceTime = 8
125 } bVariable;
126
127 typedef enum {
128   bEventJobStart        = 1,
129   bEventJobEnd          = 2,
130   bEventStartBackupJob  = 3,
131   bEventEndBackupJob    = 4,
132   bEventStartRestoreJob = 5,
133   bEventEndRestoreJob   = 6,
134   bEventStartVerifyJob  = 7,
135   bEventEndVerifyJob    = 8,
136   bEventBackupCommand   = 9,
137   bEventRestoreCommand  = 10,
138   bEventLevel           = 11,
139   bEventSince           = 12,
140 } bEventType;
141
142 typedef struct s_bEvent {
143    uint32_t eventType;
144 } bEvent;
145
146 typedef struct s_baculaInfo {
147    uint32_t size;
148    uint32_t version;
149 } bInfo;
150
151 /* Bacula Core Routines -- not used by plugins */
152 struct BFILE;                   /* forward referenced */
153 struct FF_PKT;
154 void load_fd_plugins(const char *plugin_dir);
155 void new_plugins(JCR *jcr);
156 void free_plugins(JCR *jcr);
157 void generate_plugin_event(JCR *jcr, bEventType event, void *value=NULL);
158 bool send_plugin_name(JCR *jcr, BSOCK *sd, bool start);
159 void plugin_name_stream(JCR *jcr, char *name);    
160 int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace);
161 bool plugin_set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd);
162 int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
163
164 #ifdef __cplusplus
165 extern "C" {
166 #endif
167
168 /* 
169  * Bacula interface version and function pointers -- 
170  *  i.e. callbacks from the plugin to Bacula
171  */
172 typedef struct s_baculaFuncs {  
173    uint32_t size;
174    uint32_t version;
175    bRC (*registerBaculaEvents)(bpContext *ctx, ...);
176    bRC (*getBaculaValue)(bpContext *ctx, bVariable var, void *value);
177    bRC (*setBaculaValue)(bpContext *ctx, bVariable var, void *value);
178    bRC (*JobMessage)(bpContext *ctx, const char *file, int line, 
179        int type, time_t mtime, const char *fmt, ...);     
180    bRC (*DebugMessage)(bpContext *ctx, const char *file, int line,
181        int level, const char *fmt, ...);
182 } bFuncs;
183
184
185
186
187 /****************************************************************************
188  *                                                                          *
189  *                Plugin definitions                                        *
190  *                                                                          *
191  ****************************************************************************/
192
193 typedef enum {
194   pVarName = 1,
195   pVarDescription = 2
196 } pVariable;
197
198
199 #define PLUGIN_MAGIC     "*PluginData*" 
200 #define PLUGIN_INTERFACE_VERSION  1
201
202 typedef struct s_pluginInfo {
203    uint32_t size;
204    uint32_t version;
205    char *plugin_magic;
206    char *plugin_license;
207    char *plugin_author;
208    char *plugin_date;
209    char *plugin_version;
210    char *plugin_description;
211 } pInfo;
212
213 /*
214  * This is a set of function pointers that Bacula can call
215  *  within the plugin.
216  */
217 typedef struct s_pluginFuncs {  
218    uint32_t size;
219    uint32_t version;
220    bRC (*newPlugin)(bpContext *ctx);
221    bRC (*freePlugin)(bpContext *ctx);
222    bRC (*getPluginValue)(bpContext *ctx, pVariable var, void *value);
223    bRC (*setPluginValue)(bpContext *ctx, pVariable var, void *value);
224    bRC (*handlePluginEvent)(bpContext *ctx, bEvent *event, void *value);
225    bRC (*startBackupFile)(bpContext *ctx, struct save_pkt *sp);
226    bRC (*endBackupFile)(bpContext *ctx);
227    bRC (*startRestoreFile)(bpContext *ctx, const char *cmd);
228    bRC (*endRestoreFile)(bpContext *ctx);
229    bRC (*pluginIO)(bpContext *ctx, struct io_pkt *io);
230    bRC (*createFile)(bpContext *ctx, struct restore_pkt *rp);
231    bRC (*setFileAttributes)(bpContext *ctx, struct restore_pkt *rp);
232 } pFuncs;
233
234 #define plug_func(plugin) ((pFuncs *)(plugin->pfuncs))
235 #define plug_info(plugin) ((pInfo *)(plugin->pinfo))
236
237 #ifdef __cplusplus
238 }
239 #endif
240
241 #endif /* __FD_PLUGINS_H */