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