fs_mgr: libdm: add support to create and delete device mapper devices.

Test: dmctl create system; dmctl delete system
Test: verify that ueventd creates /dev/block/dm-X and verify the dm
device name from /sys/block/dm-X/dm/name
Bug: 110035986

Change-Id: I2a08e2ea7007c0c13fe64d444f0d6618784edae7
Signed-off-by: Sandeep Patil <sspatil@google.com>
diff --git a/fs_mgr/tools/dmctl.cpp b/fs_mgr/tools/dmctl.cpp
index 27e2a58..c123830 100644
--- a/fs_mgr/tools/dmctl.cpp
+++ b/fs_mgr/tools/dmctl.cpp
@@ -39,50 +39,46 @@
 static int Usage(void) {
     std::cerr << "usage: dmctl <command> [command options]";
     std::cerr << "commands:";
-    std::cerr << "  create <dm-name> <dm-target> [-lo <filename>] <dm-target-args>";
-    std::cerr, "  delete <dm-device>";
+    std::cerr << "  create <dm-name> [dm-target> [-lo <filename>] <dm-target-args>]";
+    std::cerr, "  delete <dm-name>";
     std::cerr, "  list";
     std::cerr, "  help";
     return -EINVAL;
 }
 
 static int DmCreateCmdHandler(int argc, char** argv) {
-    if (argc <= 1) {
-        std::cerr << "DmCreateCmdHandler: Invalid arguments";
-        if (argc > 0) std::cerr << "  args: " << argv[0];
+    if (argc < 1) {
+        std::cerr << "DmCreateCmdHandler: atleast 'name' MUST be provided for target device";
         return -EINVAL;
     }
 
-    // Parse Everything first to make sure we have everything we need.
-    std::string devname = argv[0];
+    std::string name = argv[0];
     DeviceMapper& dm = DeviceMapper::Instance();
-    std::vector<DmTarget> targets;
-    if (!dm.GetAvailableTargets(&targets)) {
-        std::cerr << "Failed to read available device mapper targets";
-        return -errno;
+    if (!dm.CreateDevice(name)) {
+        std::cerr << "DmCreateCmdHandler: Failed to create " << name << " device";
+        return -EIO;
     }
 
-    if (targets.empty()) {
-        std::cerr << "zero device mapper targets available";
-        return -EEXIST;
+    // if we also have target specified
+    if (argc > 1) {
+        // fall through for now. This will eventually create a DmTarget() based on the target name
+        // passing it the table that is specified at the command line
     }
 
-    for (const auto& target : targets) {
-        if (target.name() == argv[1]) {
-            // TODO(b/110035986) : Create the target here, return success for now.
-            return 0;
-        }
-    }
-
-    std::cerr << "Invalid or non-existing target : " << argv[1];
-    return -EINVAL;
+    return 0;
 }
 
 static int DmDeleteCmdHandler(int argc, char** argv) {
-    std::cout << "DmDeleteCmdHandler:" << std::endl;
-    std::cout << "  args:" << std::endl;
-    for (int i = 0; i < argc; i++) {
-        std::cout << "        " << argv[i] << std::endl;
+    if (argc < 1) {
+        std::cerr << "DmCreateCmdHandler: atleast 'name' MUST be provided for target device";
+        return -EINVAL;
+    }
+
+    std::string name = argv[0];
+    DeviceMapper& dm = DeviceMapper::Instance();
+    if (!dm.DeleteDevice(name)) {
+        std::cerr << "DmCreateCmdHandler: Failed to create " << name << " device";
+        return -EIO;
     }
 
     return 0;
@@ -94,7 +90,7 @@
     DeviceMapper& dm = DeviceMapper::Instance();
     std::vector<DmTarget> targets;
     if (!dm.GetAvailableTargets(&targets)) {
-        std::cerr << "Failed to read available device mapper targets";
+        std::cerr << "Failed to read available device mapper targets" << std::endl;
         return -errno;
     }