CommandListener.cpp revision 2b22552f9a3b077f9d0a3624ac6f9b8b332f8a7a
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") {
36eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    registerCmd(new VolumeCmd());
37eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    registerCmd(new AsecCmd());
38a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    registerCmd(new ShareCmd());
39f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
40f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
41eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::VolumeCmd::VolumeCmd() :
42eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                 VoldCommand("volume") {
43f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
44f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
45eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::VolumeCmd::runCommand(SocketClient *cli,
46f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
47eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (argc < 2) {
48eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
49eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        return 0;
50eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    }
51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
52eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    VolumeManager *vm = VolumeManager::Instance();
53eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    int rc = 0;
54eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat
55eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!strcmp(argv[1], "list")) {
56eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        return vm->listVolumes(cli);
57eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "mount")) {
58eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->mountVolume(argv[2]);
59eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "unmount")) {
60eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->unmountVolume(argv[2]);
61eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "format")) {
62eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->formatVolume(argv[2]);
63eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "share")) {
64eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->shareVolume(argv[1], argv[2]);
65eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "unshare")) {
66eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->unshareVolume(argv[1], argv[2]);
67eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "shared")) {
68eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        bool enabled = false;
69eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat
702b22552f9a3b077f9d0a3624ac6f9b8b332f8a7aSan Mehat        if (vm->shareEnabled(argv[2], argv[3], &enabled)) {
71eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(
72eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    ResponseCode::OperationFailed, "Failed to determine share enable state", true);
73eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
74eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::ShareEnabledResult,
75eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    (enabled ? "Share enabled" : "Share disabled"), false);
76eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
7749e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    } else {
78eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false);
7949e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    }
8049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
81eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!rc) {
82eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false);
83a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
84eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        /*
85eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat         * Failed
86eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat         */
87eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (errno == ENODEV) {
88eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            rc = ResponseCode::OpFailedNoMedia;
89eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else if (errno == ENODATA) {
90eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            rc = ResponseCode::OpFailedMediaBlank;
91eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else if (errno == EIO) {
92eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            rc = ResponseCode::OpFailedMediaCorrupt;
93eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else if (errno == EBUSY) {
94eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            rc = ResponseCode::OpFailedVolBusy;
95eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
96eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            rc = ResponseCode::OperationFailed;
97eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
98eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(rc, "volume operation failed", true);
99a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
100a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
101a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    return 0;
102a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
103a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
104a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() :
105a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                 VoldCommand("share") {
106a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
107a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
108a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli,
109a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat                                                      int argc, char **argv) {
110eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (argc < 2) {
111eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
112a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        return 0;
113a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
114a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
115eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    VolumeManager *vm = VolumeManager::Instance();
116eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    int rc = 0;
117a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
118eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!strcmp(argv[1], "status")) {
119eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        bool avail = false;
120a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
121eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->shareAvailable(argv[2], &avail)) {
122eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(
123eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    ResponseCode::OperationFailed, "Failed to determine share availability", true);
124eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
125eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::ShareStatusResult,
126eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    (avail ? "Share available" : "Share unavailable"), false);
127eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
128a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
129eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown share cmd", false);
130a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
1315817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat
1325817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat    return 0;
1335817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat}
1345817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat
135eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::AsecCmd::AsecCmd() :
136eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                 VoldCommand("asec") {
137048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat}
138048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat
139eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::AsecCmd::runCommand(SocketClient *cli,
140eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                                                      int argc, char **argv) {
141eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (argc < 2) {
142eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
143048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat        return 0;
144048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat    }
145048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat
146eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    VolumeManager *vm = VolumeManager::Instance();
147eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    int rc = 0;
148a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
149eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!strcmp(argv[1], "list")) {
150eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        DIR *d = opendir("/sdcard/android_secure");
151a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
152eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (!d) {
153eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true);
154eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
155eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
156a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
157eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        struct dirent *dent;
158eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        while ((dent = readdir(d))) {
159eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            if (dent->d_name[0] == '.')
160eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                continue;
161eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) {
162eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                char id[255];
163eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                memset(id, 0, sizeof(id));
164eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                strncpy(id, dent->d_name, strlen(dent->d_name) -5);
165eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                cli->sendMsg(ResponseCode::AsecListResult, id, false);
166eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            }
167eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
168eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        closedir(d);
169eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandOkay, "ASEC listing complete", false);
170eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "create")) {
171eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 7) {
172eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
173eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>", false);
174eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
175a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        }
176a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
177eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512;
178eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]))) {
179eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Container creation failed", true);
180eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
181eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandOkay, "Container created", false);
182eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
183eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "finalize")) {
184eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 3) {
185eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false);
186eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
187eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
188eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->finalizeAsec(argv[2])) {
189eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Container finalize failed", true);
190eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
191eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandOkay, "Container finalized", false);
192eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
193eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "destroy")) {
194eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 3) {
195eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id>", false);
196eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
197eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
198eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->destroyAsec(argv[2])) {
199eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Container destroy failed", true);
200eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
201eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandOkay, "Container destroyed", false);
202eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
203eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "mount")) {
204eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 5) {
205eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
206eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    "Usage: asec mount <namespace-id> <key> <ownerUid>", false);
207eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
208eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
209a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
210eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        int rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4]));
211a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
212eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (rc < 0) {
213eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Mount failed", true);
214eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
215eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandOkay, "Mount succeeded", false);
216eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
217a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
218eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "unmount")) {
219eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 3) {
220eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id>", false);
221eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
222eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
223eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->unmountAsec(argv[2])) {
224eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Container unmount failed", true);
225eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
226eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandOkay, "Container unmounted", false);
227eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
228eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "rename")) {
229eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 4) {
230eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
231eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    "Usage: asec rename <old_id> <new_id>", false);
232eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
233eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
234eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->renameAsec(argv[2], argv[3])) {
235eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Container rename failed", true);
236eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
237eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandOkay, "Container renamed", false);
238eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
239eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "path")) {
240eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 3) {
241eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false);
242eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
243eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
244eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        char path[255];
245a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
246eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (vm->getAsecMountPath(argv[2], path, sizeof(path))) {
247eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to get path", true);
248eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
249eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
250eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
251a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
252eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false);
253a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
254a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
255a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
256a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
257