CommandListener.cpp revision 048b0801fcd6fcfbb8fa812284c751181e4821b8
1f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat/* 2f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Copyright (C) 2008 The Android Open Source Project 3f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 4f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * you may not use this file except in compliance with the License. 6f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * You may obtain a copy of the License at 7f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 8f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 10f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Unless required by applicable law or agreed to in writing, software 11f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * See the License for the specific language governing permissions and 14f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * limitations under the License. 15f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat */ 16f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 17f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <stdlib.h> 18f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sys/socket.h> 19a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat#include <sys/types.h> 20f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <netinet/in.h> 21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <arpa/inet.h> 22a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat#include <dirent.h> 23f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <errno.h> 24f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define LOG_TAG "CommandListener" 26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sysutils/SocketClient.h> 29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "CommandListener.h" 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h" 32a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "ResponseCode.h" 33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 34f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::CommandListener() : 35f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat FrameworkListener("vold") { 36f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat registerCmd(new ListVolumesCmd()); 37a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new MountCmd()); 38a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new UnmountCmd()); 39a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareCmd()); 40a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new UnshareCmd()); 41a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareAvailableCmd()); 42a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new SimulateCmd()); 43a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new FormatCmd()); 44a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new CreateAsecCmd()); 45a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new FinalizeAsecCmd()); 46a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new DestroyAsecCmd()); 47a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new MountAsecCmd()); 485817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat registerCmd(new UnmountAsecCmd()); 49048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat registerCmd(new RenameAsecCmd()); 50a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new ListAsecCmd()); 51a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat registerCmd(new AsecPathCmd()); 52f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 54f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::ListVolumesCmd::ListVolumesCmd() : 55f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VoldCommand("list_volumes") { 56f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 57f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 58f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint CommandListener::ListVolumesCmd::runCommand(SocketClient *cli, 59f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 60f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return VolumeManager::Instance()->listVolumes(cli); 61f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 62f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 63a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::MountCmd::MountCmd() : 64a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("mount") { 65f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 67a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::MountCmd::runCommand(SocketClient *cli, 68f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 6949e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat /* Synchronously mount a volume */ 7049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat if (VolumeManager::Instance()->mountVolume(argv[1])) { 71a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to mount volume.", true); 7249e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 73a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume mounted.", false); 7449e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 7549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 76f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 77f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 78f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 79a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnmountCmd::UnmountCmd() : 80a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("unmount") { 81f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 82f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 83a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnmountCmd::runCommand(SocketClient *cli, 84f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 8549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat /* Synchronously unmount a volume */ 86a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->unmountVolume(argv[1])) { 87a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to unmount volume.", true); 88a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 89a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume unmounted.", false); 90a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 91a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 92a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 93a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 94a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 95a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() : 96a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share") { 97a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 98a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 99a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli, 100a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 101a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->shareVolume(argv[1], argv[2])) { 102a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to share volume.", true); 10349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 104a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume shared.", false); 10549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 10649e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 107f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 108f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 109f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 110a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnshareCmd::UnshareCmd() : 111a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("unshare") { 112f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 113f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 114a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnshareCmd::runCommand(SocketClient *cli, 115f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 116a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->unshareVolume(argv[1], argv[2])) { 117a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to unshare volume.", true); 118a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 119a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume unshared.", false); 120a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 121a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 122f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 123f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 124f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 125a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareAvailableCmd::ShareAvailableCmd() : 126a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share_available") { 127f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 128f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 129a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareAvailableCmd::runCommand(SocketClient *cli, 130f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 131a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat bool avail = false; 132a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 133a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->shareAvailable(argv[1], &avail)) { 134a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, 135a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat "Failed to determine share availability", true); 136a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 137a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::ShareAvailabilityResult, 138a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat (avail ? "Share available" : "Share unavailable"), 139a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat false); 140a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 141a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 142a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 143a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 144a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::SimulateCmd::SimulateCmd() : 145a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("simulate") { 146a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 147a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 148a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::SimulateCmd::runCommand(SocketClient *cli, 149a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 150a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->simulate(argv[1], argv[2])) { 151a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to execute.", true); 152a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 153a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Simulation executed.", false); 154a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 155a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 156a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 157a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 158a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 159a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::FormatCmd::FormatCmd() : 160a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("format") { 161a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 162a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 163a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::FormatCmd::runCommand(SocketClient *cli, 164a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 165a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->formatVolume(argv[1])) { 166a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to format", true); 167a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 168a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume formatted.", false); 169a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 170a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 171f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 172f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 173a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 174a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::CreateAsecCmd::CreateAsecCmd() : 175a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("create_asec") { 176a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 177a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 178a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::CreateAsecCmd::runCommand(SocketClient *cli, 179a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 180a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 6) { 181a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 182a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: create_asec <namespace-id> <size_mb> <fstype> <key> <ownerUid>", 183a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat false); 184a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 185a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 186a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 1878b8f71b1d760411279f3b07a5c97709f052c689eSan Mehat unsigned int numSectors = (atoi(argv[2]) * (1024 * 1024)) / 512; 188dfe79492a4f5280e9de2db6fa749a7781c59f2a6San Mehat if (VolumeManager::Instance()->createAsec(argv[1], numSectors, 189a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat argv[3], argv[4], 190a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat atoi(argv[5]))) { 191c66770f4c0497430a78e982cabe65b31828055c6San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container creation failed", true); 192a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 193c66770f4c0497430a78e982cabe65b31828055c6San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container created", false); 194a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 195a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 196a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 197a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 198a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 199a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::FinalizeAsecCmd::FinalizeAsecCmd() : 200a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("finalize_asec") { 201a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 202a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 203a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::FinalizeAsecCmd::runCommand(SocketClient *cli, 204a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 205a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 2) { 206a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 207a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: finalize_asec <namespace-id>", false); 208a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 209a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 210a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 211a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->finalizeAsec(argv[1])) { 212c66770f4c0497430a78e982cabe65b31828055c6San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container finalize failed", true); 213a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 214c66770f4c0497430a78e982cabe65b31828055c6San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container finalized", false); 215a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 216a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 217a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 218a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 219a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::DestroyAsecCmd::DestroyAsecCmd() : 220a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("destroy_asec") { 221a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 222a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 223a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::DestroyAsecCmd::runCommand(SocketClient *cli, 224a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 225a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 2) { 226a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 227a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: destroy_asec <namespace-id>", false); 228a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 229a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 230a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 231a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->destroyAsec(argv[1])) { 232a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Destroy failed", true); 233a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 234c66770f4c0497430a78e982cabe65b31828055c6San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container Destroyed", false); 235a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 236a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 237a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 238a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 239a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::MountAsecCmd::MountAsecCmd() : 240a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("mount_asec") { 241a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 242a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 243a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::MountAsecCmd::runCommand(SocketClient *cli, 244a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 245a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 4) { 246a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 247a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: mount_asec <namespace-id> <key> <ownerUid>", false); 248a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 249a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 250a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 251a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->mountAsec(argv[1], argv[2], atoi(argv[3]))) { 252a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Mount failed", true); 253a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 254a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Mount succeeded", false); 255a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 256a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 257a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 258a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 2595817821cf10b5f7d13eb693ffbc3f80f13bc681bSan MehatCommandListener::UnmountAsecCmd::UnmountAsecCmd() : 2605817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat VoldCommand("unmount_asec") { 2615817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat} 2625817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 2635817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehatint CommandListener::UnmountAsecCmd::runCommand(SocketClient *cli, 2645817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat int argc, char **argv) { 2655817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat if (argc != 2) { 2665817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 2675817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat "Usage: unmount_asec <namespace-id>", false); 2685817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat return 0; 2695817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat } 2705817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 2715817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat if (VolumeManager::Instance()->unmountAsec(argv[1])) { 2725817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Unmount failed", true); 2735817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat } else { 2745817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Unmount succeeded", false); 2755817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat } 2765817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat return 0; 2775817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat} 2785817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 279048b0801fcd6fcfbb8fa812284c751181e4821b8San MehatCommandListener::RenameAsecCmd::RenameAsecCmd() : 280048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat VoldCommand("rename_asec") { 281048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat} 282048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 283048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehatint CommandListener::RenameAsecCmd::runCommand(SocketClient *cli, 284048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat int argc, char **argv) { 285048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat if (argc != 3) { 286048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 287048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat "Usage: rename_asec <id1> <id2>", false); 288048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat return 0; 289048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat } 290048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 291048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat if (VolumeManager::Instance()->renameAsec(argv[1], argv[2])) { 292048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Rename failed", true); 293048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat } else { 294048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Rename succeeded", false); 295048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat } 296048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat return 0; 297048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat} 298048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 299a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::ListAsecCmd::ListAsecCmd() : 300a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("list_asec") { 301a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 302a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 303a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 304a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::ListAsecCmd::runCommand(SocketClient *cli, 305a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 306a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat DIR *d = opendir("/sdcard/android_secure"); 307a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 308a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (!d) { 309a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true); 310a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 311a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 312a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 313a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat struct dirent *dent; 314a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat while ((dent = readdir(d))) { 315a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (dent->d_name[0] == '.') 316a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat continue; 317a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) { 318a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat char id[255]; 319a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat memset(id, 0, sizeof(id)); 320a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat strncpy(id, dent->d_name, strlen(dent->d_name) -5); 321a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::AsecListResult, id, false); 322a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 323a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 324a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat closedir(d); 325a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ASEC listing complete", false); 326a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 327a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 328a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 329a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 330a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::AsecPathCmd::AsecPathCmd() : 331a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat VoldCommand("asec_path") { 332a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 333a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 334a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::AsecPathCmd::runCommand(SocketClient *cli, 335a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat int argc, char **argv) { 336a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (argc != 2) { 337a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 338a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat "Usage: asec_path <namespace-id>", false); 339a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 340a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 341a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 342a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat char mountPath[255]; 343a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 344a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat if (VolumeManager::Instance()->getAsecMountPath(argv[1], mountPath, 345a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat sizeof(mountPath))) { 346a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get mount path", true); 347a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 348a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat cli->sendMsg(ResponseCode::AsecPathResult, mountPath, false); 349a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 350a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 351a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 352a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 353