NatController: refactor some code wrt sequences of commands

This will help when adding/removing commands.

Change-Id: I154fb3d7064acddc3e067d60f225ecab6ea57ddb
diff --git a/NatController.cpp b/NatController.cpp
index ff35d89..46ac01c 100644
--- a/NatController.cpp
+++ b/NatController.cpp
@@ -45,6 +45,12 @@
 NatController::~NatController() {
 }
 
+struct CommandsAndArgs {
+    /* The array size doesn't really matter as the compiler will barf if too many initializers are specified. */
+    const char *cmd[32];
+    bool checkRes;
+};
+
 int NatController::runCmd(int argc, const char **argv) {
     int res;
 
@@ -59,100 +65,23 @@
 }
 
 int NatController::setDefaults() {
-    const char *cmd1[] = {
-            IPTABLES_PATH,
-            "-F",
-            "natctrl_FORWARD"
+    struct CommandsAndArgs defaultCommands[] = {
+        {{IPTABLES_PATH, "-F", "natctrl_FORWARD",}, 1},
+        {{IPTABLES_PATH, "-t", "nat", "-F", "natctrl_nat_POSTROUTING"}, 1},
+        {{IP_PATH, "rule", "flush"}, 0},
+        {{IP_PATH, "-6", "rule", "flush"}, 0},
+        {{IP_PATH, "rule", "add", "from", "all", "lookup", "default", "prio", "32767"}, 0},
+        {{IP_PATH, "rule", "add", "from", "all", "lookup", "main", "prio", "32766"}, 0},
+        {{IP_PATH, "-6", "rule", "add", "from", "all", "lookup", "default", "prio", "32767"}, 0},
+        {{IP_PATH, "-6", "rule", "add", "from", "all", "lookup", "main", "prio", "32766"}, 0},
+        {{IP_PATH, "route", "flush", "cache"}, 0},
     };
-    if (runCmd(ARRAY_SIZE(cmd1), cmd1))
-        return -1;
-
-    const char *cmd2[] = {
-            IPTABLES_PATH,
-            "-t",
-            "nat",
-            "-F",
-            "natctrl_nat_POSTROUTING"
-    };
-    if (runCmd(ARRAY_SIZE(cmd2), cmd2))
-        return -1;
-
-    const char *cmd3[] = {
-            IP_PATH,
-            "rule",
-            "flush"
-    };
-    runCmd(ARRAY_SIZE(cmd3), cmd3);
-
-    const char *cmd4[] = {
-            IP_PATH,
-            "-6",
-            "rule",
-            "flush"
-    };
-    runCmd(ARRAY_SIZE(cmd4), cmd4);
-
-    const char *cmd5[] = {
-            IP_PATH,
-            "rule",
-            "add",
-            "from",
-            "all",
-            "lookup",
-            "default",
-            "prio",
-            "32767"
-    };
-    runCmd(ARRAY_SIZE(cmd5), cmd5);
-
-    const char *cmd6[] = {
-            IP_PATH,
-            "rule",
-            "add",
-            "from",
-            "all",
-            "lookup",
-            "main",
-            "prio",
-            "32766"
-    };
-    runCmd(ARRAY_SIZE(cmd6), cmd6);
-
-    const char *cmd7[] = {
-            IP_PATH,
-            "-6",
-            "rule",
-            "add",
-            "from",
-            "all",
-            "lookup",
-            "default",
-            "prio",
-            "32767"
-    };
-    runCmd(ARRAY_SIZE(cmd7), cmd7);
-
-    const char *cmd8[] = {
-            IP_PATH,
-            "-6",
-            "rule",
-            "add",
-            "from",
-            "all",
-            "lookup",
-            "main",
-            "prio",
-            "32766"
-    };
-    runCmd(ARRAY_SIZE(cmd8), cmd8);
-
-    const char *cmd9[] = {
-            IP_PATH,
-            "route",
-            "flush",
-            "cache"
-    };
-    runCmd(ARRAY_SIZE(cmd9), cmd9);
+    for (unsigned int cmdNum = 0; cmdNum < ARRAY_SIZE(defaultCommands); cmdNum++) {
+        if (runCmd(ARRAY_SIZE(defaultCommands[cmdNum].cmd), defaultCommands[cmdNum].cmd) &&
+            defaultCommands[cmdNum].checkRes) {
+                return -1;
+        }
+    }
 
     natCount = 0;
 
@@ -164,6 +93,31 @@
     return true;
 }
 
+int NatController::routesOp(bool add, const char *intIface, const char *extIface, char **argv, int addrCount) {
+    int tableNumber = secondaryTableCtrl->findTableNumber(extIface);
+    int ret = 0;
+
+    if (tableNumber != -1) {
+        for (int i = 0; i < addrCount; i++) {
+            if (add) {
+                ret |= secondaryTableCtrl->modifyFromRule(tableNumber, ADD, argv[5+i]);
+                ret |= secondaryTableCtrl->modifyLocalRoute(tableNumber, ADD, intIface, argv[5+i]);
+            } else {
+                ret |= secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
+                ret |= secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
+            }
+        }
+        const char *cmd[] = {
+                IP_PATH,
+                "route",
+                "flush",
+                "cache"
+        };
+        runCmd(ARRAY_SIZE(cmd), cmd);
+    }
+    return ret;
+}
+
 //  0    1       2       3       4            5
 // nat enable intface extface addrcnt nated-ipaddr/prelength
 int NatController::enableNat(const int argc, char **argv) {
@@ -185,39 +139,10 @@
         errno = EINVAL;
         return -1;
     }
-
-    tableNumber = secondaryTableCtrl->findTableNumber(extIface);
-    if (tableNumber != -1) {
-        for(i = 0; i < addrCount; i++) {
-            ret |= secondaryTableCtrl->modifyFromRule(tableNumber, ADD, argv[5+i]);
-
-            ret |= secondaryTableCtrl->modifyLocalRoute(tableNumber, ADD, intIface, argv[5+i]);
-        }
-        const char *cmd[] = {
-                IP_PATH,
-                "route",
-                "flush",
-                "cache"
-        };
-        runCmd(ARRAY_SIZE(cmd), cmd);
-    }
-
+    ret = routesOp(true, intIface, extIface, argv, addrCount);
     if (ret != 0 || setForwardRules(true, intIface, extIface) != 0) {
-        if (tableNumber != -1) {
-            for (i = 0; i < addrCount; i++) {
-                secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
-
-                secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
-            }
-            const char *cmd[] = {
-                    IP_PATH,
-                    "route",
-                    "flush",
-                    "cache"
-            };
-            runCmd(ARRAY_SIZE(cmd), cmd);
-        }
         ALOGE("Error setting forward rules");
+        routesOp(false, intIface, extIface, argv, addrCount);
         errno = ENODEV;
         return -1;
     }
@@ -258,11 +183,7 @@
         if (runCmd(ARRAY_SIZE(cmd), cmd)) {
             ALOGE("Error seting postroute rule: iface=%s", extIface);
             // unwind what's been done, but don't care about success - what more could we do?
-            for (i = 0; i < addrCount; i++) {
-                secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
-
-                secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
-            }
+            routesOp(false, intIface, extIface, argv, addrCount);
             setDefaults();
             return -1;
         }
@@ -367,24 +288,7 @@
     }
 
     setForwardRules(false, intIface, extIface);
-
-    tableNumber = secondaryTableCtrl->findTableNumber(extIface);
-    if (tableNumber != -1) {
-        for (i = 0; i < addrCount; i++) {
-            secondaryTableCtrl->modifyLocalRoute(tableNumber, DEL, intIface, argv[5+i]);
-
-            secondaryTableCtrl->modifyFromRule(tableNumber, DEL, argv[5+i]);
-        }
-
-        const char *cmd[] = {
-                IP_PATH,
-                "route",
-                "flush",
-                "cache"
-        };
-        runCmd(ARRAY_SIZE(cmd), cmd);
-    }
-
+    routesOp(false, intIface, extIface, argv, addrCount);
     if (--natCount <= 0) {
         // handle decrement to 0 case (do reset to defaults) and erroneous dec below 0
         setDefaults();