Merge "Add Google-style ReadFileToString and WriteStringToFile."

This commit is contained in:
Elliott Hughes 2015-02-03 20:19:07 +00:00 committed by Gerrit Code Review
commit 6974ba4ed4
5 changed files with 138 additions and 10 deletions

29
include/utils/file.h Normal file
View 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

View file

@ -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
View 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;
}

View file

@ -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 \

View 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());
}