Index: runtime/bin/directory_posix.cc |
diff --git a/runtime/bin/directory_posix.cc b/runtime/bin/directory_posix.cc |
index 8d79697c9478f735d85662460b5f8dc0cbbcd7f9..c201988325b4052ea2bc21e6ddec98377d1036a4 100644 |
--- a/runtime/bin/directory_posix.cc |
+++ b/runtime/bin/directory_posix.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// Copyright (c) 2012, 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. |
@@ -39,7 +39,10 @@ static bool ListRecursively(const char* dir_name, |
static void ComputeFullPath(const char* dir_name, |
char* path, |
int* path_length) { |
- char* abs_path = realpath(dir_name, path); |
+ char* abs_path; |
+ do { |
+ abs_path = realpath(dir_name, path); |
+ } while (abs_path == NULL && errno == EINTR); |
ASSERT(abs_path != NULL); |
*path_length = strlen(path); |
size_t written = snprintf(path + *path_length, |
@@ -128,7 +131,10 @@ static bool ListRecursively(const char* dir_name, |
Dart_Port file_port, |
Dart_Port done_port, |
Dart_Port error_port) { |
- DIR* dir_pointer = opendir(dir_name); |
+ DIR* dir_pointer; |
+ do { |
+ dir_pointer = opendir(dir_name); |
+ } while (dir_pointer == NULL && errno == EINTR); |
if (dir_pointer == NULL) { |
PostError(error_port, "Directory listing failed for: ", dir_name, errno); |
return false; |
@@ -146,7 +152,9 @@ static bool ListRecursively(const char* dir_name, |
bool listing_error = false; |
dirent entry; |
dirent* result; |
- while ((success = readdir_r(dir_pointer, &entry, &result)) == 0 && |
+ while ((success = TEMP_FAILURE_RETRY(readdir_r(dir_pointer, |
+ &entry, |
+ &result))) == 0 && |
result != NULL && |
!listing_error) { |
switch (entry.d_type) { |
@@ -173,7 +181,7 @@ static bool ListRecursively(const char* dir_name, |
"%s", |
entry.d_name); |
ASSERT(written == strlen(entry.d_name)); |
- int lstat_success = lstat(path, &entry_info); |
+ int lstat_success = TEMP_FAILURE_RETRY(lstat(path, &entry_info)); |
if (lstat_success == -1) { |
listing_error = true; |
PostError(error_port, "Directory listing failed for: ", path, errno); |
@@ -233,7 +241,7 @@ void Directory::List(const char* dir_name, |
Directory::ExistsResult Directory::Exists(const char* dir_name) { |
struct stat entry_info; |
- int lstat_success = lstat(dir_name, &entry_info); |
+ int lstat_success = TEMP_FAILURE_RETRY(lstat(dir_name, &entry_info)); |
if (lstat_success == 0) { |
if ((entry_info.st_mode & S_IFMT) == S_IFDIR) { |
return EXISTS; |
@@ -263,7 +271,7 @@ Directory::ExistsResult Directory::Exists(const char* dir_name) { |
bool Directory::Create(const char* dir_name) { |
// Create the directory with the permissions specified by the |
// process umask. |
- return (mkdir(dir_name, 0777) == 0); |
+ return (TEMP_FAILURE_RETRY(mkdir(dir_name, 0777)) == 0); |
} |
@@ -287,7 +295,10 @@ int Directory::CreateTemp(const char* const_template, |
} else { |
snprintf(*path, PATH_MAX, "/tmp/temp_dir1_XXXXXX"); |
} |
- char* result = mkdtemp(*path); |
+ char* result; |
+ do { |
+ result = mkdtemp(*path); |
+ } while (result == NULL && errno == EINTR); |
if (result == NULL) { |
SetOsErrorMessage(os_error_message, os_error_message_len); |
free(*path); |
@@ -299,5 +310,5 @@ int Directory::CreateTemp(const char* const_template, |
bool Directory::Delete(const char* dir_name) { |
- return (rmdir(dir_name) == 0); |
+ return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0); |
} |