blob: f5ff54b3c8fab641f64e3eba235a0cfa3358983b [file] [log] [blame]
Gunnar Millsa927de42017-04-06 21:40:50 -05001#include <iostream>
2#include <string>
3#include <unistd.h>
4#include <sys/wait.h>
5#include <phosphor-logging/log.hpp>
6#include "config.h"
Gunnar Millsa733df52017-04-11 13:05:52 -05007#include <phosphor-logging/elog.hpp>
8#include <phosphor-logging/elog-errors.hpp>
9#include "xyz/openbmc_project/Common/error.hpp"
Gunnar Mills701e0212017-04-03 11:21:27 -050010#include "download_manager.hpp"
11
12namespace phosphor
13{
14namespace software
15{
16namespace manager
17{
18
Gunnar Millsa733df52017-04-11 13:05:52 -050019using namespace sdbusplus::xyz::openbmc_project::Common::Error;
Gunnar Millsa927de42017-04-06 21:40:50 -050020using namespace phosphor::logging;
21
Gunnar Mills701e0212017-04-03 11:21:27 -050022void Download::downloadViaTFTP(const std::string fileName,
23 const std::string serverAddress)
24{
Gunnar Millsa927de42017-04-06 21:40:50 -050025 if (fileName.empty())
26 {
27 log<level::ERR>("Error FileName is empty");
Gunnar Millsa733df52017-04-11 13:05:52 -050028 elog<InvalidArgument>(xyz::openbmc_project::Common::InvalidArgument::
29 ARGUMENT_NAME("FileName"),
30 xyz::openbmc_project::Common::InvalidArgument::
31 ARGUMENT_VALUE(fileName.c_str()));
Gunnar Millsa927de42017-04-06 21:40:50 -050032 return;
33 }
34
35 if (serverAddress.empty())
36 {
37 log<level::ERR>("Error ServerAddress is empty");
Gunnar Millsa733df52017-04-11 13:05:52 -050038 elog<InvalidArgument>(xyz::openbmc_project::Common::InvalidArgument::
39 ARGUMENT_NAME("ServerAddress"),
40 xyz::openbmc_project::Common::InvalidArgument::
41 ARGUMENT_VALUE(serverAddress.c_str()));
Gunnar Millsa927de42017-04-06 21:40:50 -050042 return;
43 }
44
45 log<level::INFO>("Downloading via TFTP",
46 entry("FILENAME=%s", fileName),
47 entry("SERVERADDRESS=%s", serverAddress));
48
49 pid_t pid = fork();
50
51 if (pid == 0)
52 {
53 // child process
54 execl("/usr/bin/tftp", "tftp", "-g", "-r", fileName.c_str(),
55 serverAddress.c_str(), "-l", (std::string{IMG_UPLOAD_DIR} + '/' +
56 fileName).c_str(), (char*)0);
57 // execl only returns on fail
58 log<level::ERR>("Error occurred during the TFTP call");
Gunnar Millsa733df52017-04-11 13:05:52 -050059 elog<InternalFailure>();
Gunnar Millsa927de42017-04-06 21:40:50 -050060 }
61 else if (pid < 0)
62 {
63 log<level::ERR>("Error occurred during fork");
Gunnar Millsa733df52017-04-11 13:05:52 -050064 elog<InternalFailure>();
Gunnar Millsa927de42017-04-06 21:40:50 -050065 }
66
Gunnar Mills701e0212017-04-03 11:21:27 -050067 return;
68}
69
70} // namespace manager
71} // namespace software
72} // namespace phosphor
73