CommandListener.cpp revision 736910ca99a40b9add4353bf619e778c40938948
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>
242350c44ff39b4cb2940893964a05f778fc80a436San Mehat#include <fcntl.h>
2537dcda68d334f70e1f7f69a9817def65fe3ee717Olivier Bailly#include <string.h>
26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
27d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat#define LOG_TAG "VoldCmdListener"
28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h>
29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sysutils/SocketClient.h>
31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
32f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "CommandListener.h"
33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h"
34a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "ResponseCode.h"
35586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat#include "Process.h"
362350c44ff39b4cb2940893964a05f778fc80a436San Mehat#include "Xwarp.h"
37d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat#include "Loop.h"
38d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat#include "Devmapper.h"
398f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall#include "cryptfs.h"
40f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
41f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::CommandListener() :
42f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                 FrameworkListener("vold") {
43d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    registerCmd(new DumpCmd());
44eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    registerCmd(new VolumeCmd());
45eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    registerCmd(new AsecCmd());
46508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root    registerCmd(new ObbCmd());
47586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    registerCmd(new StorageCmd());
482350c44ff39b4cb2940893964a05f778fc80a436San Mehat    registerCmd(new XwarpCmd());
498f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    registerCmd(new CryptfsCmd());
50f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
52d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehatvoid CommandListener::dumpArgs(int argc, char **argv, int argObscure) {
53d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    char buffer[4096];
54d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    char *p = buffer;
55d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
56d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    memset(buffer, 0, sizeof(buffer));
57d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    int i;
58d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    for (i = 0; i < argc; i++) {
598f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        unsigned int len = strlen(argv[i]) + 1; // Account for space
60d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        if (i == argObscure) {
61d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            len += 2; // Account for {}
62d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        }
63d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        if (((p - buffer) + len) < (sizeof(buffer)-1)) {
64d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            if (i == argObscure) {
65d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                *p++ = '{';
66d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                *p++ = '}';
67d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                *p++ = ' ';
68d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                continue;
69d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            }
70d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            strcpy(p, argv[i]);
71d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            p+= strlen(argv[i]);
72d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            if (i != (argc -1)) {
73d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                *p++ = ' ';
74d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat            }
75d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        }
76d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    }
7797ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat    SLOGD("%s", buffer);
78d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat}
79d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
80d9a4e358614a0c5f60cc76c0636ee4bb02004a32San MehatCommandListener::DumpCmd::DumpCmd() :
81d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                 VoldCommand("dump") {
82d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat}
83d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
84d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehatint CommandListener::DumpCmd::runCommand(SocketClient *cli,
85d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat                                         int argc, char **argv) {
86d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    cli->sendMsg(0, "Dumping loop status", false);
87d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    if (Loop::dumpState(cli)) {
88d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Loop dump failed", true);
89d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    }
90d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    cli->sendMsg(0, "Dumping DM status", false);
91d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    if (Devmapper::dumpState(cli)) {
92d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Devmapper dump failed", true);
93d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    }
9496597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat    cli->sendMsg(0, "Dumping mounted filesystems", false);
9596597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat    FILE *fp = fopen("/proc/mounts", "r");
9696597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat    if (fp) {
9796597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat        char line[1024];
9896597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat        while (fgets(line, sizeof(line), fp)) {
9996597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat            line[strlen(line)-1] = '\0';
10096597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat            cli->sendMsg(0, line, false);;
10196597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat        }
10296597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat        fclose(fp);
10396597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat    }
104d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
105d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    cli->sendMsg(ResponseCode::CommandOkay, "dump complete", false);
106d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    return 0;
107d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat}
108d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
109d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
110eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::VolumeCmd::VolumeCmd() :
111eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                 VoldCommand("volume") {
112f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat}
113f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
114eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::VolumeCmd::runCommand(SocketClient *cli,
115f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat                                                      int argc, char **argv) {
116d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    dumpArgs(argc, argv, -1);
117d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
118eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (argc < 2) {
119eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
120eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        return 0;
121eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    }
122f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat
123eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    VolumeManager *vm = VolumeManager::Instance();
124eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    int rc = 0;
125eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat
126eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!strcmp(argv[1], "list")) {
127eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        return vm->listVolumes(cli);
128d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    } else if (!strcmp(argv[1], "debug")) {
12957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc != 3 || (argc == 3 && (strcmp(argv[2], "off") && strcmp(argv[2], "on")))) {
13057df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume debug <off/on>", false);
13157df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
13257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
13357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        vm->setDebug(!strcmp(argv[2], "on") ? true : false);
134eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "mount")) {
13557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc != 3) {
13657df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume mount <path>", false);
13757df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
13857df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
139eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->mountVolume(argv[2]);
140eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "unmount")) {
14157df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc < 3 || argc > 4 || (argc == 4 && strcmp(argv[3], "force"))) {
14257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume unmount <path> [force]", false);
14357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
14457df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
14557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat
1464ba8948dc16463053e21cda5744f519a555080d0San Mehat        bool force = false;
1474ba8948dc16463053e21cda5744f519a555080d0San Mehat        if (argc >= 4 && !strcmp(argv[3], "force")) {
1484ba8948dc16463053e21cda5744f519a555080d0San Mehat            force = true;
1494ba8948dc16463053e21cda5744f519a555080d0San Mehat        }
1504ba8948dc16463053e21cda5744f519a555080d0San Mehat        rc = vm->unmountVolume(argv[2], force);
151eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "format")) {
15257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc != 3) {
15357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume format <path>", false);
15457df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
15557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
156eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        rc = vm->formatVolume(argv[2]);
157eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "share")) {
15857df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc != 4) {
15957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
16057df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat                    "Usage: volume share <path> <method>", false);
16157df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
16257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
163b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat        rc = vm->shareVolume(argv[2], argv[3]);
164eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "unshare")) {
16557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc != 4) {
16657df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
16757df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat                    "Usage: volume unshare <path> <method>", false);
16857df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
16957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
170b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat        rc = vm->unshareVolume(argv[2], argv[3]);
171eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "shared")) {
172eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        bool enabled = false;
17357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        if (argc != 4) {
17457df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
17557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat                    "Usage: volume shared <path> <method>", false);
17657df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat            return 0;
17757df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat        }
178eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat
1792b22552f9a3b077f9d0a3624ac6f9b8b332f8a7aSan Mehat        if (vm->shareEnabled(argv[2], argv[3], &enabled)) {
180eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(
181eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    ResponseCode::OperationFailed, "Failed to determine share enable state", true);
182eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        } else {
183eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::ShareEnabledResult,
184eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    (enabled ? "Share enabled" : "Share disabled"), false);
185eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
186b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat        return 0;
18749e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    } else {
188eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false);
18949e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat    }
19049e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat
191eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!rc) {
192eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false);
193a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    } else {
1948f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        int erno = errno;
1958f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = ResponseCode::convertFromErrno();
196eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(rc, "volume operation failed", true);
197a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    }
198a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
199a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat    return 0;
200a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat}
201a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat
202586536c60b773e3517531ad8a6cb0de6722c67fcSan MehatCommandListener::StorageCmd::StorageCmd() :
203586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                 VoldCommand("storage") {
204586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat}
205586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
206586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehatint CommandListener::StorageCmd::runCommand(SocketClient *cli,
207586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                                                      int argc, char **argv) {
208d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat    dumpArgs(argc, argv, -1);
209d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat
210586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    if (argc < 2) {
211586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
212586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        return 0;
213586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    }
214586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
215586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    if (!strcmp(argv[1], "users")) {
216586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        DIR *dir;
217586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        struct dirent *de;
218586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
219586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        if (!(dir = opendir("/proc"))) {
220586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to open /proc", true);
221586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            return 0;
222586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        }
223586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
224586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        while ((de = readdir(dir))) {
225586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            int pid = Process::getPid(de->d_name);
226586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
227586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            if (pid < 0) {
228586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                continue;
229586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            }
230586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
231586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            char processName[255];
232586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            Process::getProcessName(pid, processName, sizeof(processName));
233586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
234586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            if (Process::checkFileDescriptorSymLinks(pid, argv[2]) ||
235586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                Process::checkFileMaps(pid, argv[2]) ||
236586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                Process::checkSymLink(pid, argv[2], "cwd") ||
237586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                Process::checkSymLink(pid, argv[2], "root") ||
238586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                Process::checkSymLink(pid, argv[2], "exe")) {
239586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
240586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                char msg[1024];
241586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                snprintf(msg, sizeof(msg), "%d %s", pid, processName);
242586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat                cli->sendMsg(ResponseCode::StorageUsersListResult, msg, false);
243586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat            }
244586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        }
245586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        closedir(dir);
246586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Storage user list complete", false);
247586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    } else {
248586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false);
249586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    }
250586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat    return 0;
251586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat}
252586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat
253eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::AsecCmd::AsecCmd() :
254eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                 VoldCommand("asec") {
255048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat}
256048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat
257eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::AsecCmd::runCommand(SocketClient *cli,
258eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                                                      int argc, char **argv) {
259eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (argc < 2) {
260eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
261048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat        return 0;
262048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat    }
263048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat
264eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    VolumeManager *vm = VolumeManager::Instance();
265eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    int rc = 0;
266a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
267eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    if (!strcmp(argv[1], "list")) {
268d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
2693bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat        DIR *d = opendir(Volume::SEC_ASECDIR);
270a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
271eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (!d) {
272eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true);
273eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
274eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
275a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
276eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        struct dirent *dent;
277eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        while ((dent = readdir(d))) {
278eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            if (dent->d_name[0] == '.')
279eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                continue;
280eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) {
281eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                char id[255];
282eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                memset(id, 0, sizeof(id));
283eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                strncpy(id, dent->d_name, strlen(dent->d_name) -5);
284eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                cli->sendMsg(ResponseCode::AsecListResult, id, false);
285eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            }
286eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
287eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        closedir(d);
288eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "create")) {
289d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, 5);
290eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 7) {
291eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
292eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>", false);
293eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
294a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat        }
295a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
296eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512;
2978f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]));
298eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "finalize")) {
299d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
300eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 3) {
301eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false);
302eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
303eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
3048f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = vm->finalizeAsec(argv[2]);
305eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "destroy")) {
306d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
3074ba8948dc16463053e21cda5744f519a555080d0San Mehat        if (argc < 3) {
3084ba8948dc16463053e21cda5744f519a555080d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false);
309eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
310eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
3114ba8948dc16463053e21cda5744f519a555080d0San Mehat        bool force = false;
3124ba8948dc16463053e21cda5744f519a555080d0San Mehat        if (argc > 3 && !strcmp(argv[3], "force")) {
3134ba8948dc16463053e21cda5744f519a555080d0San Mehat            force = true;
3144ba8948dc16463053e21cda5744f519a555080d0San Mehat        }
3158f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = vm->destroyAsec(argv[2], force);
316eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "mount")) {
317d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, 3);
318eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 5) {
319eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
320eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    "Usage: asec mount <namespace-id> <key> <ownerUid>", false);
321eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
322eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
3238f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4]));
324eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "unmount")) {
325d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
3264ba8948dc16463053e21cda5744f519a555080d0San Mehat        if (argc < 3) {
3274ba8948dc16463053e21cda5744f519a555080d0San Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false);
328eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
329eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
3304ba8948dc16463053e21cda5744f519a555080d0San Mehat        bool force = false;
3314ba8948dc16463053e21cda5744f519a555080d0San Mehat        if (argc > 3 && !strcmp(argv[3], "force")) {
3324ba8948dc16463053e21cda5744f519a555080d0San Mehat            force = true;
3334ba8948dc16463053e21cda5744f519a555080d0San Mehat        }
3348f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = vm->unmountAsec(argv[2], force);
335eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "rename")) {
336d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
337eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 4) {
338eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError,
339eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat                    "Usage: asec rename <old_id> <new_id>", false);
340eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
341eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
3428f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = vm->renameAsec(argv[2], argv[3]);
343eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat    } else if (!strcmp(argv[1], "path")) {
344d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
345eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        if (argc != 3) {
346eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false);
347eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            return 0;
348eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
349eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        char path[255];
350a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
35188ac2c06539485942bf414efda2d39647fa1a415San Mehat        if (!(rc = vm->getAsecMountPath(argv[2], path, sizeof(path)))) {
352eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
35388ac2c06539485942bf414efda2d39647fa1a415San Mehat            return 0;
354eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        }
355736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn    } else if (!strcmp(argv[1], "fspath")) {
356736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn        dumpArgs(argc, argv, -1);
357736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn        if (argc != 3) {
358736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fspath <container-id>", false);
359736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn            return 0;
360736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn        }
361736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn        char path[255];
362736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn
363736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn        if (!(rc = vm->getAsecFilesystemPath(argv[2], path, sizeof(path)))) {
364736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
365736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn            return 0;
366736910ca99a40b9add4353bf619e778c40938948Dianne Hackborn        }
367a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    } else {
368d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat        dumpArgs(argc, argv, -1);
369eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false);
370a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    }
371a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat
3728f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat    if (!rc) {
3738f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false);
3748f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat    } else {
3758f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        rc = ResponseCode::convertFromErrno();
3768f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat        cli->sendMsg(rc, "asec operation failed", true);
3778f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat    }
3788f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat
379a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat    return 0;
380a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat}
3812350c44ff39b4cb2940893964a05f778fc80a436San Mehat
382508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny RootCommandListener::ObbCmd::ObbCmd() :
383508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root                 VoldCommand("obb") {
384fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root}
385fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
386508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Rootint CommandListener::ObbCmd::runCommand(SocketClient *cli,
387fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root                                                      int argc, char **argv) {
388fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    if (argc < 2) {
389fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
390fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        return 0;
391fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    }
392fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
393fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    VolumeManager *vm = VolumeManager::Instance();
394fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    int rc = 0;
395fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
396508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root    if (!strcmp(argv[1], "list")) {
397508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        dumpArgs(argc, argv, -1);
398508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root
399508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        rc = vm->listMountedObbs(cli);
400508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root    } else if (!strcmp(argv[1], "mount")) {
401fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root            dumpArgs(argc, argv, 3);
402fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root            if (argc != 5) {
403fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root                cli->sendMsg(ResponseCode::CommandSyntaxError,
404508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root                        "Usage: obb mount <filename> <key> <ownerUid>", false);
405fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root                return 0;
406fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root            }
407508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root            rc = vm->mountObb(argv[2], argv[3], atoi(argv[4]));
408fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    } else if (!strcmp(argv[1], "unmount")) {
409fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        dumpArgs(argc, argv, -1);
410fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        if (argc < 3) {
411508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb unmount <source file> [force]", false);
412fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root            return 0;
413fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        }
414fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        bool force = false;
415fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        if (argc > 3 && !strcmp(argv[3], "force")) {
416fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root            force = true;
417fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        }
418508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        rc = vm->unmountObb(argv[2], force);
419508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root    } else if (!strcmp(argv[1], "path")) {
420508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        dumpArgs(argc, argv, -1);
421508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        if (argc != 3) {
422508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb path <source file>", false);
423508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root            return 0;
424508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        }
425508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        char path[255];
426508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root
427508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        if (!(rc = vm->getObbMountPath(argv[2], path, sizeof(path)))) {
428508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root            cli->sendMsg(ResponseCode::AsecPathResult, path, false);
429508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root            return 0;
430508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        }
431fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    } else {
432fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        dumpArgs(argc, argv, -1);
433508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown obb cmd", false);
434fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    }
435fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
436fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    if (!rc) {
437508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        cli->sendMsg(ResponseCode::CommandOkay, "obb operation succeeded", false);
438fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    } else {
439fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root        rc = ResponseCode::convertFromErrno();
440508c0e1605b795bbb51cb47d955b89f3df26ca94Kenny Root        cli->sendMsg(rc, "obb operation failed", true);
441fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    }
442fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
443fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root    return 0;
444fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root}
445fb7c4d5a8a1031cf0e493ff182dcf458e5fe8c77Kenny Root
4462350c44ff39b4cb2940893964a05f778fc80a436San MehatCommandListener::XwarpCmd::XwarpCmd() :
4472350c44ff39b4cb2940893964a05f778fc80a436San Mehat                 VoldCommand("xwarp") {
4482350c44ff39b4cb2940893964a05f778fc80a436San Mehat}
4492350c44ff39b4cb2940893964a05f778fc80a436San Mehat
4502350c44ff39b4cb2940893964a05f778fc80a436San Mehatint CommandListener::XwarpCmd::runCommand(SocketClient *cli,
4512350c44ff39b4cb2940893964a05f778fc80a436San Mehat                                                      int argc, char **argv) {
4522350c44ff39b4cb2940893964a05f778fc80a436San Mehat    if (argc < 2) {
4532350c44ff39b4cb2940893964a05f778fc80a436San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
4542350c44ff39b4cb2940893964a05f778fc80a436San Mehat        return 0;
4552350c44ff39b4cb2940893964a05f778fc80a436San Mehat    }
4562350c44ff39b4cb2940893964a05f778fc80a436San Mehat
4572350c44ff39b4cb2940893964a05f778fc80a436San Mehat    if (!strcmp(argv[1], "enable")) {
4582350c44ff39b4cb2940893964a05f778fc80a436San Mehat        if (Xwarp::enable()) {
4592350c44ff39b4cb2940893964a05f778fc80a436San Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to enable xwarp", true);
4602350c44ff39b4cb2940893964a05f778fc80a436San Mehat            return 0;
4612350c44ff39b4cb2940893964a05f778fc80a436San Mehat        }
4622350c44ff39b4cb2940893964a05f778fc80a436San Mehat
4632350c44ff39b4cb2940893964a05f778fc80a436San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Xwarp mirroring started", false);
4642350c44ff39b4cb2940893964a05f778fc80a436San Mehat    } else if (!strcmp(argv[1], "disable")) {
4652350c44ff39b4cb2940893964a05f778fc80a436San Mehat        if (Xwarp::disable()) {
4662350c44ff39b4cb2940893964a05f778fc80a436San Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to disable xwarp", true);
4672350c44ff39b4cb2940893964a05f778fc80a436San Mehat            return 0;
4682350c44ff39b4cb2940893964a05f778fc80a436San Mehat        }
4692350c44ff39b4cb2940893964a05f778fc80a436San Mehat
4702350c44ff39b4cb2940893964a05f778fc80a436San Mehat        cli->sendMsg(ResponseCode::CommandOkay, "Xwarp disabled", false);
4712350c44ff39b4cb2940893964a05f778fc80a436San Mehat    } else if (!strcmp(argv[1], "status")) {
4722350c44ff39b4cb2940893964a05f778fc80a436San Mehat        char msg[255];
4732350c44ff39b4cb2940893964a05f778fc80a436San Mehat        bool r;
4742350c44ff39b4cb2940893964a05f778fc80a436San Mehat        unsigned mirrorPos, maxSize;
4752350c44ff39b4cb2940893964a05f778fc80a436San Mehat
4762350c44ff39b4cb2940893964a05f778fc80a436San Mehat        if (Xwarp::status(&r, &mirrorPos, &maxSize)) {
4772350c44ff39b4cb2940893964a05f778fc80a436San Mehat            cli->sendMsg(ResponseCode::OperationFailed, "Failed to get xwarp status", true);
4782350c44ff39b4cb2940893964a05f778fc80a436San Mehat            return 0;
4792350c44ff39b4cb2940893964a05f778fc80a436San Mehat        }
4802350c44ff39b4cb2940893964a05f778fc80a436San Mehat        snprintf(msg, sizeof(msg), "%s %u %u", (r ? "ready" : "not-ready"), mirrorPos, maxSize);
4812350c44ff39b4cb2940893964a05f778fc80a436San Mehat        cli->sendMsg(ResponseCode::XwarpStatusResult, msg, false);
4822350c44ff39b4cb2940893964a05f778fc80a436San Mehat    } else {
4832350c44ff39b4cb2940893964a05f778fc80a436San Mehat        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false);
4842350c44ff39b4cb2940893964a05f778fc80a436San Mehat    }
4852350c44ff39b4cb2940893964a05f778fc80a436San Mehat
4862350c44ff39b4cb2940893964a05f778fc80a436San Mehat    return 0;
4872350c44ff39b4cb2940893964a05f778fc80a436San Mehat}
4888f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
4898f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken SumrallCommandListener::CryptfsCmd::CryptfsCmd() :
4908f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall                 VoldCommand("cryptfs") {
4918f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall}
4928f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
4938f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrallint CommandListener::CryptfsCmd::runCommand(SocketClient *cli,
4948f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall                                                      int argc, char **argv) {
4958f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    if (argc < 2) {
4968f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
4978f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        return 0;
4988f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    }
4998f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
5008f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    int rc = 0;
5018f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
5028f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    if (!strcmp(argv[1], "checkpw")) {
5038f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        if (argc != 3) {
5048f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false);
5058f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall            return 0;
5068f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        }
5078ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall        dumpArgs(argc, argv, 2);
5088f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        rc = cryptfs_check_passwd(argv[2]);
5096864b7ec94a57b73c300457955d86dc604aeddf5Ken Sumrall    } else if (!strcmp(argv[1], "restart")) {
5106864b7ec94a57b73c300457955d86dc604aeddf5Ken Sumrall        if (argc != 2) {
5116864b7ec94a57b73c300457955d86dc604aeddf5Ken Sumrall            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false);
5126864b7ec94a57b73c300457955d86dc604aeddf5Ken Sumrall            return 0;
5136864b7ec94a57b73c300457955d86dc604aeddf5Ken Sumrall        }
5148ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall        dumpArgs(argc, argv, -1);
5156864b7ec94a57b73c300457955d86dc604aeddf5Ken Sumrall        rc = cryptfs_restart();
5167f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall    } else if (!strcmp(argv[1], "cryptocomplete")) {
5177f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall        if (argc != 2) {
5187f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false);
5197f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall            return 0;
5207f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall        }
5217f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall        dumpArgs(argc, argv, -1);
5227f7dbaa2784c10fd2989fb303e5edfb8136d53dcKen Sumrall        rc = cryptfs_crypto_complete();
5238f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    } else if (!strcmp(argv[1], "enablecrypto")) {
5248f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) {
5258f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false);
5268f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall            return 0;
5278f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        }
5288ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall        dumpArgs(argc, argv, 3);
5298f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        rc = cryptfs_enable(argv[2], argv[3]);
5308ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall    } else if (!strcmp(argv[1], "changepw")) {
53170a4b3fd7a84a84bbe6e9d6d4ca3ee2098259fd9Jason parks        if (argc != 3) {
53270a4b3fd7a84a84bbe6e9d6d4ca3ee2098259fd9Jason parks            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false);
5338ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall            return 0;
5348ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall        }
53570a4b3fd7a84a84bbe6e9d6d4ca3ee2098259fd9Jason parks        SLOGD("cryptfs changepw {}");
53670a4b3fd7a84a84bbe6e9d6d4ca3ee2098259fd9Jason parks        rc = cryptfs_changepw(argv[2]);
5378f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    } else {
5388ddbe40a8a8708dac7c472fa8c098c8f7b24534cKen Sumrall        dumpArgs(argc, argv, -1);
5398f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall        cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false);
5408f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    }
5418f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
5420167cb15935592deea9abbd6a8bbe904e27bd101Jason parks    // Always report that the command succeeded and return the error code.
5430167cb15935592deea9abbd6a8bbe904e27bd101Jason parks    // The caller will check the return value to see what the error was.
5440167cb15935592deea9abbd6a8bbe904e27bd101Jason parks    char msg[255];
5450167cb15935592deea9abbd6a8bbe904e27bd101Jason parks    snprintf(msg, sizeof(msg), "%d", rc);
5460167cb15935592deea9abbd6a8bbe904e27bd101Jason parks    cli->sendMsg(ResponseCode::CommandOkay, msg, false);
5478f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
5488f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall    return 0;
5498f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall}
5508f869aa1bc685b505c58e97b4e11a9c7491a16f9Ken Sumrall
551