xref: /openbmc/estoraged/src/util.cpp (revision a6e3b99d)
1*a6e3b99dSJohn Edward Broadbent #include "util.hpp"
2*a6e3b99dSJohn Edward Broadbent 
3*a6e3b99dSJohn Edward Broadbent #include <linux/fs.h>
4*a6e3b99dSJohn Edward Broadbent 
5*a6e3b99dSJohn Edward Broadbent #include <phosphor-logging/lg2.hpp>
6*a6e3b99dSJohn Edward Broadbent #include <stdplus/fd/create.hpp>
7*a6e3b99dSJohn Edward Broadbent #include <stdplus/fd/managed.hpp>
8*a6e3b99dSJohn Edward Broadbent #include <stdplus/handle/managed.hpp>
9*a6e3b99dSJohn Edward Broadbent #include <xyz/openbmc_project/Common/error.hpp>
10*a6e3b99dSJohn Edward Broadbent 
11*a6e3b99dSJohn Edward Broadbent #include <string_view>
12*a6e3b99dSJohn Edward Broadbent 
13*a6e3b99dSJohn Edward Broadbent namespace estoraged
14*a6e3b99dSJohn Edward Broadbent {
15*a6e3b99dSJohn Edward Broadbent namespace util
16*a6e3b99dSJohn Edward Broadbent {
17*a6e3b99dSJohn Edward Broadbent using ::sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
18*a6e3b99dSJohn Edward Broadbent using ::stdplus::fd::ManagedFd;
19*a6e3b99dSJohn Edward Broadbent 
20*a6e3b99dSJohn Edward Broadbent uint64_t Util::findSizeOfBlockDevice(const std::string& devPath)
21*a6e3b99dSJohn Edward Broadbent {
22*a6e3b99dSJohn Edward Broadbent     ManagedFd fd;
23*a6e3b99dSJohn Edward Broadbent     uint64_t bytes = 0;
24*a6e3b99dSJohn Edward Broadbent     try
25*a6e3b99dSJohn Edward Broadbent     {
26*a6e3b99dSJohn Edward Broadbent         // open block dev
27*a6e3b99dSJohn Edward Broadbent         fd = stdplus::fd::open(devPath, stdplus::fd::OpenAccess::ReadOnly);
28*a6e3b99dSJohn Edward Broadbent         // get block size
29*a6e3b99dSJohn Edward Broadbent         fd.ioctl(BLKGETSIZE64, &bytes);
30*a6e3b99dSJohn Edward Broadbent     }
31*a6e3b99dSJohn Edward Broadbent     catch (...)
32*a6e3b99dSJohn Edward Broadbent     {
33*a6e3b99dSJohn Edward Broadbent         lg2::error("erase unable to open blockdev", "REDFISH_MESSAGE_ID",
34*a6e3b99dSJohn Edward Broadbent                    std::string("OpenBMC.0.1.DriveEraseFailure"),
35*a6e3b99dSJohn Edward Broadbent                    "REDFISH_MESSAGE_ARGS", std::to_string(fd.get()));
36*a6e3b99dSJohn Edward Broadbent         throw InternalFailure();
37*a6e3b99dSJohn Edward Broadbent     }
38*a6e3b99dSJohn Edward Broadbent     return bytes;
39*a6e3b99dSJohn Edward Broadbent }
40*a6e3b99dSJohn Edward Broadbent 
41*a6e3b99dSJohn Edward Broadbent } // namespace util
42*a6e3b99dSJohn Edward Broadbent 
43*a6e3b99dSJohn Edward Broadbent } // namespace estoraged
44