#include #include #include #include #include #include #include #include "config.h" #include #include #include "xyz/openbmc_project/Common/error.hpp" #include "download_manager.hpp" namespace phosphor { namespace software { namespace manager { using namespace sdbusplus::xyz::openbmc_project::Common::Error; using namespace phosphor::logging; namespace fs = std::experimental::filesystem; void Download::downloadViaTFTP(std::string fileName, std::string serverAddress) { // Sanitize the fileName string fileName.erase(std::remove(fileName.begin(), fileName.end(), '/'), fileName.end()); fileName = fileName.substr(fileName.find_first_not_of('.')); if (fileName.empty()) { log("Error FileName is empty"); elog(xyz::openbmc_project::Common::InvalidArgument:: ARGUMENT_NAME("FileName"), xyz::openbmc_project::Common::InvalidArgument:: ARGUMENT_VALUE(fileName.c_str())); return; } if (serverAddress.empty()) { log("Error ServerAddress is empty"); elog(xyz::openbmc_project::Common::InvalidArgument:: ARGUMENT_NAME("ServerAddress"), xyz::openbmc_project::Common::InvalidArgument:: ARGUMENT_VALUE(serverAddress.c_str())); return; } log("Downloading via TFTP", entry("FILENAME=%s", fileName), entry("SERVERADDRESS=%s", serverAddress)); // Check if IMAGE DIR exists and create if necessary. fs::path imgDirPath(IMG_UPLOAD_DIR); if (!fs::is_directory(imgDirPath)) { fs::create_directory(imgDirPath); } 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("Error occurred during the TFTP call"); elog(); } else if (pid < 0) { log("Error occurred during fork"); elog(); } return; } } // namespace manager } // namespace software } // namespace phosphor