am 71ebe154: Add mkdirs() command.

* commit '71ebe154a5fbbb4b394a439ff0b6b9c84fbd04f5':
  Add mkdirs() command.
gugelfrei
Jeff Sharkey 11 years ago committed by Android Git Automerger
commit 530a6c1787

@ -200,6 +200,12 @@ int CommandListener::VolumeCmd::runCommand(SocketClient *cli,
(enabled ? "Share enabled" : "Share disabled"), false);
}
return 0;
} else if (!strcmp(argv[1], "mkdirs")) {
if (argc != 3) {
cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume mkdirs <path>", false);
return 0;
}
rc = vm->mkdirs(argv[2]);
} else {
cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false);
}

@ -32,6 +32,7 @@
#include <openssl/md5.h>
#include <cutils/fs.h>
#include <cutils/log.h>
#include <sysutils/NetlinkEvent.h>
@ -1577,6 +1578,26 @@ int VolumeManager::cleanupAsec(Volume *v, bool force) {
}
return rc;
}
int VolumeManager::mkdirs(char* path) {
// Require that path lives under a volume we manage
const char* emulated_source = getenv("EMULATED_STORAGE_SOURCE");
const char* root = NULL;
if (!strncmp(path, emulated_source, strlen(emulated_source))) {
root = emulated_source;
} else {
Volume* vol = getVolumeForFile(path);
if (vol) {
root = vol->getMountpoint();
}
}
if (!root) {
SLOGE("Failed to find volume for %s", path);
return -EINVAL;
}
/* fs_mkdirs() does symlink checking and relative path enforcement */
return fs_mkdirs(path, 0700);
}

@ -140,6 +140,15 @@ public:
int getDirectVolumeList(struct volume_info *vol_list);
int unmountAllAsecsInDir(const char *directory);
/*
* Ensure that all directories along given path exist, creating parent
* directories as needed. Validates that given path is absolute and that
* it contains no relative "." or ".." paths or symlinks. Last path segment
* is treated as filename and ignored, unless the path ends with "/". Also
* ensures that path belongs to a volume managed by vold.
*/
int mkdirs(char* path);
private:
VolumeManager();
void readInitialState();

Loading…
Cancel
Save