ignore clonepath metadata errors. fixes #470

This commit is contained in:
Antonio SJ Musumeci 2018-03-08 16:41:33 -05:00
parent aa6e4c1865
commit cfe9c28a10
2 changed files with 34 additions and 21 deletions

View File

@ -49,10 +49,17 @@ ignorable_error(const int err)
namespace fs namespace fs
{ {
/*
Attempts to clone a path.
The directories which already exist are left alone.
The new directories have metadata set to match the original if
possible. Optionally ignore errors on metadata copies.
*/
int int
clonepath(const string &fromsrc, clonepath(const string &fromsrc,
const string &tosrc, const string &tosrc,
const char *relative) const char *relative,
const bool return_metadata_errors)
{ {
int rv; int rv;
struct stat st; struct stat st;
@ -83,29 +90,28 @@ namespace fs
rv = fs::mkdir(topath,st.st_mode); rv = fs::mkdir(topath,st.st_mode);
if(rv == -1) if(rv == -1)
{ {
if(errno != EEXIST) if(errno == EEXIST)
return -1; return 0;
else
rv = fs::chmod_check_on_error(topath,st.st_mode);
if(rv == -1)
return -1; return -1;
} }
// It may not support it... it's fine... // it may not support it... it's fine...
rv = fs::attr::copy(frompath,topath); rv = fs::attr::copy(frompath,topath);
if((rv == -1) && !ignorable_error(errno)) if(return_metadata_errors && (rv == -1) && !ignorable_error(errno))
return -1; return -1;
// it may not support it... it's fine...
rv = fs::xattr::copy(frompath,topath); rv = fs::xattr::copy(frompath,topath);
if((rv == -1) && !ignorable_error(errno)) if(return_metadata_errors && (rv == -1) && !ignorable_error(errno))
return -1; return -1;
rv = fs::lchown_check_on_error(topath,st); rv = fs::lchown_check_on_error(topath,st);
if(rv == -1) if(return_metadata_errors && (rv == -1))
return -1; return -1;
rv = fs::utime(topath,st); rv = fs::utime(topath,st);
if(rv == -1) if(return_metadata_errors && (rv == -1))
return -1; return -1;
return 0; return 0;
@ -114,15 +120,17 @@ namespace fs
int int
clonepath(const std::string &from, clonepath(const std::string &from,
const std::string &to, const std::string &to,
const std::string &relative) const std::string &relative,
const bool return_metadata_errors)
{ {
return fs::clonepath(from,to,relative.c_str()); return fs::clonepath(from,to,relative.c_str(),return_metadata_errors);
} }
int int
clonepath_as_root(const string &from, clonepath_as_root(const string &from,
const string &to, const string &to,
const char *relative) const char *relative,
const bool return_metadata_errors)
{ {
if((relative == NULL) || (relative[0] == '\0')) if((relative == NULL) || (relative[0] == '\0'))
return 0; return 0;
@ -132,15 +140,16 @@ namespace fs
{ {
const ugid::SetRootGuard ugidGuard; const ugid::SetRootGuard ugidGuard;
return fs::clonepath(from,to,relative); return fs::clonepath(from,to,relative,return_metadata_errors);
} }
} }
int int
clonepath_as_root(const std::string &from, clonepath_as_root(const std::string &from,
const std::string &to, const std::string &to,
const std::string &relative) const std::string &relative,
const bool return_metadata_errors)
{ {
return fs::clonepath_as_root(from,to,relative.c_str()); return fs::clonepath_as_root(from,to,relative.c_str(),return_metadata_errors);
} }
} }

View File

@ -22,15 +22,19 @@ namespace fs
{ {
int clonepath(const std::string &from, int clonepath(const std::string &from,
const std::string &to, const std::string &to,
const char *relative); const char *relative,
const bool return_metadata_errors = false);
int clonepath(const std::string &from, int clonepath(const std::string &from,
const std::string &to, const std::string &to,
const std::string &relative); const std::string &relative,
const bool return_metadata_errors = false);
int clonepath_as_root(const std::string &from, int clonepath_as_root(const std::string &from,
const std::string &to, const std::string &to,
const char *relative); const char *relative,
const bool return_metadata_errors = false);
int clonepath_as_root(const std::string &from, int clonepath_as_root(const std::string &from,
const std::string &to, const std::string &to,
const std::string &relative); const std::string &relative,
const bool return_metadata_errors = false);
} }