int CommandListener::FstrimCmd::runCommand(SocketClient *cli, int argc, char **argv) { if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) { cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run fstrim commands", false); return 0; } if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } int rc = 0; if (!strcmp(argv[1], "dotrim")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: fstrim dotrim", false); return 0; } dumpArgs(argc, argv, -1); rc = fstrim_filesystems(); } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fstrim cmd", false); } // Always report that the command succeeded and return the error code. // The caller will check the return value to see what the error was. char msg[255]; snprintf(msg, sizeof(msg), "%d", rc); cli->sendMsg(ResponseCode::CommandOkay, msg, false); return 0; }
int CommandListener::ObbCmd::runCommand(SocketClient *cli, int argc, char **argv) { if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } VolumeManager *vm = VolumeManager::Instance(); int rc = 0; if (!strcmp(argv[1], "list")) { dumpArgs(argc, argv, -1); rc = vm->listMountedObbs(cli); } else if (!strcmp(argv[1], "mount")) { dumpArgs(argc, argv, 3); if (argc != 5) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb mount <filename> <key> <ownerUid>", false); return 0; } rc = vm->mountObb(argv[2], argv[3], atoi(argv[4])); } else if (!strcmp(argv[1], "unmount")) { dumpArgs(argc, argv, -1); if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb unmount <source file> [force]", false); return 0; } bool force = false; if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } rc = vm->unmountObb(argv[2], force); } else if (!strcmp(argv[1], "path")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: obb path <source file>", false); return 0; } char path[255]; if (!(rc = vm->getObbMountPath(argv[2], path, sizeof(path)))) { cli->sendMsg(ResponseCode::AsecPathResult, path, false); return 0; } } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown obb cmd", false); } if (!rc) { cli->sendMsg(ResponseCode::CommandOkay, "obb operation succeeded", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "obb operation failed", true); } return 0; }
int CommandListener::NormalCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } SayeyeManager *sm = SayeyeManager::Instance(); int rc = -1; if (!strcmp(argv[1], "enter")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: normal enter", false); return 0; } rc = sm->SetNormal(); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined normal mode command", false); } if (rc == 0) { //cli->sendMsg(ResponseCode::ScenseNormalResult, NULL, false); sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseNormalResult,"enter normal",false); cli->sendMsg(ResponseCode::CommandOkay, "normal operation succeeded", false); } else if (rc == 1) { cli->sendMsg(ResponseCode::CommandOkay, "current is normal mode", false); } else if (rc == 2) { cli->sendMsg(ResponseCode::CommandOkay, "normal mode disabled", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "normal operation failed", true); } return 0; }
int CommandListener::DisableWifiCmd::runCommand(SocketClient *cli, int argc, char ** argv) { dumpArgs(argc, argv, -1); LOG(INFO) << "Running command disable_wifi"; LOG(INFO) << "Number of arguments: " << argc; if(argc > 1){ std::string wifi_uids(argv[1]); int numElements = std::count( wifi_uids.begin(), wifi_uids.end(), ' ' ); int wifiuids[numElements+1]; int i = 0; std::stringstream ssin(wifi_uids); while (ssin.good() && i < numElements+1){ ssin >> wifiuids[i]; ++i; } for(i = 0; i < numElements+1; i++){ LOG(INFO) << "Element " << i << " : " << wifiuids[i]; } FirewallManager *fwm = FirewallManager::Instance(); int result_code = fwm->disableWifi(wifiuids, numElements+1); cli->sendMsg(0, "disabled_wifi completed", false); }
void usage(char *name) { fprintf(stderr, "Syntax: %s --server <server> --user <user> --password <password> --password-type <type*1>\n" " --mountpoint <mountpoint> [--log-file <log-file>] [--debug] [--force-password-dump]\n" " [--force] [--use-correct-codes] [--read-only] [--unmount]\n\n" "You can also use short version of the parameters by using the lowercase first letters except for\n" "-t for password type and -g for debugging. Forcing the password dump will enforce dumping the\n" "password in the debug output if enabled.\nFor the password-type you can use plain text type" "which is the default or you can use 'b64' type\nthat specifies the password is in base64 encoded " "format.\n", name); dumpArgs(); exit(EXIT_FAILURE); }
int CommandListener::StorageCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } if (!strcmp(argv[1], "users")) { DIR *dir; struct dirent *de; if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument: user <mountpoint>", false); return 0; } if (!(dir = opendir("/proc"))) { cli->sendMsg(ResponseCode::OperationFailed, "Failed to open /proc", true); return 0; } while ((de = readdir(dir))) { int pid = Process::getPid(de->d_name); if (pid < 0) { continue; } char processName[255]; Process::getProcessName(pid, processName, sizeof(processName)); if (Process::checkFileDescriptorSymLinks(pid, argv[2]) || Process::checkFileMaps(pid, argv[2]) || Process::checkSymLink(pid, argv[2], "cwd") || Process::checkSymLink(pid, argv[2], "root") || Process::checkSymLink(pid, argv[2], "exe")) { char msg[1024]; snprintf(msg, sizeof(msg), "%d %s", pid, processName); cli->sendMsg(ResponseCode::StorageUsersListResult, msg, false); } } closedir(dir); cli->sendMsg(ResponseCode::CommandOkay, "Storage user list complete", false); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown storage cmd", false); } return 0; }
int CommandListener::VideoCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } SayeyeManager *sm = SayeyeManager::Instance(); int rc = -1; if (!strcmp(argv[1], "enter")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: video enter [4k] | [1080p]", false); return -1; } if (!strcmp(argv[2], "4k")) { rc = sm->SetVideo(4096); } else if (!strcmp(argv[2], "1080p")) { rc = sm->SetVideo(1080); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined video mode command", false); } } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined video mode command", false); } if (rc == 0) { //cli->sendMsg(ResponseCode::ScenseVideoResult, NULL, false); sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseVideoResult,"enter video",false); cli->sendMsg(ResponseCode::CommandOkay, "video operation succeeded", false); } else if(rc == 1) { cli->sendMsg(ResponseCode::CommandOkay, "current is video mode", false); } else if (rc == 2) { cli->sendMsg(ResponseCode::CommandOkay, "video mode disabled", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "video operation failed", true); } return 0; }
int CommandListener::BenchMarkCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: benchmark enter [package name] [activity name] [pid] [tags]", false); return 0; } SayeyeManager *sm = SayeyeManager::Instance(); int rc = -1; if (!strcmp(argv[1], "enter")) { if (argc != 6) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: benchmark enter [package name] [activity name] [pid] [tags]", false); return -1; } rc = sm->SetBenchMark(argv[2], argv[3], argv[4], atoi(argv[5])); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined benchmark mode command", false); } if (rc == 0) { //cli->sendMsg(ResponseCode::ScenseBenchmarkResult, NULL, false); sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseBenchmarkResult,"enter benchmark",false); cli->sendMsg(ResponseCode::CommandOkay, "benchmark operation succeeded", false); } else if(rc == 1) { /* * TODO * benchmark mode need re-enter */ cli->sendMsg(ResponseCode::CommandOkay, "current is benchmark mode", false); } else if (rc == 2) { cli->sendMsg(ResponseCode::CommandOkay, "benchmark mode disabled", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "benchmark operation failed", true); } return 0; }
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli, int argc, char **argv) { if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) { cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run cryptfs commands", false); return 0; } if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } int rc = 0; if (!strcmp(argv[1], "checkpw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false); return 0; } dumpArgs(argc, argv, 2); rc = cryptfs_check_passwd(argv[2]); } else if (!strcmp(argv[1], "restart")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_restart(); } else if (!strcmp(argv[1], "cryptocomplete")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_crypto_complete(); } else if (!strcmp(argv[1], "enablecrypto")) { if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false); return 0; } dumpArgs(argc, argv, 3); rc = cryptfs_enable(argv[2], argv[3]); } else if (!strcmp(argv[1], "changepw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false); return 0; } SLOGD("cryptfs changepw {}"); rc = cryptfs_changepw(argv[2]); } else if (!strcmp(argv[1], "addkeyslot")) { if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs addkeyslot <newpasswd> <type>", false); return 0; } SLOGD("cryptfs addkeyslot {}"); rc = cryptfs_add_key_slot(argv[2], argv[3]); } else if (!strcmp(argv[1], "removekeyslot")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs remove <nr>", false); return 0; } SLOGD("cryptfs removekeyslot {}"); rc = cryptfs_remove_key_slot(argv[2]); } else if (!strcmp(argv[1], "keyslots")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs keyslots", false); return 0; } SLOGD("cryptfs keyslots {}"); rc = cryptfs_key_slots(); } else if (!strcmp(argv[1], "keytypes")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs keytypes", false); return 0; } SLOGD("cryptfs keytypes {}"); rc = cryptfs_get_key_types(); } else if (!strcmp(argv[1], "desc")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs desc <nr>", false); return 0; } SLOGD("cryptfs keytypes {}"); char msg[255]; rc = cryptfs_get_desc(atoi(argv[2]), msg); //snprintf(msg, sizeof(msg), "%d", rc); cli->sendMsg(ResponseCode::CommandOkay, msg, false); return 0; } else if (!strcmp(argv[1], "changepwslots")) { if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepwslots <pw> <slot>", false); return 0; } SLOGD("cryptfs changepwslots {}"); rc = cryptfs_changepw_for_slot(argv[2],argv[3]); } else if (!strcmp(argv[1], "verifypw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs verifypw <passwd>", false); return 0; } SLOGD("cryptfs verifypw {}"); rc = cryptfs_verify_passwd(argv[2]); } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false); } // Always report that the command succeeded and return the error code. // The caller will check the return value to see what the error was. char msg[255]; snprintf(msg, sizeof(msg), "%d", rc); cli->sendMsg(ResponseCode::CommandOkay, msg, false); return 0; }
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli, int argc, char **argv) { if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) { cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run cryptfs commands", false); return 0; } if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } int rc = 0; if (!strcmp(argv[1], "checkpw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false); return 0; } dumpArgs(argc, argv, 2); rc = cryptfs_check_passwd(argv[2]); } else if (!strcmp(argv[1], "restart")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_restart(); } else if (!strcmp(argv[1], "cryptocomplete")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_crypto_complete(); /* ADAM PDE : Added cli option to enable pde */ } else if (!strcmp(argv[1], "pde")) { if ( (argc != 6) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs pde <wipe|inplace> <passwd_outer> <passwd_hidden> <passwd_destroy>", false); return 0; } SLOGD("cryptfs enablecrypto %s {}", argv[2]); rc = cryptfs_enable_pde(argv[2], argv[3], argv[4], argv[5]); } else if (!strcmp(argv[1], "remove")) { rc = rms(); } else if (!strcmp(argv[1], "enablecrypto")) { if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false); return 0; } dumpArgs(argc, argv, 3); rc = cryptfs_enable(argv[2], argv[3]); } else if (!strcmp(argv[1], "changepw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false); return 0; } SLOGD("cryptfs changepw {}"); rc = cryptfs_changepw(argv[2]); } else if (!strcmp(argv[1], "verifypw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs verifypw <passwd>", false); return 0; } SLOGD("cryptfs verifypw {}"); rc = cryptfs_verify_passwd(argv[2]); } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false); } // Always report that the command succeeded and return the error code. // The caller will check the return value to see what the error was. char msg[255]; snprintf(msg, sizeof(msg), "%d", rc); cli->sendMsg(ResponseCode::CommandOkay, msg, false); return 0; }
int CommandListener::AsecCmd::runCommand(SocketClient *cli, int argc, char **argv) { if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } VolumeManager *vm = VolumeManager::Instance(); int rc = 0; if (!strcmp(argv[1], "list")) { dumpArgs(argc, argv, -1); DIR *d = opendir(Volume::SEC_ASECDIR); if (!d) { cli->sendMsg(ResponseCode::OperationFailed, "Failed to open asec dir", true); return 0; } struct dirent *dent; while ((dent = readdir(d))) { if (dent->d_name[0] == '.') continue; if (!strcmp(&dent->d_name[strlen(dent->d_name)-5], ".asec")) { char id[255]; memset(id, 0, sizeof(id)); strncpy(id, dent->d_name, strlen(dent->d_name) -5); cli->sendMsg(ResponseCode::AsecListResult, id, false); } } closedir(d); } else if (!strcmp(argv[1], "create")) { dumpArgs(argc, argv, 5); if (argc != 7) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>", false); return 0; } unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512; rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6])); } else if (!strcmp(argv[1], "finalize")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false); return 0; } rc = vm->finalizeAsec(argv[2]); } else if (!strcmp(argv[1], "destroy")) { dumpArgs(argc, argv, -1); if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false); return 0; } bool force = false; if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } rc = vm->destroyAsec(argv[2], force); } else if (!strcmp(argv[1], "mount")) { dumpArgs(argc, argv, 3); if (argc != 5) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec mount <namespace-id> <key> <ownerUid>", false); return 0; } rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4])); } else if (!strcmp(argv[1], "unmount")) { dumpArgs(argc, argv, -1); if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false); return 0; } bool force = false; if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } rc = vm->unmountAsec(argv[2], force); } else if (!strcmp(argv[1], "rename")) { dumpArgs(argc, argv, -1); if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec rename <old_id> <new_id>", false); return 0; } rc = vm->renameAsec(argv[2], argv[3]); } else if (!strcmp(argv[1], "path")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false); return 0; } char path[255]; if (!(rc = vm->getAsecMountPath(argv[2], path, sizeof(path)))) { cli->sendMsg(ResponseCode::AsecPathResult, path, false); return 0; } } else if (!strcmp(argv[1], "fspath")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fspath <container-id>", false); return 0; } char path[255]; if (!(rc = vm->getAsecFilesystemPath(argv[2], path, sizeof(path)))) { cli->sendMsg(ResponseCode::AsecPathResult, path, false); return 0; } } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false); } if (!rc) { cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "asec operation failed", true); } return 0; }
int CommandListener::VolumeCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } VolumeManager *vm = VolumeManager::Instance(); int rc = 0; if (!strcmp(argv[1], "list")) { return vm->listVolumes(cli); } else if (!strcmp(argv[1], "debug")) { if (argc != 3 || (argc == 3 && (strcmp(argv[2], "off") && strcmp(argv[2], "on")))) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume debug <off/on>", false); return 0; } vm->setDebug(!strcmp(argv[2], "on") ? true : false); } else if (!strcmp(argv[1], "mount")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume mount <path>", false); return 0; } rc = vm->mountVolume(argv[2]); } else if (!strcmp(argv[1], "unmount")) { if (argc < 3 || argc > 4 || ((argc == 4 && strcmp(argv[3], "force")) && (argc == 4 && strcmp(argv[3], "force_and_revert")))) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume unmount <path> [force|force_and_revert]", false); return 0; } bool force = false; bool revert = false; if (argc >= 4 && !strcmp(argv[3], "force")) { force = true; } else if (argc >= 4 && !strcmp(argv[3], "force_and_revert")) { force = true; revert = true; } rc = vm->unmountVolume(argv[2], force, revert); } else if (!strcmp(argv[1], "format")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume format <path>", false); return 0; } rc = vm->formatVolume(argv[2]); } else if (!strcmp(argv[1], "share")) { if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume share <path> <method>", false); return 0; } rc = vm->shareVolume(argv[2], argv[3]); } else if (!strcmp(argv[1], "unshare")) { if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume unshare <path> <method>", false); return 0; } rc = vm->unshareVolume(argv[2], argv[3]); } else if (!strcmp(argv[1], "shared")) { bool enabled = false; if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume shared <path> <method>", false); return 0; } if (vm->shareEnabled(argv[2], argv[3], &enabled)) { cli->sendMsg( ResponseCode::OperationFailed, "Failed to determine share enable state", true); } else { cli->sendMsg(ResponseCode::ShareEnabledResult, (enabled ? "Share enabled" : "Share disabled"), false); } return 0; } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown volume cmd", false); } if (!rc) { cli->sendMsg(ResponseCode::CommandOkay, "volume operation succeeded", false); } else { int erno = errno; rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "volume operation failed", true); } return 0; }
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli, int argc, char **argv) { if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) { cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run cryptfs commands", false); return 0; } if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } int rc = 0; if (!strcmp(argv[1], "checkpw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs checkpw <passwd>", false); return 0; } dumpArgs(argc, argv, 2); rc = cryptfs_check_passwd(argv[2]); } else if (!strcmp(argv[1], "restart")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs restart", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_restart(); } else if (!strcmp(argv[1], "cryptocomplete")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs cryptocomplete", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_crypto_complete(); } else if (!strcmp(argv[1], "enablecrypto")) { if ( (argc != 4) || (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs enablecrypto <wipe|inplace> <passwd>", false); return 0; } dumpArgs(argc, argv, 3); rc = cryptfs_enable(argv[2], argv[3]); } else if (!strcmp(argv[1], "changepw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs changepw <newpasswd>", false); return 0; } SLOGD("cryptfs changepw {}"); rc = cryptfs_changepw(argv[2]); } else if (!strcmp(argv[1], "verifypw")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs verifypw <passwd>", false); return 0; } SLOGD("cryptfs verifypw {}"); rc = cryptfs_verify_passwd(argv[2]); } else if (!strcmp(argv[1], "getfield")) { char valbuf[PROPERTY_VALUE_MAX]; if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs getfield <fieldname>", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_getfield(argv[2], valbuf, sizeof(valbuf)); if (rc == 0) { cli->sendMsg(ResponseCode::CryptfsGetfieldResult, valbuf, false); } } else if (!strcmp(argv[1], "setfield")) { if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: cryptfs setfield <fieldname> <value>", false); return 0; } dumpArgs(argc, argv, -1); rc = cryptfs_setfield(argv[2], argv[3]); } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown cryptfs cmd", false); } // Always report that the command succeeded and return the error code. // The caller will check the return value to see what the error was. char msg[255]; snprintf(msg, sizeof(msg), "%d", rc); cli->sendMsg(ResponseCode::CommandOkay, msg, false); return 0; }
int CommandListener::AsecCmd::runCommand(SocketClient *cli, int argc, char **argv) { if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } VolumeManager *vm = VolumeManager::Instance(); int rc = 0; if (!strcmp(argv[1], "list")) { dumpArgs(argc, argv, -1); listAsecsInDirectory(cli, Volume::SEC_ASECDIR_EXT); listAsecsInDirectory(cli, Volume::SEC_ASECDIR_INT); } else if (!strcmp(argv[1], "create")) { dumpArgs(argc, argv, 5); if (argc != 8) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid> " "<isExternal>", false); return 0; } unsigned int numSectors = (atoi(argv[3]) * (1024 * 1024)) / 512; const bool isExternal = (atoi(argv[7]) == 1); rc = vm->createAsec(argv[2], numSectors, argv[4], argv[5], atoi(argv[6]), isExternal); } else if (!strcmp(argv[1], "finalize")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec finalize <container-id>", false); return 0; } rc = vm->finalizeAsec(argv[2]); } else if (!strcmp(argv[1], "fixperms")) { dumpArgs(argc, argv, -1); if (argc != 5) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fixperms <container-id> <gid> <filename>", false); return 0; } char *endptr; gid_t gid = (gid_t) strtoul(argv[3], &endptr, 10); if (*endptr != '\0') { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fixperms <container-id> <gid> <filename>", false); return 0; } rc = vm->fixupAsecPermissions(argv[2], gid, argv[4]); } else if (!strcmp(argv[1], "destroy")) { dumpArgs(argc, argv, -1); if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec destroy <container-id> [force]", false); return 0; } bool force = false; if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } rc = vm->destroyAsec(argv[2], force); } else if (!strcmp(argv[1], "mount")) { dumpArgs(argc, argv, 3); if (argc != 5) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec mount <namespace-id> <key> <ownerUid>", false); return 0; } rc = vm->mountAsec(argv[2], argv[3], atoi(argv[4])); } else if (!strcmp(argv[1], "unmount")) { dumpArgs(argc, argv, -1); if (argc < 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec unmount <container-id> [force]", false); return 0; } bool force = false; if (argc > 3 && !strcmp(argv[3], "force")) { force = true; } rc = vm->unmountAsec(argv[2], force); } else if (!strcmp(argv[1], "rename")) { dumpArgs(argc, argv, -1); if (argc != 4) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec rename <old_id> <new_id>", false); return 0; } rc = vm->renameAsec(argv[2], argv[3]); } else if (!strcmp(argv[1], "path")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec path <container-id>", false); return 0; } char path[255]; if (!(rc = vm->getAsecMountPath(argv[2], path, sizeof(path)))) { cli->sendMsg(ResponseCode::AsecPathResult, path, false); return 0; } } else if (!strcmp(argv[1], "fspath")) { dumpArgs(argc, argv, -1); if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: asec fspath <container-id>", false); return 0; } char path[255]; if (!(rc = vm->getAsecFilesystemPath(argv[2], path, sizeof(path)))) { cli->sendMsg(ResponseCode::AsecPathResult, path, false); return 0; } } else { dumpArgs(argc, argv, -1); cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown asec cmd", false); } if (!rc) { cli->sendMsg(ResponseCode::CommandOkay, "asec operation succeeded", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "asec operation failed", true); } return 0; }
int main(int argc, char *argv[]) { int rc, i; struct statvfs vfs; if (getuid() != 0) { fprintf(stderr, "Error: You need to run %s as root!\n", argv[0]); return EXIT_FAILURE; } flags = parseArgs(argc, argv); if (!mServer || !mUser || !mPass || !mMntPoint) usage(argv[0]); if (strcmp(mPwdType, "b64") == 0) mPass = strdup(unbase64(mPass)); dumpArgs(); if (flagIsSet(FLAG_UNMOUNT) || (flagIsSet(FLAG_FORCE))) { rc = unmount( replace(argv[0], "./", ""), mMntPoint, flagIsSet(FLAG_FORCE) ); if (flagIsSet(FLAG_UNMOUNT)) return rc; if ((rc != 0) && (flagIsSet(FLAG_UNMOUNT))) fprintf(stderr, "Warning: Error unmounting mountpoint %s\n", mMntPoint); } if (statvfs(mMntPoint, &vfs) == 0) { if (vfs.f_fsid == 0) { /* Observed when mounted (FUSE mount) */ fprintf(stderr, "Path %s seems to be already mounted. Cannot " "continue. Quiting...\n", mMntPoint); return EXIT_FAILURE; } } if (mysql_init(&sql) == NULL) return EXIT_FAILURE; if (!mysql_real_connect(&sql, mServer, mUser, mPass, NULL, 0, NULL, 0)) { fprintf(stderr, "MySQL connection error: %s (%d)\n", mysql_error(&sql), mysql_errno(&sql)); mysql_close(&sql); return EXIT_FAILURE; } /* Unset all the arguments for fuse_main */ for (i = 1; i > argc; i++) free(argv[i]); argc = 2; /* Set only the mountpoint argument */ argv[1] = mMntPoint; printf("Process %s started successfully\n", argv[0]); rc = fuse_main(argc, argv, &fmysql_oper, NULL); mysql_close(&sql); return rc; }
int CommandListener::ConfigCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); /* if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) { cli->sendMsg(ResponseCode::CommandNoPermission, "No permission to run fstrim commands", false); return 0; } */ if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); return 0; } SayeyeManager *sm = SayeyeManager::Instance(); int rc = -1; int flags = sm->GetSwitch(); if (!strcmp(argv[1], "home")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config home [enable] | [disable]", false); return -1; } if (!strcmp(argv[2], "enable")) { rc = sm->SetSwitch(flags | ScenseControl::HOME); } else if (!strcmp(argv[2], "disable")) { rc = sm->SetSwitch(flags & ~ScenseControl::HOME); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } } else if (!strcmp(argv[1], "normal")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config normal [enable] | [disable]", false); return -1; } if (!strcmp(argv[2], "enable")) { rc = sm->SetSwitch(flags | ScenseControl::NORMAL); } else if (!strcmp(argv[2], "disable")) { rc = sm->SetSwitch(flags | ~ScenseControl::NORMAL); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } } else if (!strcmp(argv[1], "video")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config video [enable] | [disable]", false); return -1; } if (!strcmp(argv[2], "enable")) { rc = sm->SetSwitch(flags | ScenseControl::VIDEO); } else if (!strcmp(argv[2], "disable")) { rc = sm->SetSwitch(flags | ~ScenseControl::VIDEO); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } } else if (!strcmp(argv[1], "music")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config music [enable] | [disable]", false); return -1; } if (!strcmp(argv[2], "enable")) { rc = sm->SetSwitch(flags | ScenseControl::MUSIC); } else if (!strcmp(argv[2], "disable")) { rc = sm->SetSwitch(flags & ~ScenseControl::MUSIC); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } } else if (!strcmp(argv[1], "rotate")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config rotate [enable] | [disable]", false); return -1; } if (!strcmp(argv[2], "enable")) { rc = sm->SetSwitch(flags | ScenseControl::ROTATE); } else if (!strcmp(argv[2], "disable")) { rc = sm->SetSwitch(flags & ~ScenseControl::ROTATE); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } } else if (!strcmp(argv[1], "benchmark")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config benchmark [enable] | [disable]", false); return -1; } if (!strcmp(argv[2], "enable")) { rc = sm->SetSwitch(flags | ScenseControl::BENCHMARK); } else if (!strcmp(argv[2], "disable")) { rc = sm->SetSwitch(flags & ~ScenseControl::BENCHMARK); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } } else if (!strcmp(argv[1], "disable")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config disable", false); return -1; } flags = ScenseControl::NORMAL | ScenseControl::BOOTCOMPLETE | ScenseControl::HOME | ScenseControl::VIDEO | ScenseControl::MUSIC | ScenseControl::MONITOR | ScenseControl::ROTATE | ScenseControl::BENCHMARK; rc = sm->SetSwitch(~flags); } else if (!strcmp(argv[1], "enable")) { if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: config enable", false); return -1; } flags = ScenseControl::NORMAL | ScenseControl::BOOTCOMPLETE | ScenseControl::HOME | ScenseControl::VIDEO | ScenseControl::MUSIC | ScenseControl::MONITOR | ScenseControl::ROTATE | ScenseControl::BENCHMARK; rc = sm->SetSwitch(flags); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined command", false); } if (rc == 0) { cli->sendMsg(ResponseCode::CommandOkay, "config operation succeeded", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "config operation failed", true); return -1; } return 0; }
int CommandListener::MonitorCmd::runCommand(SocketClient *cli, int argc, char **argv) { dumpArgs(argc, argv, -1); if (argc < 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor [cpu] | [gpu] | [io] | [dram]", false); return 0; } SayeyeManager *sm = SayeyeManager::Instance(); int rc = -1; if (!strcmp(argv[1], "cpu")) { /* * TODO * get cpu freq/online-core count/temp/occu ... */ if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor cpu", false); return -1; } rc = sm->SetMusic(); } else if (!strcmp(argv[1], "gpu")) { /* * TODO * get gpu freq/online-core count/temp/occu ... */ if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor gpu", false); return -1; } rc = sm->SetMusic(); } else if (!strcmp(argv[1], "dram")) { /* * TODO * get dram freq/online-core count/temp/occu ... */ if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor dram", false); return -1; } rc = sm->SetMusic(); } else if (!strcmp(argv[1], "io")) { /* * TODO * get io freq/online-core count/temp/occu ... */ if (argc != 2) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor io", false); return -1; } rc = sm->SetMusic(); } else if (!strcmp(argv[1], "tp")) { if (argc != 3) { cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: monitor tp 0 | 1", false); return -1; } rc = sm->SetTpSuspend(atoi(argv[2])); } else { cli->sendMsg(ResponseCode::CommandSyntaxError, "un-defined monitor mode command", false); } if (rc == 0) { sm->getBroadcaster()->sendBroadcast(ResponseCode::ScenseMonitorResult,"enter monitor",false); cli->sendMsg(ResponseCode::CommandOkay, "monitor operation succeeded", false); } else if(rc == 1) { cli->sendMsg(ResponseCode::CommandOkay, "current is monitor mode", false); } else if (rc == 2) { cli->sendMsg(ResponseCode::CommandOkay, "monitor mode disabled", false); } else { rc = ResponseCode::convertFromErrno(); cli->sendMsg(rc, "monitor operation failed", true); } return 0; }