CommandListener.cpp revision 88ac2c06539485942bf414efda2d39647fa1a415
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> 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 26d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat#define LOG_TAG "VoldCmdListener" 27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 29f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <sysutils/SocketClient.h> 30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "CommandListener.h" 32f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "VolumeManager.h" 33a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "ResponseCode.h" 34586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat#include "Process.h" 352350c44ff39b4cb2940893964a05f778fc80a436San Mehat#include "Xwarp.h" 36d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat#include "Loop.h" 37d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat#include "Devmapper.h" 38f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 39f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatCommandListener::CommandListener() : 40f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat FrameworkListener("vold") { 41d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat registerCmd(new DumpCmd()); 42eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat registerCmd(new VolumeCmd()); 43eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat registerCmd(new AsecCmd()); 44a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat registerCmd(new ShareCmd()); 45586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat registerCmd(new StorageCmd()); 462350c44ff39b4cb2940893964a05f778fc80a436San Mehat registerCmd(new XwarpCmd()); 47f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 48f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 49d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehatvoid CommandListener::dumpArgs(int argc, char **argv, int argObscure) { 50d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat char buffer[4096]; 51d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat char *p = buffer; 52d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 53d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat memset(buffer, 0, sizeof(buffer)); 54d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat int i; 55d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat for (i = 0; i < argc; i++) { 56d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat int len = strlen(argv[i]) + 1; // Account for space 57d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat if (i == argObscure) { 58d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat len += 2; // Account for {} 59d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 60d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat if (((p - buffer) + len) < (sizeof(buffer)-1)) { 61d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat if (i == argObscure) { 62d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat *p++ = '{'; 63d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat *p++ = '}'; 64d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat *p++ = ' '; 65d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat continue; 66d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 67d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat strcpy(p, argv[i]); 68d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat p+= strlen(argv[i]); 69d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat if (i != (argc -1)) { 70d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat *p++ = ' '; 71d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 72d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 73d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 74d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat LOGD("%s", buffer); 75d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat} 76d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 77d9a4e358614a0c5f60cc76c0636ee4bb02004a32San MehatCommandListener::DumpCmd::DumpCmd() : 78d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat VoldCommand("dump") { 79d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat} 80d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 81d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehatint CommandListener::DumpCmd::runCommand(SocketClient *cli, 82d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat int argc, char **argv) { 83d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat cli->sendMsg(0, "Dumping loop status", false); 84d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat if (Loop::dumpState(cli)) { 85d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Loop dump failed", true); 86d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 87d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat cli->sendMsg(0, "Dumping DM status", false); 88d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat if (Devmapper::dumpState(cli)) { 89d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Devmapper dump failed", true); 90d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } 9196597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat cli->sendMsg(0, "Dumping mounted filesystems", false); 9296597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat FILE *fp = fopen("/proc/mounts", "r"); 9396597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat if (fp) { 9496597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat char line[1024]; 9596597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat while (fgets(line, sizeof(line), fp)) { 9696597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat line[strlen(line)-1] = '\0'; 9796597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat cli->sendMsg(0, line, false);; 9896597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat } 9996597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat fclose(fp); 10096597e8b840ef671fe5279f8bd64fb09a8b38d4cSan Mehat } 101d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 102d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat cli->sendMsg(ResponseCode::CommandOkay, "dump complete", false); 103d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat return 0; 104d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat} 105d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 106d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 107eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::VolumeCmd::VolumeCmd() : 108eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VoldCommand("volume") { 109f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 110f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 111eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::VolumeCmd::runCommand(SocketClient *cli, 112f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat int argc, char **argv) { 113d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 114d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 115eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc < 2) { 116eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 117eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 118eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 119f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 120eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VolumeManager *vm = VolumeManager::Instance(); 121eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = 0; 122eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat 123eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(argv[1], "list")) { 124eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return vm->listVolumes(cli); 125d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat } else if (!strcmp(argv[1], "debug")) { 12657df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc != 3 || (argc == 3 && (strcmp(argv[2], "off") && strcmp(argv[2], "on")))) { 12757df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume debug <off/on>", false); 12857df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 12957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 13057df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat vm->setDebug(!strcmp(argv[2], "on") ? true : false); 131eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "mount")) { 13257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc != 3) { 13357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume mount <path>", false); 13457df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 13557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 136eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = vm->mountVolume(argv[2]); 137eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "unmount")) { 13857df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc < 3 || argc > 4 || (argc == 4 && strcmp(argv[3], "force"))) { 13957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume unmount <path> [force]", false); 14057df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 14157df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 14257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat 1434ba8948dc16463053e21cda5744f519a555080d0San Mehat bool force = false; 1444ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc >= 4 && !strcmp(argv[3], "force")) { 1454ba8948dc16463053e21cda5744f519a555080d0San Mehat force = true; 1464ba8948dc16463053e21cda5744f519a555080d0San Mehat } 1474ba8948dc16463053e21cda5744f519a555080d0San Mehat rc = vm->unmountVolume(argv[2], force); 148eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "format")) { 14957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc != 3) { 15057df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume format <path>", false); 15157df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 15257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 153eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat rc = vm->formatVolume(argv[2]); 154eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "share")) { 15557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc != 4) { 15657df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 15757df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat "Usage: volume share <path> <method>", false); 15857df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 15957df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 160b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat rc = vm->shareVolume(argv[2], argv[3]); 161eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "unshare")) { 16257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc != 4) { 16357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 16457df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat "Usage: volume unshare <path> <method>", false); 16557df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 16657df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 167b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat rc = vm->unshareVolume(argv[2], argv[3]); 168eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "shared")) { 169eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat bool enabled = false; 17057df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat if (argc != 4) { 17157df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 17257df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat "Usage: volume shared <path> <method>", false); 17357df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat return 0; 17457df7bf33968d65c23f3d0dc9f30a8ce2625b1d0San Mehat } 175eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat 1762b22552f9a3b077f9d0a3624ac6f9b8b332f8a7aSan Mehat if (vm->shareEnabled(argv[2], argv[3], &enabled)) { 177eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg( 178eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat ResponseCode::OperationFailed, "Failed to determine share enable state", true); 179eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 180eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::ShareEnabledResult, 181eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat (enabled ? "Share enabled" : "Share disabled"), false); 182eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 183b9aed74b146beb7499ebc5775e8ae179d16900efSan Mehat return 0; 18449e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } else { 185eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false); 18649e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat } 18749e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 188eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!rc) { 189eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false); 190a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 1918f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat int erno = errno; 1928f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = ResponseCode::convertFromErrno(); 193eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(rc, "volume operation failed", true); 194a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 195a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 196a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 0; 197a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 198a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 199a2677e4ad01f250b0765f04adf0acfa6627efc98San MehatCommandListener::ShareCmd::ShareCmd() : 200a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat VoldCommand("share") { 201a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 202a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 203a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint CommandListener::ShareCmd::runCommand(SocketClient *cli, 204a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int argc, char **argv) { 205d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 206d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 207eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc < 2) { 208eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 209a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 210a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 211a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 212eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VolumeManager *vm = VolumeManager::Instance(); 213eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = 0; 214a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 215eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(argv[1], "status")) { 216eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat bool avail = false; 217a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 218eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (vm->shareAvailable(argv[2], &avail)) { 219eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg( 220eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat ResponseCode::OperationFailed, "Failed to determine share availability", true); 221eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else { 222eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::ShareStatusResult, 223eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat (avail ? "Share available" : "Share unavailable"), false); 224eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 225a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 226eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown share cmd", false); 227a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 2285817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 2295817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat return 0; 2305817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat} 2315817821cf10b5f7d13eb693ffbc3f80f13bc681bSan Mehat 232586536c60b773e3517531ad8a6cb0de6722c67fcSan MehatCommandListener::StorageCmd::StorageCmd() : 233586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat VoldCommand("storage") { 234586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat} 235586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 236586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehatint CommandListener::StorageCmd::runCommand(SocketClient *cli, 237586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat int argc, char **argv) { 238d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 239d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat 240586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (argc < 2) { 241586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 242586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat return 0; 243586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 244586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 245586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (!strcmp(argv[1], "users")) { 246586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat DIR *dir; 247586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat struct dirent *de; 248586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 249586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (!(dir = opendir("/proc"))) { 250586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open /proc", true); 251586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat return 0; 252586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 253586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 254586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat while ((de = readdir(dir))) { 255586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat int pid = Process::getPid(de->d_name); 256586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 257586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (pid < 0) { 258586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat continue; 259586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 260586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 261586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat char processName[255]; 262586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::getProcessName(pid, processName, sizeof(processName)); 263586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 264586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat if (Process::checkFileDescriptorSymLinks(pid, argv[2]) || 265586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkFileMaps(pid, argv[2]) || 266586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkSymLink(pid, argv[2], "cwd") || 267586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkSymLink(pid, argv[2], "root") || 268586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat Process::checkSymLink(pid, argv[2], "exe")) { 269586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 270586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat char msg[1024]; 271586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat snprintf(msg, sizeof(msg), "%d %s", pid, processName); 272586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::StorageUsersListResult, msg, false); 273586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 274586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 275586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat closedir(dir); 276586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::CommandOkay, "Storage user list complete", false); 277586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } else { 278586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false); 279586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat } 280586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat return 0; 281586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat} 282586536c60b773e3517531ad8a6cb0de6722c67fcSan Mehat 283eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan MehatCommandListener::AsecCmd::AsecCmd() : 284eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VoldCommand("asec") { 285048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat} 286048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 287eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehatint CommandListener::AsecCmd::runCommand(SocketClient *cli, 288eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int argc, char **argv) { 289eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc < 2) { 290eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 291048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat return 0; 292048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat } 293048b0801fcd6fcfbb8fa812284c751181e4821b8San Mehat 294eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat VolumeManager *vm = VolumeManager::Instance(); 295eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat int rc = 0; 296a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 297eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(argv[1], "list")) { 298d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 2993bb6020e461e8872e8df0775cba6eb32e06b93ecSan Mehat DIR *d = opendir(Volume::SEC_ASECDIR); 300a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 301eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!d) { 302eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true); 303eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 304eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 305a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 306eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat struct dirent *dent; 307eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat while ((dent = readdir(d))) { 308eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (dent->d_name[0] == '.') 309eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat continue; 310eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) { 311eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat char id[255]; 312eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat memset(id, 0, sizeof(id)); 313eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat strncpy(id, dent->d_name, strlen(dent->d_name) -5); 314eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::AsecListResult, id, false); 315eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 316eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 317eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat closedir(d); 318eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "create")) { 319d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, 5); 320eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 7) { 321eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 322eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>", false); 323eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 324a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 325a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 326eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512; 3278f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6])); 328eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "finalize")) { 329d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 330eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 3) { 331eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false); 332eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 333eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 3348f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = vm->finalizeAsec(argv[2]); 335eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "destroy")) { 336d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 3374ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc < 3) { 3384ba8948dc16463053e21cda5744f519a555080d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false); 339eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 340eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 3414ba8948dc16463053e21cda5744f519a555080d0San Mehat bool force = false; 3424ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc > 3 && !strcmp(argv[3], "force")) { 3434ba8948dc16463053e21cda5744f519a555080d0San Mehat force = true; 3444ba8948dc16463053e21cda5744f519a555080d0San Mehat } 3458f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = vm->destroyAsec(argv[2], force); 346eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "mount")) { 347d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, 3); 348eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 5) { 349eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 350eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat "Usage: asec mount <namespace-id> <key> <ownerUid>", false); 351eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 352eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 3538f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4])); 354eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "unmount")) { 355d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 3564ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc < 3) { 3574ba8948dc16463053e21cda5744f519a555080d0San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false); 358eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 359eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 3604ba8948dc16463053e21cda5744f519a555080d0San Mehat bool force = false; 3614ba8948dc16463053e21cda5744f519a555080d0San Mehat if (argc > 3 && !strcmp(argv[3], "force")) { 3624ba8948dc16463053e21cda5744f519a555080d0San Mehat force = true; 3634ba8948dc16463053e21cda5744f519a555080d0San Mehat } 3648f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = vm->unmountAsec(argv[2], force); 365eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "rename")) { 366d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 367eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 4) { 368eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 369eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat "Usage: asec rename <old_id> <new_id>", false); 370eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 371eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 3728f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = vm->renameAsec(argv[2], argv[3]); 373eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } else if (!strcmp(argv[1], "path")) { 374d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 375eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat if (argc != 3) { 376eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false); 377eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat return 0; 378eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 379eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat char path[255]; 380a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 38188ac2c06539485942bf414efda2d39647fa1a415San Mehat if (!(rc = vm->getAsecMountPath(argv[2], path, sizeof(path)))) { 382eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::AsecPathResult, path, false); 38388ac2c06539485942bf414efda2d39647fa1a415San Mehat return 0; 384eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat } 385a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } else { 386d9a4e358614a0c5f60cc76c0636ee4bb02004a32San Mehat dumpArgs(argc, argv, -1); 387eba65e9d438a05f1c5dfd0f8d31bc463a5d08eeeSan Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false); 388a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat } 389a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat 3908f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat if (!rc) { 3918f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false); 3928f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat } else { 3938f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat rc = ResponseCode::convertFromErrno(); 3948f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat cli->sendMsg(rc, "asec operation failed", true); 3958f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat } 3968f2875b29780312f4edda3d831cc8a99e1648dd5San Mehat 397a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat return 0; 398a19b250bd273455933ca3502cf2c2e0a803aff77San Mehat} 3992350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4002350c44ff39b4cb2940893964a05f778fc80a436San MehatCommandListener::XwarpCmd::XwarpCmd() : 4012350c44ff39b4cb2940893964a05f778fc80a436San Mehat VoldCommand("xwarp") { 4022350c44ff39b4cb2940893964a05f778fc80a436San Mehat} 4032350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4042350c44ff39b4cb2940893964a05f778fc80a436San Mehatint CommandListener::XwarpCmd::runCommand(SocketClient *cli, 4052350c44ff39b4cb2940893964a05f778fc80a436San Mehat int argc, char **argv) { 4062350c44ff39b4cb2940893964a05f778fc80a436San Mehat if (argc < 2) { 4072350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); 4082350c44ff39b4cb2940893964a05f778fc80a436San Mehat return 0; 4092350c44ff39b4cb2940893964a05f778fc80a436San Mehat } 4102350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4112350c44ff39b4cb2940893964a05f778fc80a436San Mehat if (!strcmp(argv[1], "enable")) { 4122350c44ff39b4cb2940893964a05f778fc80a436San Mehat if (Xwarp::enable()) { 4132350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to enable xwarp", true); 4142350c44ff39b4cb2940893964a05f778fc80a436San Mehat return 0; 4152350c44ff39b4cb2940893964a05f778fc80a436San Mehat } 4162350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4172350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Xwarp mirroring started", false); 4182350c44ff39b4cb2940893964a05f778fc80a436San Mehat } else if (!strcmp(argv[1], "disable")) { 4192350c44ff39b4cb2940893964a05f778fc80a436San Mehat if (Xwarp::disable()) { 4202350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to disable xwarp", true); 4212350c44ff39b4cb2940893964a05f778fc80a436San Mehat return 0; 4222350c44ff39b4cb2940893964a05f778fc80a436San Mehat } 4232350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4242350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Xwarp disabled", false); 4252350c44ff39b4cb2940893964a05f778fc80a436San Mehat } else if (!strcmp(argv[1], "status")) { 4262350c44ff39b4cb2940893964a05f778fc80a436San Mehat char msg[255]; 4272350c44ff39b4cb2940893964a05f778fc80a436San Mehat bool r; 4282350c44ff39b4cb2940893964a05f778fc80a436San Mehat unsigned mirrorPos, maxSize; 4292350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4302350c44ff39b4cb2940893964a05f778fc80a436San Mehat if (Xwarp::status(&r, &mirrorPos, &maxSize)) { 4312350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get xwarp status", true); 4322350c44ff39b4cb2940893964a05f778fc80a436San Mehat return 0; 4332350c44ff39b4cb2940893964a05f778fc80a436San Mehat } 4342350c44ff39b4cb2940893964a05f778fc80a436San Mehat snprintf(msg, sizeof(msg), "%s %u %u", (r ? "ready" : "not-ready"), mirrorPos, maxSize); 4352350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::XwarpStatusResult, msg, false); 4362350c44ff39b4cb2940893964a05f778fc80a436San Mehat } else { 4372350c44ff39b4cb2940893964a05f778fc80a436San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false); 4382350c44ff39b4cb2940893964a05f778fc80a436San Mehat } 4392350c44ff39b4cb2940893964a05f778fc80a436San Mehat 4402350c44ff39b4cb2940893964a05f778fc80a436San Mehat return 0; 4412350c44ff39b4cb2940893964a05f778fc80a436San Mehat} 4422350c44ff39b4cb2940893964a05f778fc80a436San Mehat 443