vold: Add command to unmount secure containers

Signed-off-by: San Mehat <san@google.com>
diff --git a/CommandListener.cpp b/CommandListener.cpp
index 0207245..f15d44a 100644
--- a/CommandListener.cpp
+++ b/CommandListener.cpp
@@ -45,6 +45,7 @@
     registerCmd(new FinalizeAsecCmd());
     registerCmd(new DestroyAsecCmd());
     registerCmd(new MountAsecCmd());
+    registerCmd(new UnmountAsecCmd());
     registerCmd(new ListAsecCmd());
     registerCmd(new AsecPathCmd());
 }
@@ -254,6 +255,26 @@
     return 0;
 }
 
+CommandListener::UnmountAsecCmd::UnmountAsecCmd() :
+                 VoldCommand("unmount_asec") {
+}
+
+int CommandListener::UnmountAsecCmd::runCommand(SocketClient *cli,
+                                            int argc, char **argv) {
+    if (argc != 2) {
+        cli->sendMsg(ResponseCode::CommandSyntaxError,
+                     "Usage: unmount_asec <namespace-id>", false);
+        return 0;
+    }
+
+    if (VolumeManager::Instance()->unmountAsec(argv[1])) {
+        cli->sendMsg(ResponseCode::OperationFailed, "Unmount failed", true);
+    } else {
+        cli->sendMsg(ResponseCode::CommandOkay, "Unmount succeeded", false);
+    }
+    return 0;
+}
+
 CommandListener::ListAsecCmd::ListAsecCmd() :
                  VoldCommand("list_asec") {
 
diff --git a/CommandListener.h b/CommandListener.h
index cc078da..64ff31f 100644
--- a/CommandListener.h
+++ b/CommandListener.h
@@ -111,6 +111,13 @@
         int runCommand(SocketClient *c, int argc, char ** argv);
     };
 
+    class UnmountAsecCmd : public VoldCommand {
+    public:
+        UnmountAsecCmd();
+        virtual ~UnmountAsecCmd() {}
+        int runCommand(SocketClient *c, int argc, char ** argv);
+    };
+
     class ListAsecCmd : public VoldCommand {
     public:
         ListAsecCmd();