Merge "Add Google-style ReadFileToString and WriteStringToFile."
This commit is contained in:
commit
6974ba4ed4
5 changed files with 138 additions and 10 deletions
29
include/utils/file.h
Normal file
29
include/utils/file.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef UTILS_FILE_H
|
||||
#define UTILS_FILE_H
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace android {
|
||||
|
||||
bool ReadFileToString(const std::string& path, std::string* content);
|
||||
bool WriteStringToFile(const std::string& content, const std::string& path);
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
|
@ -14,9 +14,6 @@
|
|||
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
|
||||
# libutils is a little unique: It's built twice, once for the host
|
||||
# and once for the device.
|
||||
|
||||
commonSources:= \
|
||||
BasicHashtable.cpp \
|
||||
BlobCache.cpp \
|
||||
|
@ -42,7 +39,8 @@ commonSources:= \
|
|||
Tokenizer.cpp \
|
||||
Unicode.cpp \
|
||||
VectorImpl.cpp \
|
||||
misc.cpp
|
||||
file.cpp \
|
||||
misc.cpp \
|
||||
|
||||
host_commonCflags := -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -Werror
|
||||
|
||||
|
@ -111,11 +109,6 @@ LOCAL_CFLAGS := -Werror
|
|||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
# Include subdirectory makefiles
|
||||
# ============================================================
|
||||
|
||||
# If we're building with ONE_SHOT_MAKEFILE (mm, mmm), then what the framework
|
||||
# team really wants is to build the stuff defined by this makefile.
|
||||
ifeq (,$(ONE_SHOT_MAKEFILE))
|
||||
# Build the tests in the tests/ subdirectory.
|
||||
include $(call first-makefiles-under,$(LOCAL_PATH))
|
||||
endif
|
||||
|
|
68
libutils/file.cpp
Normal file
68
libutils/file.cpp
Normal file
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "utils/file.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
bool android::ReadFileToString(const std::string& path, std::string* content) {
|
||||
content->clear();
|
||||
|
||||
int fd = TEMP_FAILURE_RETRY(open(path.c_str(), O_RDONLY | O_CLOEXEC | O_NOFOLLOW));
|
||||
if (fd == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
char buf[BUFSIZ];
|
||||
ssize_t n = TEMP_FAILURE_RETRY(read(fd, &buf[0], sizeof(buf)));
|
||||
if (n == -1) {
|
||||
TEMP_FAILURE_RETRY(close(fd));
|
||||
return false;
|
||||
}
|
||||
if (n == 0) {
|
||||
TEMP_FAILURE_RETRY(close(fd));
|
||||
return true;
|
||||
}
|
||||
content->append(buf, n);
|
||||
}
|
||||
}
|
||||
|
||||
bool android::WriteStringToFile(const std::string& content, const std::string& path) {
|
||||
int fd = TEMP_FAILURE_RETRY(open(path.c_str(),
|
||||
O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW,
|
||||
DEFFILEMODE));
|
||||
if (fd == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* p = content.data();
|
||||
size_t left = content.size();
|
||||
while (left > 0) {
|
||||
ssize_t n = TEMP_FAILURE_RETRY(write(fd, p, left));
|
||||
if (n == -1) {
|
||||
TEMP_FAILURE_RETRY(close(fd));
|
||||
return false;
|
||||
}
|
||||
p += n;
|
||||
left -= n;
|
||||
}
|
||||
TEMP_FAILURE_RETRY(close(fd));
|
||||
return true;
|
||||
}
|
|
@ -26,6 +26,7 @@ LOCAL_SRC_FILES := \
|
|||
BasicHashtable_test.cpp \
|
||||
BlobCache_test.cpp \
|
||||
BitSet_test.cpp \
|
||||
file_test.cpp \
|
||||
Looper_test.cpp \
|
||||
LruCache_test.cpp \
|
||||
String8_test.cpp \
|
||||
|
|
37
libutils/tests/file_test.cpp
Normal file
37
libutils/tests/file_test.cpp
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright (C) 2013 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "utils/file.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(file, ReadFileToString_ENOENT) {
|
||||
std::string s("hello");
|
||||
errno = 0;
|
||||
EXPECT_FALSE(android::ReadFileToString("/proc/does-not-exist", &s));
|
||||
EXPECT_EQ(ENOENT, errno);
|
||||
EXPECT_EQ("", s); // s was cleared.
|
||||
}
|
||||
|
||||
TEST(file, ReadFileToString_success) {
|
||||
std::string s("hello");
|
||||
EXPECT_TRUE(android::ReadFileToString("/proc/version", &s));
|
||||
EXPECT_GT(s.length(), 6U);
|
||||
EXPECT_EQ('\n', s[s.length() - 1]);
|
||||
s[5] = 0;
|
||||
EXPECT_STREQ("Linux", s.c_str());
|
||||
}
|
Loading…
Reference in a new issue