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