diff options
author | Elliott Hughes <enh@google.com> | 2013-02-25 13:14:31 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2013-02-25 13:14:31 -0800 |
commit | 701bec2af33feaa9dddf12ccf8e4c714441b7f2e (patch) | |
tree | 72d4f9e8dcc65601e89b70d11ab4b02f7fce64b5 /libc/private | |
parent | f6bb5bf498810d0622f66020059c87b96738c35b (diff) | |
download | bionic-701bec2af33feaa9dddf12ccf8e4c714441b7f2e.zip bionic-701bec2af33feaa9dddf12ccf8e4c714441b7f2e.tar.gz bionic-701bec2af33feaa9dddf12ccf8e4c714441b7f2e.tar.bz2 |
Reimplement scandir(3).
The old scandir implementation didn't take into account the varying
size of directory entries, and didn't correctly clean up on its
error exits.
Bug: 7339844
Change-Id: Ib40e3564709752241a3119a496cbb2192e3f9abe
Diffstat (limited to 'libc/private')
-rw-r--r-- | libc/private/ScopedReaddir.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libc/private/ScopedReaddir.h b/libc/private/ScopedReaddir.h new file mode 100644 index 0000000..797809a --- /dev/null +++ b/libc/private/ScopedReaddir.h @@ -0,0 +1,50 @@ +/* + * 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. + */ + +#ifndef SCOPED_READDIR_H +#define SCOPED_READDIR_H + +#include <dirent.h> + +class ScopedReaddir { + public: + ScopedReaddir(const char* path) { + dir_ = opendir(path); + } + + ~ScopedReaddir() { + if (dir_ != NULL) { + closedir(dir_); + } + } + + bool IsBad() { + return dir_ == NULL; + } + + dirent* ReadEntry() { + return readdir(dir_); + } + + private: + DIR* dir_; + + // Disallow copy and assignment. + ScopedReaddir(const ScopedReaddir&); + void operator=(const ScopedReaddir&); +}; + +#endif // SCOPED_READDIR_H |