CommandListener.cpp revision 4ba8948dc16463053e21cda5744f519a555080d0
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" 33586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat#include "Process.h" 34f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 35f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::CommandListener() : 36f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat FrameworkListener("vold") { 37eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat registerCmd(new VolumeCmd()); 38eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat registerCmd(new AsecCmd()); 39a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareCmd()); 40586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat registerCmd(new StorageCmd()); 41f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 42f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 43eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::VolumeCmd::VolumeCmd() : 44eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VoldCommand("volume") { 45f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 46f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 47eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::VolumeCmd::runCommand(SocketClient *cli, 48f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 49eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc < 2) { 50eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 51eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 52eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 54eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VolumeManager *vm = VolumeManager::Instance(); 55eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = 0; 56eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat 57eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(argv[1], "list")) { 58eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return vm->listVolumes(cli); 59eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "mount")) { 60eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = vm->mountVolume(argv[2]); 61eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "unmount")) { 624ba8948dc16463053e21cda5744f519a555080d0San Mehat bool force = false; 634ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc >= 4 && !strcmp(argv[3], "force")) { 644ba8948dc16463053e21cda5744f519a555080d0San Mehat force = true; 654ba8948dc16463053e21cda5744f519a555080d0San Mehat } 664ba8948dc16463053e21cda5744f519a555080d0San Mehat rc = vm->unmountVolume(argv[2], force); 67eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "format")) { 68eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = vm->formatVolume(argv[2]); 69eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "share")) { 70b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat rc = vm->shareVolume(argv[2], argv[3]); 71eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "unshare")) { 72b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat rc = vm->unshareVolume(argv[2], argv[3]); 73eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "shared")) { 74eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat bool enabled = false; 75eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat 762b22552f9a3b077f9d0a3624ac6f9b8b332f8a7aSan Mehat if (vm->shareEnabled(argv[2], argv[3], &enabled)) { 77eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg( 78eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat ResponseCode::OperationFailed, "Failed to determine share enable state", true); 79eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 80eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::ShareEnabledResult, 81eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat (enabled ? "Share enabled" : "Share disabled"), false); 82eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 83b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat return 0; 8449e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 85eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false); 8649e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 8749e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 88eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!rc) { 89eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false); 90a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 91eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat /* 92eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat * Failed 93eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat */ 94eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (errno == ENODEV) { 95eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = ResponseCode::OpFailedNoMedia; 96eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (errno == ENODATA) { 97eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = ResponseCode::OpFailedMediaBlank; 98eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (errno == EIO) { 99eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = ResponseCode::OpFailedMediaCorrupt; 100eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (errno == EBUSY) { 101eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = ResponseCode::OpFailedVolBusy; 102eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 103b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat LOGW("Returning OperationFailed - no handler for errno %d", errno); 104eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = ResponseCode::OperationFailed; 105eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 106eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(rc, "volume operation failed", true); 107a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 108a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 109a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 110a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 111a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 112a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() : 113a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share") { 114a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 115a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 116a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli, 117a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 118eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc < 2) { 119eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 120a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 121a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 122a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 123eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VolumeManager *vm = VolumeManager::Instance(); 124eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = 0; 125a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 126eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(argv[1], "status")) { 127eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat bool avail = false; 128a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 129eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (vm->shareAvailable(argv[2], &avail)) { 130eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg( 131eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat ResponseCode::OperationFailed, "Failed to determine share availability", true); 132eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 133eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::ShareStatusResult, 134eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat (avail ? "Share available" : "Share unavailable"), false); 135eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 136a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 137eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown share cmd", false); 138a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 1395817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 1405817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat return 0; 1415817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat} 1425817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 143586536c60b773e3517531ad8a6cb0de6722c67fcSan MehatCommandListener::StorageCmd::StorageCmd() : 144586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat VoldCommand("storage") { 145586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat} 146586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 147586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehatint CommandListener::StorageCmd::runCommand(SocketClient *cli, 148586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat int argc, char **argv) { 149586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (argc < 2) { 150586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 151586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat return 0; 152586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 153586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 154586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (!strcmp(argv[1], "users")) { 155586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat DIR *dir; 156586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat struct dirent *de; 157586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 158586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (!(dir = opendir("/proc"))) { 159586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open /proc", true); 160586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat return 0; 161586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 162586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 163586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat while ((de = readdir(dir))) { 164586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat int pid = Process::getPid(de->d_name); 165586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 166586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (pid < 0) { 167586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat continue; 168586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 169586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 170586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat char processName[255]; 171586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::getProcessName(pid, processName, sizeof(processName)); 172586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 173586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (Process::checkFileDescriptorSymLinks(pid, argv[2]) || 174586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkFileMaps(pid, argv[2]) || 175586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkSymLink(pid, argv[2], "cwd") || 176586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkSymLink(pid, argv[2], "root") || 177586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkSymLink(pid, argv[2], "exe")) { 178586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 179586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat char msg[1024]; 180586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat snprintf(msg, sizeof(msg), "%d %s", pid, processName); 181586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::StorageUsersListResult, msg, false); 182586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 183586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 184586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat closedir(dir); 185586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Storage user list complete", false); 186586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } else { 187586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false); 188586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 189586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat return 0; 190586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat} 191586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 192eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::AsecCmd::AsecCmd() : 193eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VoldCommand("asec") { 194048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat} 195048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 196eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::AsecCmd::runCommand(SocketClient *cli, 197eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int argc, char **argv) { 198eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc < 2) { 199eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 200048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat return 0; 201048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat } 202048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 203eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VolumeManager *vm = VolumeManager::Instance(); 204eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = 0; 205a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 206eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(argv[1], "list")) { 207eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat DIR *d = opendir("/sdcard/android_secure"); 208a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 209eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!d) { 210eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true); 211eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 212eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 213a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 214eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat struct dirent *dent; 215eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat while ((dent = readdir(d))) { 216eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (dent->d_name[0] == '.') 217eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat continue; 218eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) { 219eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat char id[255]; 220eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat memset(id, 0, sizeof(id)); 221eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat strncpy(id, dent->d_name, strlen(dent->d_name) -5); 222eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::AsecListResult, id, false); 223eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 224eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 225eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat closedir(d); 226eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "ASEC listing complete", false); 227eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "create")) { 228eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 7) { 229eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 230eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>", false); 231eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 232a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 233a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 234eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512; 235eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]))) { 236eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container creation failed", true); 237eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 238eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container created", false); 239eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 240eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "finalize")) { 241eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 3) { 242eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false); 243eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 244eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 245eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (vm->finalizeAsec(argv[2])) { 246eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container finalize failed", true); 247eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 248eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container finalized", false); 249eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 250eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "destroy")) { 2514ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc < 3) { 2524ba8948dc16463053e21cda5744f519a555080d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false); 253eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 254eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 2554ba8948dc16463053e21cda5744f519a555080d0San Mehat bool force = false; 2564ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc > 3 && !strcmp(argv[3], "force")) { 2574ba8948dc16463053e21cda5744f519a555080d0San Mehat force = true; 2584ba8948dc16463053e21cda5744f519a555080d0San Mehat } 2594ba8948dc16463053e21cda5744f519a555080d0San Mehat if (vm->destroyAsec(argv[2], force)) { 260eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container destroy failed", true); 261eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 262eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container destroyed", false); 263eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 264eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "mount")) { 265eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 5) { 266eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 267eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat "Usage: asec mount <namespace-id> <key> <ownerUid>", false); 268eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 269eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 270a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 271eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4])); 272a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 273eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (rc < 0) { 274eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Mount failed", true); 275eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 276eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Mount succeeded", false); 277eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 278eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "unmount")) { 2794ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc < 3) { 2804ba8948dc16463053e21cda5744f519a555080d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false); 281eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 282eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 2834ba8948dc16463053e21cda5744f519a555080d0San Mehat bool force = false; 2844ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc > 3 && !strcmp(argv[3], "force")) { 2854ba8948dc16463053e21cda5744f519a555080d0San Mehat force = true; 2864ba8948dc16463053e21cda5744f519a555080d0San Mehat } 2874ba8948dc16463053e21cda5744f519a555080d0San Mehat if (vm->unmountAsec(argv[2], force)) { 288eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container unmount failed", true); 289eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 290eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container unmounted", false); 291eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 292eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "rename")) { 293eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 4) { 294eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 295eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat "Usage: asec rename <old_id> <new_id>", false); 296eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 297eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 298eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (vm->renameAsec(argv[2], argv[3])) { 299eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Container rename failed", true); 300eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 301eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Container renamed", false); 302eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 303eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "path")) { 304eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 3) { 305eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false); 306eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 307eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 308eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat char path[255]; 309a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 310eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (vm->getAsecMountPath(argv[2], path, sizeof(path))) { 311eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get path", true); 312eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 313eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::AsecPathResult, path, false); 314eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 315a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 316eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false); 317a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 318a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 319a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 320a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 321