xref: /openbmc/phosphor-ipmi-flash/tools/bt.cpp (revision 0d5bb784)
1 #include "bt.hpp"
2 
3 #include <ipmiblob/blob_errors.hpp>
4 
5 #include <cstdint>
6 #include <vector>
7 
8 namespace host_tool
9 {
10 
11 bool BtDataHandler::sendContents(const std::string& input,
12                                  std::uint16_t session)
13 {
14     int inputFd = sys->open(input.c_str(), 0);
15     if (inputFd < 0)
16     {
17         return false;
18     }
19 
20     std::int64_t fileSize = sys->getSize(input.c_str());
21     if (fileSize == 0)
22     {
23         std::fprintf(stderr, "Zero-length file, or other file access error\n");
24         return false;
25     }
26 
27     progress->start(fileSize);
28 
29     try
30     {
31         static constexpr int btBufferLen = 50;
32         std::uint8_t readBuffer[btBufferLen];
33         int bytesRead;
34         std::uint32_t offset = 0;
35 
36         do
37         {
38             bytesRead = sys->read(inputFd, readBuffer, sizeof(readBuffer));
39             if (bytesRead > 0)
40             {
41                 /* minorly awkward repackaging. */
42                 std::vector<std::uint8_t> buffer(&readBuffer[0],
43                                                  &readBuffer[bytesRead]);
44                 blob->writeBytes(session, offset, buffer);
45                 offset += bytesRead;
46                 progress->updateProgress(bytesRead);
47             }
48         } while (bytesRead > 0);
49     }
50     catch (const ipmiblob::BlobException& b)
51     {
52         progress->abort();
53         sys->close(inputFd);
54         return false;
55     }
56 
57     progress->finish();
58     sys->close(inputFd);
59     return true;
60 }
61 
62 } // namespace host_tool
63