CommandListener.cpp revision a19b250bd273455933ca3502cf2c2e0a803aff77
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());
48a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    registerCmd(new ListAsecCmd());
49a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    registerCmd(new AsecPathCmd());
50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
52f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::ListVolumesCmd::ListVolumesCmd() :
53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                 VoldCommand("list_volumes") {
54f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
55f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
56f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint CommandListener::ListVolumesCmd::runCommand(SocketClient *cli,
57f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
58f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    return VolumeManager::Instance()->listVolumes(cli);
59f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
60f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
61a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::MountCmd::MountCmd() :
62a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("mount") {
63f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
64f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
65a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::MountCmd::runCommand(SocketClient *cli,
66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
6749e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    /* Synchronously mount a volume */
6849e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    if (VolumeManager::Instance()->mountVolume(argv[1])) {
69a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to mount volume.", true);
7049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    } else {
71a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Volume mounted.", false);
7249e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    }
7349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
74f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    return 0;
75f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
76f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
77a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnmountCmd::UnmountCmd() :
78a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("unmount") {
79f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
80f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
81a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnmountCmd::runCommand(SocketClient *cli,
82f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
8349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    /* Synchronously unmount a volume */
84a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    if (VolumeManager::Instance()->unmountVolume(argv[1])) {
85a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to unmount volume.", true);
86a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
87a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Volume unmounted.", false);
88a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
89a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
90a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    return 0;
91a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
92a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
93a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() :
94a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("share") {
95a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
96a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
97a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli,
98a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                                                      int argc, char **argv) {
99a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    if (VolumeManager::Instance()->shareVolume(argv[1], argv[2])) {
100a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to share volume.", true);
10149e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    } else {
102a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Volume shared.", false);
10349e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    }
10449e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
105f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    return 0;
106f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
107f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
108a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::UnshareCmd::UnshareCmd() :
109a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("unshare") {
110f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
111f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
112a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::UnshareCmd::runCommand(SocketClient *cli,
113f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
114a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    if (VolumeManager::Instance()->unshareVolume(argv[1], argv[2])) {
115a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to unshare volume.", true);
116a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
117a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Volume unshared.", false);
118a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
119a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
120f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    return 0;
121f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
122f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
123a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareAvailableCmd::ShareAvailableCmd() :
124a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("share_available") {
125f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
126f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
127a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareAvailableCmd::runCommand(SocketClient *cli,
128f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
129a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    bool avail = false;
130a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
131a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    if (VolumeManager::Instance()->shareAvailable(argv[1], &avail)) {
132a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed,
133a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                     "Failed to determine share availability", true);
134a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
135a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::ShareAvailabilityResult,
136a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                     (avail ? "Share available" : "Share unavailable"),
137a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                     false);
138a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
139a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    return 0;
140a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
141a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
142a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::SimulateCmd::SimulateCmd() :
143a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("simulate") {
144a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
145a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
146a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::SimulateCmd::runCommand(SocketClient *cli,
147a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                                            int argc, char **argv) {
148a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    if (VolumeManager::Instance()->simulate(argv[1], argv[2])) {
149a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to execute.", true);
150a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
151a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Simulation executed.", false);
152a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
153a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
154a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    return 0;
155a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
156a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
157a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::FormatCmd::FormatCmd() :
158a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("format") {
159a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
160a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
161a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::FormatCmd::runCommand(SocketClient *cli,
162a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                                            int argc, char **argv) {
163a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    if (VolumeManager::Instance()->formatVolume(argv[1])) {
164a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to format", true);
165a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
166a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Volume formatted.", false);
167a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
168a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
169f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat    return 0;
170f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
171a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
172a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::CreateAsecCmd::CreateAsecCmd() :
173a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                 VoldCommand("create_asec") {
174a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
175a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
176a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::CreateAsecCmd::runCommand(SocketClient *cli,
177a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                            int argc, char **argv) {
178a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (argc != 6) {
179a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError,
180a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                     "Usage: create_asec <namespace-id> <size_mb> <fstype> <key> <ownerUid>",
181a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                     false);
182a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
183a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
184a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
185a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (VolumeManager::Instance()->createAsec(argv[1], atoi(argv[2]),
186a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                              argv[3], argv[4],
187a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                              atoi(argv[5]))) {
188a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Cache creation failed", true);
189a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
190a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Cache created", false);
191a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
192a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
193a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
194a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
195a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
196a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::FinalizeAsecCmd::FinalizeAsecCmd() :
197a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                 VoldCommand("finalize_asec") {
198a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
199a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
200a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::FinalizeAsecCmd::runCommand(SocketClient *cli,
201a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                            int argc, char **argv) {
202a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (argc != 2) {
203a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError,
204a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                     "Usage: finalize_asec <namespace-id>", false);
205a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
206a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
207a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
208a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (VolumeManager::Instance()->finalizeAsec(argv[1])) {
209a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Cache finalize failed", true);
210a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
211a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Cache finalized", false);
212a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
213a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
214a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
215a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
216a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::DestroyAsecCmd::DestroyAsecCmd() :
217a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                 VoldCommand("destroy_asec") {
218a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
219a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
220a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::DestroyAsecCmd::runCommand(SocketClient *cli,
221a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                            int argc, char **argv) {
222a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (argc != 2) {
223a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError,
224a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                     "Usage: destroy_asec <namespace-id>", false);
225a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
226a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
227a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
228a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (VolumeManager::Instance()->destroyAsec(argv[1])) {
229a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Destroy failed", true);
230a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
231a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Cache Destroyed", false);
232a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
233a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
234a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
235a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
236a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::MountAsecCmd::MountAsecCmd() :
237a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                 VoldCommand("mount_asec") {
238a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
239a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
240a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::MountAsecCmd::runCommand(SocketClient *cli,
241a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                            int argc, char **argv) {
242a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (argc != 4) {
243a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError,
244a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                     "Usage: mount_asec <namespace-id> <key> <ownerUid>", false);
245a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
246a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
247a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
248a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (VolumeManager::Instance()->mountAsec(argv[1], argv[2], atoi(argv[3]))) {
249a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Mount failed", true);
250a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
251a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Mount succeeded", false);
252a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
253a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
254a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
255a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
256a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::ListAsecCmd::ListAsecCmd() :
257a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                 VoldCommand("list_asec") {
258a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
259a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
260a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
261a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::ListAsecCmd::runCommand(SocketClient *cli,
262a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                            int argc, char **argv) {
263a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    DIR *d = opendir("/sdcard/android_secure");
264a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
265a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (!d) {
266a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true);
267a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
268a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
269a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
270a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    struct dirent *dent;
271a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    while ((dent = readdir(d))) {
272a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        if (dent->d_name[0] == '.')
273a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat            continue;
274a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) {
275a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat            char id[255];
276a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat            memset(id, 0, sizeof(id));
277a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat            strncpy(id, dent->d_name, strlen(dent->d_name) -5);
278a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat            cli->sendMsg(ResponseCode::AsecListResult, id, false);
279a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        }
280a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
281a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    closedir(d);
282a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    cli->sendMsg(ResponseCode::CommandOkay, "ASEC listing complete", false);
283a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
284a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
285a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
286a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
287a19b250bd273455933ca3502cf2c2e0a803aff77San MehatCommandListener::AsecPathCmd::AsecPathCmd() :
288a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                 VoldCommand("asec_path") {
289a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
290a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
291a19b250bd273455933ca3502cf2c2e0a803aff77San Mehatint CommandListener::AsecPathCmd::runCommand(SocketClient *cli,
292a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                            int argc, char **argv) {
293a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (argc != 2) {
294a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError,
295a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                     "Usage: asec_path <namespace-id>", false);
296a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
297a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
298a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
299a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    char mountPath[255];
300a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
301a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    if (VolumeManager::Instance()->getAsecMountPath(argv[1], mountPath,
302a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat                                                    sizeof(mountPath))) {
303a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::OperationFailed, "Failed to get mount path", true);
304a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
305a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        cli->sendMsg(ResponseCode::AsecPathResult, mountPath, false);
306a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
307a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
308a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
309a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
310