diff -u commands.c commands.c --- commands.c Tue Jun 13 10:24:43 2000 +++ commands.c Mon Mar 12 16:49:22 2001 @@ -493,7 +493,7 @@ } #endif - if (stat (file->name, &st) == 0 + if (atomic_stat (file->name, &st) == 0 && S_ISREG (st.st_mode) && FILE_TIMESTAMP_STAT_MODTIME (file->name, st) != file->last_mtime) { diff -u dir.c dir.c --- dir.c Mon May 8 14:26:00 2000 +++ dir.c Mon Mar 12 16:49:23 2001 @@ -344,7 +344,7 @@ #ifdef VMS r = vmsstat_dir (name, &st); #else - r = stat (name, &st); + r = atomic_stat (name, &st); #endif #ifdef WINDOWS32 @@ -540,7 +540,7 @@ */ if (dir->path_key && (dir->fs_flags & FS_FAT || - (stat(dir->path_key, &st) == 0 && + (atomic_stat(dir->path_key, &st) == 0 && st.st_mtime > dir->mtime))) { /* reset date stamp to show most recent re-process */ @@ -1106,7 +1106,7 @@ char *path; struct stat *buf; { - return stat (path, buf); + return atomic_stat (path, buf); } #endif diff -u make.h make.h --- make.h Thu Jun 15 01:25:37 2000 +++ make.h Mon Mar 12 16:49:24 2001 @@ -466,6 +466,8 @@ extern void make_access PARAMS ((void)); extern void child_access PARAMS ((void)); +extern int atomic_stat (const char *, struct stat *); + #ifdef HAVE_VFORK_H # include #endif diff -u misc.c misc.c --- misc.c Tue Jun 20 10:00:17 2000 +++ misc.c Mon Mar 12 16:50:09 2001 @@ -857,3 +857,13 @@ return value; } #endif + +int +atomic_stat (file_name, buf) +const char *file_name; +struct stat *buf; +{ + while (stat (file_name, buf) != 0) + if (errno != EINTR) + return errno; +} diff -u read.c read.c --- read.c Wed Jun 21 15:33:30 2000 +++ read.c Mon Mar 12 16:49:30 2001 @@ -2464,7 +2464,7 @@ dir = expanded; } - if (stat (dir, &stbuf) == 0 && S_ISDIR (stbuf.st_mode)) + if (atomic_stat (dir, &stbuf) == 0 && S_ISDIR (stbuf.st_mode)) { if (idx == max - 1) { @@ -2497,7 +2497,7 @@ #endif for (i = 0; default_include_directories[i] != 0; ++i) - if (stat (default_include_directories[i], &stbuf) == 0 + if (atomic_stat (default_include_directories[i], &stbuf) == 0 && S_ISDIR (stbuf.st_mode)) dirs[idx++] = default_include_directories[i]; diff -u remake.c remake.c --- remake.c Tue Jun 20 10:00:17 2000 +++ remake.c Mon Mar 12 16:49:32 2001 @@ -1228,13 +1228,12 @@ { struct stat st; - while (stat (name, &st) != 0) - if (errno != EINTR) - { - if (errno != ENOENT && errno != ENOTDIR) - perror_with_name ("stat:", name); - return NONEXISTENT_MTIME; - } + if (atomic_stat (name, &st) != 0) + { + if (errno != ENOENT && errno != ENOTDIR) + perror_with_name ("stat:", name); + return NONEXISTENT_MTIME; + } return FILE_TIMESTAMP_STAT_MODTIME (name, st); } diff -u vmsfunctions.c vmsfunctions.c --- vmsfunctions.c Sat Feb 5 02:50:48 2000 +++ vmsfunctions.c Mon Mar 12 16:49:33 2001 @@ -215,7 +215,7 @@ if (!(status & 1)) return -1; - status = stat (name, buf); + status = atomic_stat (name, buf); if (status) return -1; diff -u vpath.c vpath.c --- vpath.c Tue Jun 13 10:24:45 2000 +++ vpath.c Mon Mar 12 16:49:35 2001 @@ -515,7 +515,7 @@ #endif if (!exists_in_cache /* Makefile-mentioned file need not exist. */ - || stat (name, &st) == 0) /* Does it really exist? */ + || atomic_stat (name, &st) == 0) /* Does it really exist? */ { /* We have found a file. Store the name we found into *FILE for the caller. */