]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: break out read_fd method
authorSage Weil <sage@newdream.net>
Tue, 26 Apr 2011 16:40:03 +0000 (09:40 -0700)
committerSage Weil <sage@newdream.net>
Tue, 26 Apr 2011 16:40:03 +0000 (09:40 -0700)
Read N bytes from the provided fd into the bufferlist.

Signed-off-by: Sage Weil <sage@newdream.net>
src/common/buffer.cc
src/include/buffer.h

index ec87f741e3d3da9bb01a4fe9b4c728f46b6c4372..a96f3690689fdbdc2c4caa7d4cbeebe63019e372 100644 (file)
@@ -420,32 +420,39 @@ int buffer::list::read_file(const char *fn, bool silent)
   memset(&st, 0, sizeof(st));
   ::fstat(fd, &st);
 
-  int s = ROUND_UP_TO(st.st_size, PAGE_SIZE);
-  bufferptr bp = buffer::create_page_aligned(s);
-
-  ssize_t ret = safe_read(fd, (void*)bp.c_str(), st.st_size);
+  ssize_t ret = read_fd(fd, st.st_size);
   if (ret < 0) {
-      if (!silent) {
-       derr << "bufferlist::read_file(" << fn << "): read error:"
-            << cpp_strerror(ret) << dendl;
-      }
-      TEMP_FAILURE_RETRY(::close(fd));
-      return ret;
+    if (!silent) {
+      derr << "bufferlist::read_file(" << fn << "): read error:"
+          << cpp_strerror(ret) << dendl;
+    }
+    TEMP_FAILURE_RETRY(::close(fd));
+    return ret;
   }
   else if (ret != st.st_size) {
-      // Premature EOF.
-      // Perhaps the file changed between stat() and read()?
-      if (!silent) {
-       derr << "bufferlist::read_file(" << fn << "): warning: got premature "
-            << "EOF:" << dendl;
-      }
+    // Premature EOF.
+    // Perhaps the file changed between stat() and read()?
+    if (!silent) {
+      derr << "bufferlist::read_file(" << fn << "): warning: got premature "
+          << "EOF:" << dendl;
+    }
   }
   TEMP_FAILURE_RETRY(::close(fd));
-  bp.set_length(ret);
-  append(bp);
   return 0;
 }
 
+ssize_t buffer::list::read_fd(int fd, size_t len) 
+{
+  int s = ROUND_UP_TO(len, PAGE_SIZE);
+  bufferptr bp = buffer::create_page_aligned(s);
+  ssize_t ret = safe_read(fd, (void*)bp.c_str(), len);
+  if (ret >= 0) {
+    bp.set_length(ret);
+    append(bp);
+  }
+  return ret;
+}
+
 int buffer::list::write_file(const char *fn, int mode)
 {
   int fd = TEMP_FAILURE_RETRY(::open(fn, O_WRONLY|O_CREAT|O_TRUNC, mode));
index c5cdd203d6314a862102ec9f5fd87f259a5aabaa..ada6a17ba6e60ab01e1e3c3fc14e7db2ec0b809c 100644 (file)
@@ -906,6 +906,7 @@ public:
 
     void hexdump(std::ostream &out) const;
     int read_file(const char *fn, bool silent=false);
+    ssize_t read_fd(int fd, size_t len);
     int write_file(const char *fn, int mode=0644);
     int write_fd(int fd) const;
     __u32 crc32c(__u32 crc) {