summaryrefslogtreecommitdiff
path: root/init/builtins.cpp
diff options
context:
space:
mode:
authorYongqin Liu <yongqin.liu@linaro.org>2016-12-28 16:06:19 +0800
committerYongqin Liu <yongqin.liu@linaro.org>2017-03-24 08:34:25 +0800
commit82bac0de6d95bcdf45729516f6a4f29eb2681118 (patch)
tree8e75d7be44dc0d26b57df0ec7cd319ade698e7e0 /init/builtins.cpp
parent2a54ae97ebcb69fe0ca5807f860739f499079ca1 (diff)
init: use read_file and write_file to implement do_copy builtin
this will make the implementation more cleaner, and has error message output when failed on some operations also add the O_TRUNC flag explicitly for the open function called in write_file. And add more test on read_file and write_file functions Test: manual with hikey Change-Id: Ifc1086a20e85db6980b497b1150a8a7952e672d6 Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r--init/builtins.cpp58
1 files changed, 4 insertions, 54 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 43eb378d7..c7dffb105 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -839,61 +839,11 @@ static int do_write(const std::vector<std::string>& args) {
}
static int do_copy(const std::vector<std::string>& args) {
- 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;
+ std::string data;
+ if (read_file(args[1].c_str(), &data)) {
+ return write_file(args[2].c_str(), data.data()) ? 0 : 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;
+ return 1;
}
static int do_chown(const std::vector<std::string>& args) {