int BandwidthController::maninpulateNaughtyApps(int numUids, char *appStrUids[], NaughtyAppOp appOp) { char cmd[MAX_CMD_LEN]; int uidNum; const char *failLogTemplate; IptOp op; int appUids[numUids]; std::string naughtyCmd; switch (appOp) { case NaughtyAppOpAdd: op = IptOpInsert; failLogTemplate = "Failed to add app uid %d to penalty box."; break; case NaughtyAppOpRemove: op = IptOpDelete; failLogTemplate = "Failed to delete app uid %d from penalty box."; break; } for (uidNum = 0; uidNum < numUids; uidNum++) { appUids[uidNum] = atol(appStrUids[uidNum]); if (appUids[uidNum] == 0) { LOGE(failLogTemplate, appUids[uidNum]); goto fail_parse; } } for (uidNum = 0; uidNum < numUids; uidNum++) { naughtyCmd = makeIptablesNaughtyCmd(op, appUids[uidNum]); if (runIpxtablesCmd(naughtyCmd.c_str(), IptRejectAdd)) { LOGE(failLogTemplate, appUids[uidNum]); goto fail_with_uidNum; } } return 0; fail_with_uidNum: /* Try to remove the uid that failed in any case*/ naughtyCmd = makeIptablesNaughtyCmd(IptOpDelete, appUids[uidNum]); runIpxtablesCmd(naughtyCmd.c_str(), IptRejectAdd); fail_parse: return -1; }
int BandwidthController::maninpulateNaughtyApps(int numUids, char *appStrUids[], NaughtyAppOp appOp) { char cmd[MAX_CMD_LEN]; int uidNum; const char *failLogTemplate; IptOp op; int appUids[numUids]; std::string naughtyCmd; std::list<int /*uid*/>::iterator it; switch (appOp) { case NaughtyAppOpAdd: op = IptOpInsert; failLogTemplate = "Failed to add app uid %d to penalty box."; break; case NaughtyAppOpRemove: op = IptOpDelete; failLogTemplate = "Failed to delete app uid %d from penalty box."; break; default: ALOGE("Unexpected app Op %d", appOp); return -1; } for (uidNum = 0; uidNum < numUids; uidNum++) { appUids[uidNum] = atol(appStrUids[uidNum]); if (appUids[uidNum] == 0) { ALOGE(failLogTemplate, appUids[uidNum]); goto fail_parse; } } for (uidNum = 0; uidNum < numUids; uidNum++) { int uid = appUids[uidNum]; for (it = naughtyAppUids.begin(); it != naughtyAppUids.end(); it++) { if (*it == uid) break; } bool found = (it != naughtyAppUids.end()); if (appOp == NaughtyAppOpRemove) { if (!found) { ALOGE("No such appUid %d to remove", uid); return -1; } naughtyAppUids.erase(it); } else { if (found) { ALOGE("appUid %d exists already", uid); return -1; } naughtyAppUids.push_front(uid); } naughtyCmd = makeIptablesNaughtyCmd(op, uid); if (runIpxtablesCmd(naughtyCmd.c_str(), IptRejectAdd)) { ALOGE(failLogTemplate, uid); goto fail_with_uidNum; } } return 0; fail_with_uidNum: /* Try to remove the uid that failed in any case*/ naughtyCmd = makeIptablesNaughtyCmd(IptOpDelete, appUids[uidNum]); runIpxtablesCmd(naughtyCmd.c_str(), IptRejectAdd); fail_parse: return -1; }