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;
}