diff options
author | Yongqin Liu <yongqin.liu@linaro.org> | 2016-12-28 16:06:19 +0800 |
---|---|---|
committer | Yongqin Liu <yongqin.liu@linaro.org> | 2017-03-24 08:34:25 +0800 |
commit | 82bac0de6d95bcdf45729516f6a4f29eb2681118 (patch) | |
tree | 8e75d7be44dc0d26b57df0ec7cd319ade698e7e0 /init/builtins.cpp | |
parent | 2a54ae97ebcb69fe0ca5807f860739f499079ca1 (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.cpp | 58 |
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) { |