Refactor the responder functions for file I/O

The ReadFileIntoMemory and WriteFileFromMemory command's responder
function is refactored to return the PLDM response message. The caller
cannot know the space for the response buffer if the responder has a
variable length of response.

Change-Id: I81f649098a7711772b35ae3d0d8d23c7cd24e7e7
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/libpldmresponder/file_io.cpp b/libpldmresponder/file_io.cpp
index adcccac..9cf093c 100644
--- a/libpldmresponder/file_io.cpp
+++ b/libpldmresponder/file_io.cpp
@@ -126,8 +126,7 @@
 
 } // namespace dma
 
-void readFileIntoMemory(const uint8_t* request, size_t payloadLength,
-                        pldm_msg* response)
+Response readFileIntoMemory(const uint8_t* request, size_t payloadLength)
 {
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
@@ -135,11 +134,14 @@
     uint64_t address = 0;
     fs::path path("");
 
+    Response response((sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES), 0);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+
     if (payloadLength != PLDM_RW_FILE_MEM_REQ_BYTES)
     {
         encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
-                                   PLDM_ERROR_INVALID_LENGTH, 0, response);
-        return;
+                                   PLDM_ERROR_INVALID_LENGTH, 0, responsePtr);
+        return response;
     }
 
     decode_rw_file_memory_req(request, payloadLength, &fileHandle, &offset,
@@ -149,8 +151,8 @@
     {
         log<level::ERR>("File does not exist", entry("HANDLE=%d", fileHandle));
         encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
-                                   PLDM_INVALID_FILE_HANDLE, 0, response);
-        return;
+                                   PLDM_INVALID_FILE_HANDLE, 0, responsePtr);
+        return response;
     }
 
     auto fileSize = fs::file_size(path);
@@ -159,8 +161,8 @@
         log<level::ERR>("Offset exceeds file size", entry("OFFSET=%d", offset),
                         entry("FILE_SIZE=%d", fileSize));
         encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
-                                   PLDM_DATA_OUT_OF_RANGE, 0, response);
-        return;
+                                   PLDM_DATA_OUT_OF_RANGE, 0, responsePtr);
+        return response;
     }
 
     if (offset + length > fileSize)
@@ -173,18 +175,17 @@
         log<level::ERR>("Read length is not a multiple of DMA minSize",
                         entry("LENGTH=%d", length));
         encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
-                                   PLDM_INVALID_READ_LENGTH, 0, response);
-        return;
+                                   PLDM_INVALID_READ_LENGTH, 0, responsePtr);
+        return response;
     }
 
     using namespace dma;
     DMA intf;
-    transferAll<DMA>(&intf, PLDM_READ_FILE_INTO_MEMORY, path, offset, length,
-                     address, true, response);
+    return transferAll<DMA>(&intf, PLDM_READ_FILE_INTO_MEMORY, path, offset,
+                            length, address, true);
 }
 
-void writeFileFromMemory(const uint8_t* request, size_t payloadLength,
-                         pldm_msg* response)
+Response writeFileFromMemory(const uint8_t* request, size_t payloadLength)
 {
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
@@ -192,11 +193,14 @@
     uint64_t address = 0;
     fs::path path("");
 
+    Response response(sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES, 0);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+
     if (payloadLength != PLDM_RW_FILE_MEM_REQ_BYTES)
     {
         encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
-                                   PLDM_ERROR_INVALID_LENGTH, 0, response);
-        return;
+                                   PLDM_ERROR_INVALID_LENGTH, 0, responsePtr);
+        return response;
     }
 
     decode_rw_file_memory_req(request, payloadLength, &fileHandle, &offset,
@@ -207,16 +211,16 @@
         log<level::ERR>("Write length is not a multiple of DMA minSize",
                         entry("LENGTH=%d", length));
         encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
-                                   PLDM_INVALID_WRITE_LENGTH, 0, response);
-        return;
+                                   PLDM_INVALID_WRITE_LENGTH, 0, responsePtr);
+        return response;
     }
 
     if (!fs::exists(path))
     {
         log<level::ERR>("File does not exist", entry("HANDLE=%d", fileHandle));
         encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
-                                   PLDM_INVALID_FILE_HANDLE, 0, response);
-        return;
+                                   PLDM_INVALID_FILE_HANDLE, 0, responsePtr);
+        return response;
     }
 
     auto fileSize = fs::file_size(path);
@@ -225,14 +229,14 @@
         log<level::ERR>("Offset exceeds file size", entry("OFFSET=%d", offset),
                         entry("FILE_SIZE=%d", fileSize));
         encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
-                                   PLDM_DATA_OUT_OF_RANGE, 0, response);
-        return;
+                                   PLDM_DATA_OUT_OF_RANGE, 0, responsePtr);
+        return response;
     }
 
     using namespace dma;
     DMA intf;
-    transferAll<DMA>(&intf, PLDM_WRITE_FILE_FROM_MEMORY, path, offset, length,
-                     address, false, response);
+    return transferAll<DMA>(&intf, PLDM_WRITE_FILE_FROM_MEMORY, path, offset,
+                            length, address, false);
 }
 
 } // namespace responder