]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/fd_plugins.c
kes Implement build and install of bpipe-fd.so plugin.
[bacula/bacula] / bacula / src / filed / fd_plugins.c
index 596c372bbc1cdabc22f4ed733b6aefb739e99a77..b0bc92ff1e341b1a2d0bf7c3ce2fe9729ec19dc2 100644 (file)
@@ -44,11 +44,11 @@ const char *plugin_type = "-fd.so";
 extern int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
 
 /* Function pointers to be set here */
-extern DLL_IMP_EXP int     (*plugin_bopen)(JCR *jcr, const char *fname, int flags, mode_t mode);
-extern DLL_IMP_EXP int     (*plugin_bclose)(JCR *jcr);
-extern DLL_IMP_EXP ssize_t (*plugin_bread)(JCR *jcr, void *buf, size_t count);
-extern DLL_IMP_EXP ssize_t (*plugin_bwrite)(JCR *jcr, void *buf, size_t count);
-extern DLL_IMP_EXP boffset_t (*plugin_blseek)(JCR *jcr, boffset_t offset, int whence);
+extern DLL_IMP_EXP int     (*plugin_bopen)(BFILE *bfd, const char *fname, int flags, mode_t mode);
+extern DLL_IMP_EXP int     (*plugin_bclose)(BFILE *bfd);
+extern DLL_IMP_EXP ssize_t (*plugin_bread)(BFILE *bfd, void *buf, size_t count);
+extern DLL_IMP_EXP ssize_t (*plugin_bwrite)(BFILE *bfd, void *buf, size_t count);
+extern DLL_IMP_EXP boffset_t (*plugin_blseek)(BFILE *bfd, boffset_t offset, int whence);
 
 
 /* Forward referenced functions */
@@ -60,11 +60,11 @@ static bRC baculaJobMsg(bpContext *ctx, const char *file, int line,
 static bRC baculaDebugMsg(bpContext *ctx, const char *file, int line,
   int level, const char *fmt, ...);
 
-static int     my_plugin_bopen(JCR *jcr, const char *fname, int flags, mode_t mode);
-static int     my_plugin_bclose(JCR *jcr);
-static ssize_t my_plugin_bread(JCR *jcr, void *buf, size_t count);
-static ssize_t my_plugin_bwrite(JCR *jcr, void *buf, size_t count);
-static boffset_t my_plugin_blseek(JCR *jcr, boffset_t offset, int whence);
+static int     my_plugin_bopen(BFILE *bfd, const char *fname, int flags, mode_t mode);
+static int     my_plugin_bclose(BFILE *bfd);
+static ssize_t my_plugin_bread(BFILE *bfd, void *buf, size_t count);
+static ssize_t my_plugin_bwrite(BFILE *bfd, void *buf, size_t count);
+static boffset_t my_plugin_blseek(BFILE *bfd, boffset_t offset, int whence);
 
 
 /* Bacula info */
@@ -172,7 +172,8 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
       /* Loop getting filenames to backup then saving them */
       while (!job_canceled(jcr)) { 
          memset(&sp, 0, sizeof(sp));
-         sp.type = FT_REG;
+         sp.pkt_size = sizeof(sp);
+         sp.pkt_end = sizeof(sp);
          sp.portable = true;
          sp.cmd = cmd;
          Dmsg3(dbglvl, "startBackup st_size=%p st_blocks=%p sp=%p\n", &sp.statp.st_size, &sp.statp.st_blocks,
@@ -181,6 +182,11 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
          if (plug_func(plugin)->startBackupFile(&plugin_ctx_list[i], &sp) != bRC_OK) {
             goto bail_out;
          }
+         if (sp.type == 0 || sp.fname == NULL) {
+            Jmsg1(jcr, M_FATAL, 0, _("Command plugin \"%s\" returned bad startBackupFile packet.\n"),
+               cmd);
+            goto bail_out;
+         }
          jcr->plugin_ctx = &plugin_ctx_list[i];
          jcr->plugin = plugin;
          jcr->plugin_sp = &sp;
@@ -190,9 +196,11 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
          memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp));
          Dmsg1(dbglvl, "Save_file: file=%s\n", ff_pkt->fname);
          save_file(jcr, ff_pkt, true);
-         if (plug_func(plugin)->endBackupFile(&plugin_ctx_list[i]) != bRC_More) {
-            goto bail_out;
+         bRC rc = plug_func(plugin)->endBackupFile(&plugin_ctx_list[i]);
+         if (rc == bRC_More) {
+            continue;
          }
+         goto bail_out;
       }
    }
    Jmsg1(jcr, M_ERROR, 0, "Command plugin \"%s\" not found.\n", cmd);
@@ -332,6 +340,8 @@ int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
    if (!set_cmd_plugin(bfd, jcr)) {
       return CF_ERROR;
    }
+   rp.pkt_size = sizeof(rp);
+   rp.pkt_end = sizeof(rp);
    rp.stream = attr->stream;
    rp.data_stream = attr->data_stream;
    rp.type = attr->type;
@@ -348,6 +358,8 @@ int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
    if (plug_func(plugin)->createFile(plugin_ctx, &rp) != bRC_OK) {
       return CF_ERROR;
    }
+   io.pkt_size = sizeof(io);
+   io.pkt_end = sizeof(io);
    io.func = IO_OPEN;
    io.count = 0;
    io.buf = NULL;
@@ -404,7 +416,6 @@ void load_fd_plugins(const char *plugin_dir)
       Dmsg1(dbglvl, "Loaded plugin: %s\n", plugin->file);
 
    }
-
 }
 
 /*
@@ -463,70 +474,131 @@ void free_plugins(JCR *jcr)
    jcr->plugin_ctx_list = NULL;
 }
 
-static int my_plugin_bopen(JCR *jcr, const char *fname, int flags, mode_t mode)
+static int my_plugin_bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 {
+   JCR *jcr = bfd->jcr;
    Plugin *plugin = (Plugin *)jcr->plugin;
    bpContext *plugin_ctx = (bpContext *)jcr->plugin_ctx;
    struct io_pkt io;
    Dmsg0(dbglvl, "plugin_bopen\n");
+   io.pkt_size = sizeof(io);
+   io.pkt_end = sizeof(io);
    io.func = IO_OPEN;
    io.count = 0;
    io.buf = NULL;
-   io.mode = mode;
+   io.fname = fname;
    io.flags = flags;
+   io.mode = mode;
+   io.win32 = false;
+   io.lerror = 0;
    plug_func(plugin)->pluginIO(plugin_ctx, &io);
+   bfd->berrno = io.io_errno;
+   if (io.win32) {
+      errno = b_errno_win32;
+   } else {
+      errno = io.io_errno;
+      bfd->lerror = io.lerror;
+   }
    return io.status;
 }
 
-static int my_plugin_bclose(JCR *jcr)
+static int my_plugin_bclose(BFILE *bfd)
 {
+   JCR *jcr = bfd->jcr;
    Plugin *plugin = (Plugin *)jcr->plugin;
    bpContext *plugin_ctx = (bpContext *)jcr->plugin_ctx;
    struct io_pkt io;
    Dmsg0(dbglvl, "plugin_bclose\n");
+   io.pkt_size = sizeof(io);
+   io.pkt_end = sizeof(io);
    io.func = IO_CLOSE;
    io.count = 0;
    io.buf = NULL;
+   io.win32 = false;
+   io.lerror = 0;
    plug_func(plugin)->pluginIO(plugin_ctx, &io);
+   bfd->berrno = io.io_errno;
+   if (io.win32) {
+      errno = b_errno_win32;
+   } else {
+      errno = io.io_errno;
+      bfd->lerror = io.lerror;
+   }
    return io.status;
 }
 
-static ssize_t my_plugin_bread(JCR *jcr, void *buf, size_t count)
+static ssize_t my_plugin_bread(BFILE *bfd, void *buf, size_t count)
 {
+   JCR *jcr = bfd->jcr;
    Plugin *plugin = (Plugin *)jcr->plugin;
    bpContext *plugin_ctx = (bpContext *)jcr->plugin_ctx;
    struct io_pkt io;
    Dmsg0(dbglvl, "plugin_bread\n");
+   io.pkt_size = sizeof(io);
+   io.pkt_end = sizeof(io);
    io.func = IO_READ;
    io.count = count;
    io.buf = (char *)buf;
+   io.win32 = false;
+   io.lerror = 0;
    plug_func(plugin)->pluginIO(plugin_ctx, &io);
+   bfd->berrno = io.io_errno;
+   if (io.win32) {
+      errno = b_errno_win32;
+   } else {
+      errno = io.io_errno;
+      bfd->lerror = io.lerror;
+   }
    return (ssize_t)io.status;
 }
 
-static ssize_t my_plugin_bwrite(JCR *jcr, void *buf, size_t count)
+static ssize_t my_plugin_bwrite(BFILE *bfd, void *buf, size_t count)
 {
+   JCR *jcr = bfd->jcr;
    Plugin *plugin = (Plugin *)jcr->plugin;
    bpContext *plugin_ctx = (bpContext *)jcr->plugin_ctx;
    struct io_pkt io;
    Dmsg0(dbglvl, "plugin_bwrite\n");
+   io.pkt_size = sizeof(io);
+   io.pkt_end = sizeof(io);
    io.func = IO_WRITE;
    io.count = count;
    io.buf = (char *)buf;
+   io.win32 = false;
+   io.lerror = 0;
    plug_func(plugin)->pluginIO(plugin_ctx, &io);
+   bfd->berrno = io.io_errno;
+   if (io.win32) {
+      errno = b_errno_win32;
+   } else {
+      errno = io.io_errno;
+      bfd->lerror = io.lerror;
+   }
    return (ssize_t)io.status;
 }
 
-static boffset_t my_plugin_blseek(JCR *jcr, boffset_t offset, int whence)
+static boffset_t my_plugin_blseek(BFILE *bfd, boffset_t offset, int whence)
 {
+   JCR *jcr = bfd->jcr;
    Plugin *plugin = (Plugin *)jcr->plugin;
    bpContext *plugin_ctx = (bpContext *)jcr->plugin_ctx;
    struct io_pkt io;
    Dmsg0(dbglvl, "plugin_bseek\n");
+   io.pkt_size = sizeof(io);
+   io.pkt_end = sizeof(io);
    io.func = IO_SEEK;
    io.offset = offset;
    io.whence = whence;
+   io.win32 = false;
+   io.lerror = 0;
    plug_func(plugin)->pluginIO(plugin_ctx, &io);
+   bfd->berrno = io.io_errno;
+   if (io.win32) {
+      errno = b_errno_win32;
+   } else {
+      errno = io.io_errno;
+      bfd->lerror = io.lerror;
+   }
    return (boffset_t)io.offset;
 }