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