From 649214baa3166aec940f17a8f93dd234111f2044 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 29 Apr 2007 13:47:03 +0000 Subject: Make directories user-writable while restoring them, so that restoring read-only directories as a non-root user doesn't crash. Restore the correct permissions after restoring the directory's contents. (refs #3) --- lib/backupclient/BackupClientRestore.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/backupclient/BackupClientRestore.cpp b/lib/backupclient/BackupClientRestore.cpp index ec4ca681..0b2b6d84 100644 --- a/lib/backupclient/BackupClientRestore.cpp +++ b/lib/backupclient/BackupClientRestore.cpp @@ -412,7 +412,7 @@ static int BackupClientRestoreDir(BackupProtocolClient &rConnection, int64_t Dir try { - dirAttr.WriteAttributes(rLocalDirectoryName.c_str()); + dirAttr.WriteAttributes(rLocalDirectoryName.c_str(), true); } catch (BoxException &e) { @@ -591,6 +591,7 @@ static int BackupClientRestoreDir(BackupProtocolClient &rConnection, int64_t Dir } } + // Make sure the restore info has been saved if(bytesWrittenSinceLastRestoreInfoSave != 0) { @@ -663,6 +664,30 @@ static int BackupClientRestoreDir(BackupProtocolClient &rConnection, int64_t Dir } } + // now remove the user writable flag, if we added it earlier + try + { + dirAttr.WriteAttributes(rLocalDirectoryName.c_str(), false); + } + catch (BoxException &e) + { + ::syslog(LOG_ERR, "Failed to restore attributes for %s: %s", + rLocalDirectoryName.c_str(), e.what()); + return Restore_UnknownError; + } + catch(std::exception &e) + { + ::syslog(LOG_ERR, "Failed to restore attributes for %s: %s", + rLocalDirectoryName.c_str(), e.what()); + return Restore_UnknownError; + } + catch(...) + { + ::syslog(LOG_ERR, "Failed to restore attributes for %s: " + "unknown error", rLocalDirectoryName.c_str()); + return Restore_UnknownError; + } + return Restore_Complete; } -- cgit v1.2.3