[Box Backup-dev] COMMIT r516 - box/chris/general/lib/backupclient
Ben Summers
boxbackup-dev at fluffy.co.uk
Sun Feb 26 16:33:33 GMT 2006
What's wrong with exceptions?
Ben
On 26 Feb 2006, at 00:28, subversion at fluffy.co.uk wrote:
> Author: chris
> Date: 2006-02-26 00:28:22 +0000 (Sun, 26 Feb 2006)
> New Revision: 516
>
> Modified:
> box/chris/general/lib/backupclient/BackupClientRestore.cpp
> Log:
> * BackupClientRestore.cpp
> - Detect when the user tries to restore to a directory whose parent
> does not
> exist, and return an appropriate error
>
>
> Modified: box/chris/general/lib/backupclient/BackupClientRestore.cpp
> ===================================================================
> --- box/chris/general/lib/backupclient/BackupClientRestore.cpp
> 2006-02-26 00:27:45 UTC (rev 515)
> +++ box/chris/general/lib/backupclient/BackupClientRestore.cpp
> 2006-02-26 00:28:22 UTC (rev 516)
> @@ -206,7 +206,7 @@
> // Created: 23/11/03
> //
> //
> ----------------------------------------------------------------------
> ----
> -static void BackupClientRestoreDir(BackupProtocolClient
> &rConnection, int64_t DirectoryID, std::string &rLocalDirectoryName,
> +static int BackupClientRestoreDir(BackupProtocolClient
> &rConnection, int64_t DirectoryID, std::string &rLocalDirectoryName,
> RestoreParams &Params, RestoreResumeInfo &rLevel)
> {
> // If we're resuming... check that we haven't got a next level to
> look at
> @@ -222,12 +222,11 @@
> // Remove the level for the recursed directory
> rLevel.RemoveLevel();
> }
> -
> - // Save the resumption information
> - Params.mResumeInfo.Save(Params.mRestoreResumeInfoFilename);
>
> // Create the local directory (if not already done) -- path and
> owner set later, just use restrictive owner mode
> - switch(ObjectExists(rLocalDirectoryName.c_str()))
> + int exists = ObjectExists(rLocalDirectoryName.c_str());
> +
> + switch(exists)
> {
> case ObjectExists_Dir:
> // Do nothing
> @@ -244,16 +243,64 @@
> }
> // follow through to... (no break)
> case ObjectExists_NoObject:
> - if(::mkdir(rLocalDirectoryName.c_str(), S_IRWXU) != 0)
> - {
> - THROW_EXCEPTION(CommonException, OSFileError);
> - }
> break;
> default:
> ASSERT(false);
> break;
> }
> +
> + std::string parentDirectoryName(rLocalDirectoryName);
> + if(parentDirectoryName[parentDirectoryName.size() - 1] == '/')
> + {
> + parentDirectoryName.resize(parentDirectoryName.size() - 1);
> + }
> +
> + int lastSlash = parentDirectoryName.rfind
> (DIRECTORY_SEPARATOR_ASCHAR);
> + if(lastSlash != std::string::npos)
> + {
> + // the target directory is a deep path, remove the last
> + // directory name and check that the resulting parent
> + // exists, otherwise the restore should fail.
> + parentDirectoryName.resize(lastSlash);
> + switch(ObjectExists(parentDirectoryName.c_str()))
> + {
> + case ObjectExists_Dir:
> + // this is fine, do nothing
> + break;
> +
> + case ObjectExists_File:
> + fprintf(stderr, "Failed to restore: '%s' "
> + "is a file, but should be a "
> + "directory.\n",
> + parentDirectoryName.c_str());
> + return Restore_TargetPathNotFound;
> +
> + case ObjectExists_NoObject:
> + fprintf(stderr, "Failed to restore: "
> + "parent '%s' of target directory "
> + "does not exist.\n",
> + parentDirectoryName.c_str());
> + return Restore_TargetPathNotFound;
> +
> + default:
> + fprintf(stderr, "Failed to restore: "
> + "unknown result from "
> + "ObjectExists('%s').\n",
> + parentDirectoryName.c_str());
> + return Restore_UnknownError;
> + }
> + }
> +
> + if((exists == ObjectExists_NoObject ||
> + exists == ObjectExists_File) &&
> + ::mkdir(rLocalDirectoryName.c_str(), S_IRWXU) != 0)
> + {
> + THROW_EXCEPTION(CommonException, OSFileError);
> + }
>
> + // Save the resumption information
> + Params.mResumeInfo.Save(Params.mRestoreResumeInfoFilename);
> +
> // Fetch the directory listing from the server -- getting a list
> of files which is approparite to the restore type
> rConnection.QueryListDirectory(
> DirectoryID,
> @@ -347,7 +394,7 @@
> }
>
>
> - // Recuse to directories
> + // Recurse to directories
> {
> BackupStoreDirectory::Iterator i(dir);
> BackupStoreDirectory::Entry *en = 0;
> @@ -364,7 +411,14 @@
> RestoreResumeInfo &rnextLevel(rLevel.AddLevel(en->GetObjectID
> (), nm.GetClearFilename()));
>
> // Recurse
> - BackupClientRestoreDir(rConnection, en->GetObjectID(),
> localDirname, Params, rnextLevel);
> + int result = BackupClientRestoreDir(
> + rConnection, en->GetObjectID(),
> + localDirname, Params, rnextLevel);
> +
> + if (result != Restore_Complete)
> + {
> + return result;
> + }
>
> // Remove the level for the above call
> rLevel.RemoveLevel();
> @@ -373,7 +427,9 @@
> rLevel.mRestoredObjects.insert(en->GetObjectID());
> }
> }
> - }
> + }
> +
> + return Restore_Complete;
> }
>
>
> @@ -444,7 +500,12 @@
>
> // Restore the directory
> std::string localName(LocalDirectoryName);
> - BackupClientRestoreDir(rConnection, DirectoryID, localName,
> params, params.mResumeInfo);
> + int result = BackupClientRestoreDir(rConnection, DirectoryID,
> + localName, params, params.mResumeInfo);
> + if (result != Restore_Complete)
> + {
> + return result;
> + }
>
> // Undelete the directory on the server?
> if(RestoreDeleted && UndeleteAfterRestoreDeleted)
>
> _______________________________________________
> Boxbackup-dev mailing list
> Boxbackup-dev at fluffy.co.uk
> http://lists.warhead.org.uk/mailman/listinfo/boxbackup-dev
More information about the Boxbackup-dev
mailing list