summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Venture <venture@google.com>2019-05-03 17:21:30 -0700
committerPatrick Venture <venture@google.com>2019-05-06 09:53:18 -0700
commit16a99a62d1946ef65175b34614e6037ce55a7d11 (patch)
treed3614b5ec141528f6e04103dd5adda4ca7705f4e /src
parent972547697e45b813891712b6c11111889a0a32d0 (diff)
downloadipmi-blob-tool-16a99a62d1946ef65175b34614e6037ce55a7d11.tar.gz
ipmi-blob-tool-16a99a62d1946ef65175b34614e6037ce55a7d11.zip
implement session stat command
Implement the session stat command. Change-Id: I1ff715dd32d963722182db84b475bc9adbfcc7ea Signed-off-by: Patrick Venture <venture@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/ipmiblob/blob_handler.cpp31
-rw-r--r--src/ipmiblob/blob_handler.hpp5
-rw-r--r--src/ipmiblob/blob_interface.hpp8
-rw-r--r--src/ipmiblob/test/blob_interface_mock.hpp1
4 files changed, 45 insertions, 0 deletions
diff --git a/src/ipmiblob/blob_handler.cpp b/src/ipmiblob/blob_handler.cpp
index 74ecd02..0d31b3f 100644
--- a/src/ipmiblob/blob_handler.cpp
+++ b/src/ipmiblob/blob_handler.cpp
@@ -242,6 +242,37 @@ StatResponse BlobHandler::getStat(const std::string& id)
return meta;
}
+StatResponse BlobHandler::getStat(std::uint16_t session)
+{
+ StatResponse meta;
+ std::vector<std::uint8_t> resp;
+ std::vector<std::uint8_t> request;
+ auto addrSession = reinterpret_cast<const std::uint8_t*>(&session);
+ std::copy(addrSession, addrSession + sizeof(session),
+ std::back_inserter(request));
+
+ try
+ {
+ resp = sendIpmiPayload(BlobOEMCommands::bmcBlobSessionStat, request);
+ }
+ catch (const BlobException& b)
+ {
+ throw;
+ }
+
+ std::memcpy(&meta.blob_state, &resp[0], sizeof(meta.blob_state));
+ std::memcpy(&meta.size, &resp[sizeof(meta.blob_state)], sizeof(meta.size));
+ int offset = sizeof(meta.blob_state) + sizeof(meta.size);
+ std::uint8_t len = resp[offset];
+ if (len > 0)
+ {
+ std::copy(&resp[offset + 1], &resp[resp.size()],
+ std::back_inserter(meta.metadata));
+ }
+
+ return meta;
+}
+
std::uint16_t BlobHandler::openBlob(const std::string& id,
std::uint16_t handlerFlags)
{
diff --git a/src/ipmiblob/blob_handler.hpp b/src/ipmiblob/blob_handler.hpp
index 22ad5f5..a663b63 100644
--- a/src/ipmiblob/blob_handler.hpp
+++ b/src/ipmiblob/blob_handler.hpp
@@ -63,6 +63,11 @@ class BlobHandler : public BlobInterface
/**
* @throws BlobException.
*/
+ StatResponse getStat(std::uint16_t session) override;
+
+ /**
+ * @throws BlobException.
+ */
std::uint16_t openBlob(const std::string& id,
std::uint16_t handlerFlags) override;
diff --git a/src/ipmiblob/blob_interface.hpp b/src/ipmiblob/blob_interface.hpp
index 5d311ee..ece5c34 100644
--- a/src/ipmiblob/blob_interface.hpp
+++ b/src/ipmiblob/blob_interface.hpp
@@ -57,6 +57,14 @@ class BlobInterface
virtual StatResponse getStat(const std::string& id) = 0;
/**
+ * Get the stat() on the blob session.
+ *
+ * @param[in] session - the blob session
+ * @return metadata structure
+ */
+ virtual StatResponse getStat(std::uint16_t session) = 0;
+
+ /**
* Attempt to open the file using the specific data interface flag.
*
* @param[in] blob - the blob_id to open.
diff --git a/src/ipmiblob/test/blob_interface_mock.hpp b/src/ipmiblob/test/blob_interface_mock.hpp
index 97f37df..0faa6fe 100644
--- a/src/ipmiblob/test/blob_interface_mock.hpp
+++ b/src/ipmiblob/test/blob_interface_mock.hpp
@@ -15,6 +15,7 @@ class BlobInterfaceMock : public BlobInterface
const std::vector<std::uint8_t>&));
MOCK_METHOD0(getBlobList, std::vector<std::string>());
MOCK_METHOD1(getStat, StatResponse(const std::string&));
+ MOCK_METHOD1(getStat, StatResponse(std::uint16_t));
MOCK_METHOD2(openBlob, std::uint16_t(const std::string&, std::uint16_t));
MOCK_METHOD1(closeBlob, void(std::uint16_t));
MOCK_METHOD3(readBytes,
OpenPOWER on IntegriCloud