Index: runtime/bin/directory_macos.cc |
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc |
deleted file mode 100644 |
index 641c0cf6d433891b059f3e830ce76b142c5e10c0..0000000000000000000000000000000000000000 |
--- a/runtime/bin/directory_macos.cc |
+++ /dev/null |
@@ -1,219 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-#include <dirent.h> |
-#include <libgen.h> |
-#include <string.h> |
-#include <sys/param.h> |
-#include <sys/stat.h> |
-#include <sys/types.h> |
-#include <unistd.h> |
- |
-#include "bin/dartutils.h" |
-#include "bin/directory.h" |
-#include "bin/file.h" |
- |
-// Forward declaration. |
-static bool ListRecursively(const char* dir_name, |
- bool recursive, |
- Dart_Port dir_port, |
- Dart_Port file_port, |
- Dart_Port done_port, |
- Dart_Port error_port); |
- |
- |
-static void ComputeFullPath(const char* dir_name, |
- char* path, |
- int* path_length) { |
- size_t written = 0; |
- |
- if (!File::IsAbsolutePath(dir_name)) { |
- ASSERT(getcwd(path, PATH_MAX) != NULL); |
- *path_length = strlen(path); |
- written = snprintf(path + *path_length, |
- PATH_MAX - *path_length, |
- "%s", |
- File::PathSeparator()); |
- ASSERT(written == strlen(File::PathSeparator())); |
- *path_length += written; |
- } |
- |
- // Use dirname and basename to canonicalize the provided directory |
- // name. |
- char* dir_name_copy = strdup(dir_name); |
- char* dir = dirname(dir_name_copy); |
- if (strcmp(dir, ".") != 0) { |
- written = snprintf(path + *path_length, |
- PATH_MAX - *path_length, |
- "%s%s", |
- dir, |
- File::PathSeparator()); |
- ASSERT(written == (strlen(dir) + strlen(File::PathSeparator()))); |
- *path_length += written; |
- } |
- char* base_name_copy = strdup(dir_name); |
- char* base = basename(base_name_copy); |
- if (strcmp(base, ".") != 0) { |
- written = snprintf(path + *path_length, |
- PATH_MAX - *path_length, |
- "%s%s", |
- base, |
- File::PathSeparator()); |
- ASSERT(written == (strlen(base) + strlen(File::PathSeparator()))); |
- *path_length += written; |
- } |
- |
- free(dir_name_copy); |
- free(base_name_copy); |
-} |
- |
- |
-static bool HandleDir(char* dir_name, |
- char* path, |
- int path_length, |
- bool recursive, |
- Dart_Port dir_port, |
- Dart_Port file_port, |
- Dart_Port done_port, |
- Dart_Port error_port) { |
- if (strcmp(dir_name, ".") != 0 && |
- strcmp(dir_name, "..") != 0) { |
- size_t written = snprintf(path + path_length, |
- PATH_MAX - path_length, |
- "%s", |
- dir_name); |
- ASSERT(written == strlen(dir_name)); |
- if (dir_port != 0) { |
- Dart_Handle name = Dart_NewString(path); |
- Dart_Post(dir_port, name); |
- } |
- if (recursive) { |
- return ListRecursively(path, |
- recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
- } |
- } |
- return true; |
-} |
- |
- |
-static void HandleFile(char* file_name, |
- char* path, |
- int path_length, |
- Dart_Port file_port) { |
- if (file_port != 0) { |
- size_t written = snprintf(path + path_length, |
- PATH_MAX - path_length, |
- "%s", |
- file_name); |
- ASSERT(written == strlen(file_name)); |
- Dart_Handle name = Dart_NewString(path); |
- Dart_Post(file_port, name); |
- } |
-} |
- |
- |
-static bool ListRecursively(const char* dir_name, |
- bool recursive, |
- Dart_Port dir_port, |
- Dart_Port file_port, |
- Dart_Port done_port, |
- Dart_Port error_port) { |
- DIR* dir_pointer = opendir(dir_name); |
- if (dir_pointer == NULL) { |
- // TODO(ager): post something on the error port. |
- return false; |
- } |
- |
- // Compute full path for the directory currently being listed. |
- char *path = static_cast<char*>(malloc(PATH_MAX)); |
- ASSERT(path != NULL); |
- int path_length = 0; |
- ComputeFullPath(dir_name, path, &path_length); |
- |
- // Iterated the directory and post the directories and files to the |
- // ports. |
- int success = 0; |
- bool completed = true; |
- dirent entry; |
- dirent* result; |
- while ((success = readdir_r(dir_pointer, &entry, &result)) == 0 && |
- result != NULL) { |
- switch (entry.d_type) { |
- case DT_DIR: |
- completed = completed && HandleDir(entry.d_name, |
- path, |
- path_length, |
- recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
- break; |
- case DT_REG: |
- HandleFile(entry.d_name, path, path_length, file_port); |
- break; |
- case DT_UNKNOWN: { |
- // On some file systems the entry type is not determined by |
- // readdir_r. For those we use lstat to determine the entry |
- // type. |
- struct stat entry_info; |
- size_t written = snprintf(path + path_length, |
- PATH_MAX - path_length, |
- "%s", |
- entry.d_name); |
- ASSERT(written == strlen(entry.d_name)); |
- int lstat_success = lstat(path, &entry_info); |
- if (lstat_success != 0) { |
- completed = false; |
- break; |
- } |
- if ((entry_info.st_mode & S_IFMT) == S_IFDIR) { |
- HandleDir(entry.d_name, |
- path, |
- path_length, |
- recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
- } else if ((entry_info.st_mode & S_IFMT) == S_IFREG) { |
- HandleFile(entry.d_name, path, path_length, file_port); |
- } |
- break; |
- } |
- default: |
- break; |
- } |
- } |
- completed = completed && (success == 0); |
- |
- // TODO(ager): Post on error port if closing fails. |
- closedir(dir_pointer); |
- free(path); |
- |
- return completed; |
-} |
- |
- |
-void Directory::List(const char* dir_name, |
- bool recursive, |
- Dart_Port dir_port, |
- Dart_Port file_port, |
- Dart_Port done_port, |
- Dart_Port error_port) { |
- bool completed = ListRecursively(dir_name, |
- recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
- if (done_port != 0) { |
- Dart_Handle value = Dart_NewBoolean(completed); |
- Dart_Post(done_port, value); |
- } |
-} |