Revert "init: use read_file and write_file to implement do_copy builtin"

Bug: 36726045
Test: gts-tradefed run gts --abi x86 -m GtsMediaTestCases -t com.google.android.media.gts.MediaCodecCencTest#testCENC_DASH_FMP4_H264_360P_PLAYREADY_CENC
This reverts commit 82bac0de6d95bcdf45729516f6a4f29eb2681118.

Change-Id: I3b754f429499daec804a0ad25529294216c39a40
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 02e314f..64a2d82 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -702,11 +702,51 @@
 }
 
 static int do_copy(const std::vector<std::string>& args) {
-    std::string data;
-    if (read_file(args[1].c_str(), &data)) {
-        return write_file(args[2].c_str(), data.data()) ? 0 : 1;
+    char* buffer = NULL;
+    int rc = 0;
+    int fd1 = -1, fd2 = -1;
+    struct stat info;
+    int brtw, brtr;
+    char* p;
+
+    if (stat(args[1].c_str(), &info) < 0) return -1;
+
+    if ((fd1 = open(args[1].c_str(), O_RDONLY | O_CLOEXEC)) < 0) goto out_err;
+
+    if ((fd2 = open(args[2].c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0660)) < 0)
+        goto out_err;
+
+    if (!(buffer = (char*)malloc(info.st_size))) goto out_err;
+
+    p = buffer;
+    brtr = info.st_size;
+    while (brtr) {
+        rc = read(fd1, p, brtr);
+        if (rc < 0) goto out_err;
+        if (rc == 0) break;
+        p += rc;
+        brtr -= rc;
     }
-    return 1;
+
+    p = buffer;
+    brtw = info.st_size;
+    while (brtw) {
+        rc = write(fd2, p, brtw);
+        if (rc < 0) goto out_err;
+        if (rc == 0) break;
+        p += rc;
+        brtw -= rc;
+    }
+
+    rc = 0;
+    goto out;
+out_err:
+    rc = -1;
+out:
+    if (buffer) free(buffer);
+    if (fd1 >= 0) close(fd1);
+    if (fd2 >= 0) close(fd2);
+    return rc;
 }
 
 static int do_chown(const std::vector<std::string>& args) {