blob: af1f85b7162ce91e4685277bd124a1e224ec8dae [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#include "aos/util/file.h"
Brian Silverman61175fb2016-03-13 15:35:56 -04002
3#include <fcntl.h>
4#include <unistd.h>
5
James Kuszmaul3ae42262019-11-08 12:33:41 -08006#include <string_view>
7
John Park33858a32018-09-28 23:05:48 -07008#include "aos/scoped/scoped_fd.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07009#include "glog/logging.h"
Brian Silverman61175fb2016-03-13 15:35:56 -040010
11namespace aos {
12namespace util {
13
James Kuszmaul3ae42262019-11-08 12:33:41 -080014::std::string ReadFileToStringOrDie(const std::string_view filename) {
Brian Silverman61175fb2016-03-13 15:35:56 -040015 ::std::string r;
Austin Schuhcb108412019-10-13 16:09:54 -070016 ScopedFD fd(open(::std::string(filename).c_str(), O_RDONLY));
Alex Perrycb7da4b2019-08-28 19:35:56 -070017 PCHECK(fd.get() != -1) << ": opening " << filename;
Brian Silverman61175fb2016-03-13 15:35:56 -040018 while (true) {
19 char buffer[1024];
20 const ssize_t result = read(fd.get(), buffer, sizeof(buffer));
Alex Perrycb7da4b2019-08-28 19:35:56 -070021 PCHECK(result >= 0) << ": reading from " << filename;
22 if (result == 0) {
Brian Silverman61175fb2016-03-13 15:35:56 -040023 break;
24 }
25 r.append(buffer, result);
26 }
27 return r;
28}
29
James Kuszmaul3ae42262019-11-08 12:33:41 -080030void WriteStringToFileOrDie(const std::string_view filename,
31 const std::string_view contents) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070032 ::std::string r;
33 ScopedFD fd(open(::std::string(filename).c_str(),
34 O_CREAT | O_WRONLY | O_TRUNC, S_IRWXU));
35 PCHECK(fd.get() != -1) << ": opening " << filename;
36 size_t size_written = 0;
37 while (size_written != contents.size()) {
38 const ssize_t result = write(fd.get(), contents.data() + size_written,
39 contents.size() - size_written);
40 PCHECK(result >= 0) << ": reading from " << filename;
41 if (result == 0) {
42 break;
43 }
44
45 size_written += result;
46 }
47}
48
Brian Silverman61175fb2016-03-13 15:35:56 -040049} // namespace util
50} // namespace aos