case STREAM_XACL_HURD_DEFAULT:
case STREAM_XACL_HURD_ACCESS:
case STREAM_XACL_PLUGIN_ACL:
+ // here we can simply skip this stream if rctx.extract is false, right?
case STREAM_XACL_GPFS_ACL_DEFAULT:
case STREAM_XACL_GPFS_ACL_ACCESS:
/*
break;
case STREAM_XACL_PLUGIN_XATTR:
+ // here we can simply skip this stream if rctx.extract is false, right?
case STREAM_XACL_HURD_XATTR:
case STREAM_XACL_IRIX_XATTR:
case STREAM_XACL_TRU64_XATTR:
case STREAM_PLUGIN_META_BLOB:
case STREAM_PLUGIN_META_CATALOG:
{
+ // here we can simply skip this stream if rctx.extract is false, right?
if (!jcr->plugin) {
Dmsg0(10, "No plugin related to metadata packet found, metadata restore failed!\n");
goto get_out;
}
int rc = plug_func(jcr->plugin)->metadataRestore(jcr->plugin_ctx, &mp);
- if (rc != bRC_OK) {
+ switch (rc)
+ {
+ case bRC_Skip:
+ Dmsg0(200, "metadata:rctx.extract = false\n");
+ rctx.extract = false;
+ bclose(&rctx.bfd);
+ break;
+ case bRC_OK:
+ break;
+ default:
Jmsg(jcr, M_ERROR, 0, _("Plugin metadataRestore call failed, err: %d\n"), rc);
goto get_out;
}
-
break;
}
return _("Restore Object");
case STREAM_PLUGIN_OBJECT:
return _("Plugin Object");
- case STREAM_PLUGIN_META_BLOB:
- return _("Plugin metadata (binary)");
- case STREAM_PLUGIN_META_CATALOG:
- return _("Plugin metadata (catalog)");
case STREAM_XACL_AIX_TEXT:
return _("AIX ACL attribs");
case STREAM_XACL_DARWIN_ACCESS:
return _("Linux Extended attribs");
case STREAM_XACL_NETBSD_XATTR:
return _("NetBSD Extended attribs");
+ case STREAM_PLUGIN_META_BLOB:
+ return _("Plugin Metadata Blob");
+ case STREAM_PLUGIN_META_CATALOG:
+ return _("Plugin Metadata Catalog");
default:
sprintf(buf, "%d", stream);
return (const char *)buf;
pluginobjectsent(false),
readacl(false),
readxattr(false),
+ skipextract(false),
fname(PM_FNAME),
lname(PM_FNAME),
robjbuf(NULL),
POOL_MEM cmd(PM_FNAME);
char type;
+ skipextract = false;
if (CORELOCALRESTORE && islocalpath(where)){
DMSG0(ctx, DDEBUG, "createFile:Forwarding restore to Core\n");
rp->create_status = CF_CORE;
} else
if (strcmp(cmd.c_str(), "SKIP") == 0){
rp->create_status = CF_SKIP;
+ skipextract = true;
} else
if (strcmp(cmd.c_str(), "CORE") == 0){
rp->create_status = CF_CORE;
*/
bRC METAPLUGIN::handleXACLdata(bpContext *ctx, struct xacl_pkt *xacl)
{
- switch (xacl->func){
- case BACL_BACKUP:
- if (readacl){
- DMSG0(ctx, DINFO, "bacl_backup\n");
- xacl->count = acldatalen;
- xacl->content = acldata.c_str();
- readacl= false;
- } else {
- xacl->count = 0;
- }
- break;
- case BACL_RESTORE:
- DMSG0(ctx, DINFO, "bacl_restore\n");
- return perform_write_acl(ctx, xacl);
- case BXATTR_BACKUP:
- if (readxattr){
- DMSG0(ctx, DINFO, "bxattr_backup\n");
- xacl->count = xattrdatalen;
- xacl->content = xattrdata.c_str();
- readxattr= false;
- } else {
- xacl->count = 0;
+ switch (xacl->func)
+ {
+ case BACL_BACKUP:
+ if (readacl){
+ DMSG0(ctx, DINFO, "bacl_backup\n");
+ xacl->count = acldatalen;
+ xacl->content = acldata.c_str();
+ readacl= false;
+ } else {
+ xacl->count = 0;
+ }
+ break;
+ case BACL_RESTORE:
+ DMSG0(ctx, DINFO, "bacl_restore\n");
+ if (!skipextract){
+ return perform_write_acl(ctx, xacl);
}
break;
- case BXATTR_RESTORE:
- DMSG0(ctx, DINFO, "bxattr_restore\n");
+ case BXATTR_BACKUP:
+ if (readxattr){
+ DMSG0(ctx, DINFO, "bxattr_backup\n");
+ xacl->count = xattrdatalen;
+ xacl->content = xattrdata.c_str();
+ readxattr= false;
+ } else {
+ xacl->count = 0;
+ }
+ break;
+ case BXATTR_RESTORE:
+ DMSG0(ctx, DINFO, "bxattr_restore\n");
+ if (!skipextract){
return perform_write_xattr(ctx, xacl);
+ }
+ break;
}
return bRC_OK;
*/
bRC METAPLUGIN::metadataRestore(bpContext *ctx, struct meta_pkt *mp)
{
- POOL_MEM cmd(PM_FNAME);
+ if (!skipextract){
+ POOL_MEM cmd(PM_FNAME);
- if (mp->buf != NULL && mp->buf_len > 0){
- /* send command METADATA */
- pm_strcpy(cmd, prepare_metadata_type(mp->type));
- backend.ctx->write_command(ctx, cmd.c_str());
- /* send metadata stream data */
- DMSG1(ctx, DINFO, "writeMetadata: %i\n", mp->buf_len);
- int rc = backend.ctx->write_data(ctx, (char*)mp->buf, mp->buf_len);
- if (rc < 0){
- /* got some error */
- return bRC_Error;
- }
- /* signal end of metadata stream to restore and get ack */
- if (!backend.ctx->send_ack(ctx)){
- return bRC_Error;
+ if (mp->buf != NULL && mp->buf_len > 0){
+ /* send command METADATA */
+ pm_strcpy(cmd, prepare_metadata_type(mp->type));
+ backend.ctx->write_command(ctx, cmd.c_str());
+ /* send metadata stream data */
+ DMSG1(ctx, DINFO, "writeMetadata: %i\n", mp->buf_len);
+ int rc = backend.ctx->write_data(ctx, (char*)mp->buf, mp->buf_len);
+ if (rc < 0){
+ /* got some error */
+ return bRC_Error;
+ }
+
+ // signal end of metadata stream to restore and get ack
+ backend.ctx->signal_eod(ctx);
+
+ // check if backend accepted the file
+ if (backend.ctx->read_command(ctx, cmd) > 0) {
+ DMSG(ctx, DINFO, "metadataRestore:resp: %s\n", cmd.c_str());
+ if (bstrcmp(cmd.c_str(), "SKIP")) {
+ // SKIP!
+ skipextract = true;
+ return bRC_Skip;
+ }
+ if (!bstrcmp(cmd.c_str(), "OK")) {
+ DMSG(ctx, DERROR, "Wrong backend response to metadataRestore, got: %s\n", cmd.c_str());
+ JMSG(ctx, backend.ctx->jmsg_err_level(), "Wrong backend response to metadataRestore, got: %s\n", cmd.c_str());
+ return bRC_Error;
+ }
+ } else {
+ if (backend.ctx->is_error()) {
+ // raise up error from backend
+ return bRC_Error;
+ }
+ }
}
}
-
return bRC_OK;
}