| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 #if defined(TARGET_OS_FUCHSIA) | 6 #if defined(TARGET_OS_FUCHSIA) |
| 7 | 7 |
| 8 #include "bin/directory.h" | 8 #include "bin/directory.h" |
| 9 | 9 |
| 10 #include <errno.h> // NOLINT | 10 #include <errno.h> // NOLINT |
| 11 #include <stdlib.h> // NOLINT | 11 #include <stdlib.h> // NOLINT |
| 12 #include <string.h> // NOLINT | 12 #include <string.h> // NOLINT |
| 13 #include <sys/stat.h> // NOLINT | 13 #include <sys/stat.h> // NOLINT |
| 14 #include <unistd.h> // NOLINT | 14 #include <unistd.h> // NOLINT |
| 15 | 15 |
| 16 #include "bin/dartutils.h" | 16 #include "bin/dartutils.h" |
| 17 #include "bin/file.h" | 17 #include "bin/file.h" |
| 18 #include "bin/platform.h" | 18 #include "bin/platform.h" |
| 19 #include "platform/signal_blocker.h" | 19 #include "platform/signal_blocker.h" |
| 20 | 20 |
| 21 namespace dart { | 21 namespace dart { |
| 22 namespace bin { | 22 namespace bin { |
| 23 | 23 |
| 24 PathBuffer::PathBuffer() : length_(0) { | 24 PathBuffer::PathBuffer() : length_(0) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 53 } | 53 } |
| 54 | 54 |
| 55 | 55 |
| 56 bool PathBuffer::Add(const char* name) { | 56 bool PathBuffer::Add(const char* name) { |
| 57 const intptr_t name_length = strnlen(name, PATH_MAX + 1); | 57 const intptr_t name_length = strnlen(name, PATH_MAX + 1); |
| 58 if (name_length == 0) { | 58 if (name_length == 0) { |
| 59 errno = EINVAL; | 59 errno = EINVAL; |
| 60 return false; | 60 return false; |
| 61 } | 61 } |
| 62 char* data = AsString(); | 62 char* data = AsString(); |
| 63 int written = snprintf(data + length_, | 63 int written = snprintf(data + length_, PATH_MAX - length_, "%s", name); |
| 64 PATH_MAX - length_, | |
| 65 "%s", | |
| 66 name); | |
| 67 data[PATH_MAX] = '\0'; | 64 data[PATH_MAX] = '\0'; |
| 68 if ((written <= (PATH_MAX - length_)) && | 65 if ((written <= (PATH_MAX - length_)) && (written > 0) && |
| 69 (written > 0) && | |
| 70 (static_cast<size_t>(written) == strnlen(name, PATH_MAX + 1))) { | 66 (static_cast<size_t>(written) == strnlen(name, PATH_MAX + 1))) { |
| 71 length_ += written; | 67 length_ += written; |
| 72 return true; | 68 return true; |
| 73 } else { | 69 } else { |
| 74 errno = ENAMETOOLONG; | 70 errno = ENAMETOOLONG; |
| 75 return false; | 71 return false; |
| 76 } | 72 } |
| 77 } | 73 } |
| 78 | 74 |
| 79 | 75 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 102 Directory::ExistsResult Directory::Exists(const char* dir_name) { | 98 Directory::ExistsResult Directory::Exists(const char* dir_name) { |
| 103 struct stat entry_info; | 99 struct stat entry_info; |
| 104 int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info)); | 100 int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info)); |
| 105 if (success == 0) { | 101 if (success == 0) { |
| 106 if (S_ISDIR(entry_info.st_mode)) { | 102 if (S_ISDIR(entry_info.st_mode)) { |
| 107 return EXISTS; | 103 return EXISTS; |
| 108 } else { | 104 } else { |
| 109 return DOES_NOT_EXIST; | 105 return DOES_NOT_EXIST; |
| 110 } | 106 } |
| 111 } else { | 107 } else { |
| 112 if ((errno == EACCES) || | 108 if ((errno == EACCES) || (errno == EBADF) || (errno == EFAULT) || |
| 113 (errno == EBADF) || | 109 (errno == ENOMEM) || (errno == EOVERFLOW)) { |
| 114 (errno == EFAULT) || | |
| 115 (errno == ENOMEM) || | |
| 116 (errno == EOVERFLOW)) { | |
| 117 // Search permissions denied for one of the directories in the | 110 // Search permissions denied for one of the directories in the |
| 118 // path or a low level error occured. We do not know if the | 111 // path or a low level error occured. We do not know if the |
| 119 // directory exists. | 112 // directory exists. |
| 120 return UNKNOWN; | 113 return UNKNOWN; |
| 121 } | 114 } |
| 122 ASSERT((errno == ELOOP) || | 115 ASSERT((errno == ELOOP) || (errno == ENAMETOOLONG) || (errno == ENOENT) || |
| 123 (errno == ENAMETOOLONG) || | |
| 124 (errno == ENOENT) || | |
| 125 (errno == ENOTDIR)); | 116 (errno == ENOTDIR)); |
| 126 return DOES_NOT_EXIST; | 117 return DOES_NOT_EXIST; |
| 127 } | 118 } |
| 128 } | 119 } |
| 129 | 120 |
| 130 | 121 |
| 131 char* Directory::CurrentNoScope() { | 122 char* Directory::CurrentNoScope() { |
| 132 return getcwd(NULL, 0); | 123 return getcwd(NULL, 0); |
| 133 } | 124 } |
| 134 | 125 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 if (exists != EXISTS) { | 216 if (exists != EXISTS) { |
| 226 return false; | 217 return false; |
| 227 } | 218 } |
| 228 return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0); | 219 return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0); |
| 229 } | 220 } |
| 230 | 221 |
| 231 } // namespace bin | 222 } // namespace bin |
| 232 } // namespace dart | 223 } // namespace dart |
| 233 | 224 |
| 234 #endif // defined(TARGET_OS_LINUX) | 225 #endif // defined(TARGET_OS_LINUX) |
| OLD | NEW |