CommandListener.cpp revision a2677e4ad01f250b0765f04adf0acfa6627efc98
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> 19f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <netinet/in.h> 20f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <arpa/inet.h> 21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <errno.h> 22f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 23f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define LOG_TAG "CommandListener" 24f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sysutils/SocketClient.h> 27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "CommandListener.h" 29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h" 30a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "ResponseCode.h" 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 32f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::CommandListener() : 33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat FrameworkListener("vold") { 34f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat registerCmd(new ListVolumesCmd()); 35a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new MountCmd()); 36a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new UnmountCmd()); 37a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareCmd()); 38a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new UnshareCmd()); 39a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareAvailableCmd()); 40a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new SimulateCmd()); 41a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new FormatCmd()); 42f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 43f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 44f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::ListVolumesCmd::ListVolumesCmd() : 45f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat VoldCommand("list_volumes") { 46f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 47f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 48f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint CommandListener::ListVolumesCmd::runCommand(SocketClient *cli, 49f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return VolumeManager::Instance()->listVolumes(cli); 51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 52f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 53a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::MountCmd::MountCmd() : 54a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("mount") { 55f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 56f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 57a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::MountCmd::runCommand(SocketClient *cli, 58f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 5949e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat /* Synchronously mount a volume */ 6049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat if (VolumeManager::Instance()->mountVolume(argv[1])) { 61a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to mount volume.", true); 6249e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 63a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume mounted.", false); 6449e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 6549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 67f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 68f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 69a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnmountCmd::UnmountCmd() : 70a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("unmount") { 71f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 72f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 73a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnmountCmd::runCommand(SocketClient *cli, 74f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 7549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat /* Synchronously unmount a volume */ 76a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->unmountVolume(argv[1])) { 77a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to unmount volume.", true); 78a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 79a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume unmounted.", false); 80a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 81a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 82a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 83a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 84a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 85a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() : 86a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share") { 87a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 88a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 89a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli, 90a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 91a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->shareVolume(argv[1], argv[2])) { 92a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to share volume.", true); 9349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 94a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume shared.", false); 9549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 9649e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 97f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 98f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 99f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 100a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnshareCmd::UnshareCmd() : 101a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("unshare") { 102f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 103f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 104a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnshareCmd::runCommand(SocketClient *cli, 105f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 106a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->unshareVolume(argv[1], argv[2])) { 107a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to unshare volume.", true); 108a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 109a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume unshared.", false); 110a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 111a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 112f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 113f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 114f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 115a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareAvailableCmd::ShareAvailableCmd() : 116a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share_available") { 117f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 118f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 119a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareAvailableCmd::runCommand(SocketClient *cli, 120f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 121a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat bool avail = false; 122a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 123a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->shareAvailable(argv[1], &avail)) { 124a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, 125a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat "Failed to determine share availability", true); 126a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 127a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::ShareAvailabilityResult, 128a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat (avail ? "Share available" : "Share unavailable"), 129a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat false); 130a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 131a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 132a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 133a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 134a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::SimulateCmd::SimulateCmd() : 135a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("simulate") { 136a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 137a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 138a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::SimulateCmd::runCommand(SocketClient *cli, 139a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 140a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->simulate(argv[1], argv[2])) { 141a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to execute.", true); 142a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 143a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Simulation executed.", false); 144a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 145a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 146a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 147a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 148a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 149a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::FormatCmd::FormatCmd() : 150a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("format") { 151a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 152a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 153a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::FormatCmd::runCommand(SocketClient *cli, 154a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 155a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (VolumeManager::Instance()->formatVolume(argv[1])) { 156a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to format", true); 157a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 158a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Volume formatted.", false); 159a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 160a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 161f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 162f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 163