diff options
author | San Mehat <san@google.com> | 2010-02-18 11:40:49 -0800 |
---|---|---|
committer | San Mehat <san@google.com> | 2010-02-18 11:48:50 -0800 |
commit | 8f2875b29780312f4edda3d831cc8a99e1648dd5 (patch) | |
tree | 03c7e599e963e1302b563e04e3f0ccdeac2b2964 | |
parent | 4ba8948dc16463053e21cda5744f519a555080d0 (diff) | |
download | system_vold-8f2875b29780312f4edda3d831cc8a99e1648dd5.tar.gz system_vold-8f2875b29780312f4edda3d831cc8a99e1648dd5.tar.bz2 system_vold-8f2875b29780312f4edda3d831cc8a99e1648dd5.zip |
vold: Clean up asec command response and add support for 'StorageBusy'
Signed-off-by: San Mehat <san@google.com>
-rw-r--r-- | Android.mk | 3 | ||||
-rw-r--r-- | CommandListener.cpp | 65 | ||||
-rw-r--r-- | ResponseCode.cpp | 40 | ||||
-rw-r--r-- | ResponseCode.h | 4 |
4 files changed, 61 insertions, 51 deletions
@@ -24,7 +24,8 @@ LOCAL_SRC_FILES:= \ geom_mbr_enc.c \ Fat.cpp \ Loop.cpp \ - Devmapper.cpp + Devmapper.cpp \ + ResponseCode.cpp LOCAL_MODULE:= vold diff --git a/CommandListener.cpp b/CommandListener.cpp index c87198e..f47d66c 100644 --- a/CommandListener.cpp +++ b/CommandListener.cpp @@ -88,21 +88,8 @@ int CommandListener::VolumeCmd::runCommand(SocketClient *cli, if (!rc) { cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false); } else { - /* - * Failed - */ - if (errno == ENODEV) { - rc = ResponseCode::OpFailedNoMedia; - } else if (errno == ENODATA) { - rc = ResponseCode::OpFailedMediaBlank; - } else if (errno == EIO) { - rc = ResponseCode::OpFailedMediaCorrupt; - } else if (errno == EBUSY) { - rc = ResponseCode::OpFailedVolBusy; - } else { - LOGW("Returning OperationFailed - no handler for errno %d", errno); - rc = ResponseCode::OperationFailed; - } + int erno = errno; + rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "volume operation failed", true); } @@ -223,7 +210,6 @@ int CommandListener::AsecCmd::runCommand(SocketClient *cli, } } closedir(d); - cli->sendMsg(ResponseCode::CommandOkay, "ASEC listing complete", false); } else if (!strcmp(argv[1], "create")) { if (argc != 7) { cli->sendMsg(ResponseCode::CommandSyntaxError, @@ -232,21 +218,13 @@ int CommandListener::AsecCmd::runCommand(SocketClient *cli, } unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512; - if (vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]))) { - cli->sendMsg(ResponseCode::OperationFailed, "Container creation failed", true); - } else { - cli->sendMsg(ResponseCode::CommandOkay, "Container created", false); - } + rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6])); } else if (!strcmp(argv[1], "finalize")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false); return 0; } - if (vm->finalizeAsec(argv[2])) { - cli->sendMsg(ResponseCode::OperationFailed, "Container finalize failed", true); - } else { - cli->sendMsg(ResponseCode::CommandOkay, "Container finalized", false); - } + rc = vm->finalizeAsec(argv[2]); } else if (!strcmp(argv[1], "destroy")) { if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false); @@ -256,25 +234,14 @@ int CommandListener::AsecCmd::runCommand(SocketClient *cli, if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } - if (vm->destroyAsec(argv[2], force)) { - cli->sendMsg(ResponseCode::OperationFailed, "Container destroy failed", true); - } else { - cli->sendMsg(ResponseCode::CommandOkay, "Container destroyed", false); - } + rc = vm->destroyAsec(argv[2], force); } else if (!strcmp(argv[1], "mount")) { if (argc != 5) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec mount <namespace-id> <key> <ownerUid>", false); return 0; } - - int rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4])); - - if (rc < 0) { - cli->sendMsg(ResponseCode::OperationFailed, "Mount failed", true); - } else { - cli->sendMsg(ResponseCode::CommandOkay, "Mount succeeded", false); - } + rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4])); } else if (!strcmp(argv[1], "unmount")) { if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false); @@ -284,22 +251,14 @@ int CommandListener::AsecCmd::runCommand(SocketClient *cli, if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } - if (vm->unmountAsec(argv[2], force)) { - cli->sendMsg(ResponseCode::OperationFailed, "Container unmount failed", true); - } else { - cli->sendMsg(ResponseCode::CommandOkay, "Container unmounted", false); - } + rc = vm->unmountAsec(argv[2], force); } else if (!strcmp(argv[1], "rename")) { if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec rename <old_id> <new_id>", false); return 0; } - if (vm->renameAsec(argv[2], argv[3])) { - cli->sendMsg(ResponseCode::OperationFailed, "Container rename failed", true); - } else { - cli->sendMsg(ResponseCode::CommandOkay, "Container renamed", false); - } + rc = vm->renameAsec(argv[2], argv[3]); } else if (!strcmp(argv[1], "path")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false); @@ -312,9 +271,17 @@ int CommandListener::AsecCmd::runCommand(SocketClient *cli, } else { cli->sendMsg(ResponseCode::AsecPathResult, path, false); } + return 0; } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false); } + if (!rc) { + cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false); + } else { + rc = ResponseCode::convertFromErrno(); + cli->sendMsg(rc, "asec operation failed", true); + } + return 0; } diff --git a/ResponseCode.cpp b/ResponseCode.cpp new file mode 100644 index 0000000..d0410b6 --- /dev/null +++ b/ResponseCode.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#define LOG_TAG "Vold" + +#include <cutils/log.h> + +#include "ResponseCode.h" + +int ResponseCode::convertFromErrno() { + if (errno == ENODEV) { + return(ResponseCode::OpFailedNoMedia); + } else if (errno == ENODATA) { + return(ResponseCode::OpFailedMediaBlank); + } else if (errno == EIO) { + return(ResponseCode::OpFailedMediaCorrupt); + } else if (errno == EBUSY) { + return(ResponseCode::OpFailedStorageBusy); + } + + LOGW("Returning OperationFailed - no handler for errno %d", errno); + return(ResponseCode::OperationFailed); +} diff --git a/ResponseCode.h b/ResponseCode.h index 3508f81..31d6482 100644 --- a/ResponseCode.h +++ b/ResponseCode.h @@ -40,7 +40,7 @@ public: static const int OpFailedMediaBlank = 402; static const int OpFailedMediaCorrupt = 403; static const int OpFailedVolNotMounted = 404; - static const int OpFailedVolBusy = 405; + static const int OpFailedStorageBusy = 405; // 500 series - The command was not accepted and the requested // action did not take place. @@ -59,5 +59,7 @@ public: static const int VolumeDiskInserted = 630; static const int VolumeDiskRemoved = 631; static const int VolumeBadRemoval = 632; + + static int convertFromErrno(); }; #endif |