Call tftp

Call tftp using fork/exec.
The file is downloaded to /tmp/images/
which the inotify daemon will monitor.

Change-Id: Id69fea183503dd95181acb9bcdb57c1e6d7bb070
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
diff --git a/download_manager.cpp b/download_manager.cpp
index c4c2cd3..434ece9 100644
--- a/download_manager.cpp
+++ b/download_manager.cpp
@@ -1,3 +1,9 @@
+#include <iostream>
+#include <string>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <phosphor-logging/log.hpp>
+#include "config.h"
 #include "download_manager.hpp"
 
 namespace phosphor
@@ -7,9 +13,43 @@
 namespace manager
 {
 
+using namespace phosphor::logging;
+
 void Download::downloadViaTFTP(const  std::string fileName,
                                const  std::string serverAddress)
 {
+    if (fileName.empty())
+    {
+        log<level::ERR>("Error FileName is empty");
+        return;
+    }
+
+    if (serverAddress.empty())
+    {
+        log<level::ERR>("Error ServerAddress is empty");
+        return;
+    }
+
+    log<level::INFO>("Downloading via TFTP",
+                     entry("FILENAME=%s", fileName),
+                     entry("SERVERADDRESS=%s", serverAddress));
+
+    pid_t pid = fork();
+
+    if (pid == 0)
+    {
+        // child process
+        execl("/usr/bin/tftp", "tftp", "-g", "-r",  fileName.c_str(),
+              serverAddress.c_str(), "-l", (std::string{IMG_UPLOAD_DIR} + '/' +
+                                            fileName).c_str(), (char*)0);
+        // execl only returns on fail
+        log<level::ERR>("Error occurred during the TFTP call");
+    }
+    else if (pid < 0)
+    {
+        log<level::ERR>("Error occurred during fork");
+    }
+
     return;
 }