Jim Meyering <jim <at> meyering.net> writes: > > OK, I've pushed the NEWS change (including the typo fix > > canonicalize=>readlink), then a separate commit to resync gnulib. > > Thanks.
Here's another patch related to gnulib churn. I am _NOT_ planning on attempting to port coreutils to mingw, so the mingw folks may still have a lot of work to make coreutils handle their platform's oddities nicely. But this patch should be okay (it is a no-op if applied before my matching gnulib change to SAME_INODE to be tri-state [1]; and if applied afterwards, it should have no semantic changes for sane platforms where st_ino is never 0), and at least in theory will make life more bearable for the poor guy who does try to port coreutils to mingw. OK to apply? [1] http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/18854 From: Eric Blake <e...@byu.net> Date: Wed, 23 Sep 2009 15:42:05 -0600 Subject: [PATCH] build: reflect same-inode changes from gnulib On mingw, st_ino is always 0, so SAME_INODE returns -1. Also, st_nlink is always 1, so even though the link module can create hard links, we can't detect them. Here is an analysis of all uses of SAME_INODE in coreutils: root-dev-ino - mingw can't delete root dir anyway chown-core - can't rename in-use files copy - can't rename in-use files, no way to detect hard links to protect them, and no symlinks; behavior on identical files may be non-compliant, but that's life for mingw users cp-hash - using -1 may lead to more hash collisions, but still correct behavior du - no way to detect hard links, so they will be double-counted ln - trying ln -f k k will delete k, but that's life for mingw and complies with POSIX ls - no directory cycles, so no problem pwd - getpwd is always accurate, and no symlinks so no -L needed sort - will always use temporary file, but still correct * gl/lib/root-dev-ino.h (ROOT_DEV_INO_CHECK): Update caller. * src/du.c (entry_compare): Likewise. * src/ln.c (do_link): Likewise. * src/ls.c (dev_ino_compare): Likewise. * src/pwd.c (robust_getcwd, logical_getcwd): Likewise. Signed-off-by: Eric Blake <e...@byu.net> --- gl/lib/root-dev-ino.h | 2 +- src/copy.c | 2 +- src/du.c | 2 +- src/ln.c | 2 +- src/ls.c | 2 +- src/pwd.c | 5 +++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/gl/lib/root-dev-ino.h b/gl/lib/root-dev-ino.h index bec27f0..3ee1d88 100644 --- a/gl/lib/root-dev-ino.h +++ b/gl/lib/root-dev-ino.h @@ -28,7 +28,7 @@ get_root_dev_ino (struct dev_ino *root_d_i); --preserve-root and --no-preserve-root options. */ # define ROOT_DEV_INO_CHECK(Root_dev_ino, Dir_statbuf) \ - (Root_dev_ino && SAME_INODE (*Dir_statbuf, *Root_dev_ino)) + (Root_dev_ino && SAME_INODE (*Dir_statbuf, *Root_dev_ino) == 1) # define ROOT_DEV_INO_WARN(Dirname) \ do \ diff --git a/src/copy.c b/src/copy.c index e3c5c52..7d26b59 100644 --- a/src/copy.c +++ b/src/copy.c @@ -1971,7 +1971,7 @@ copy_internal (char const *src_name, char const *dst_name, directory. Other things will fail later. */ || stat (".", &dot_sb) != 0 || stat (dst_parent, &dst_parent_sb) != 0 - || SAME_INODE (dot_sb, dst_parent_sb)); + || SAME_INODE (dot_sb, dst_parent_sb) == 1); free (dst_parent); if (! in_current_dir) diff --git a/src/du.c b/src/du.c index 9831a17..7382ff1 100644 --- a/src/du.c +++ b/src/du.c @@ -354,7 +354,7 @@ entry_compare (void const *x, void const *y) { struct entry const *a = x; struct entry const *b = y; - return SAME_INODE (*a, *b) ? true : false; + return SAME_INODE (*a, *b) == 1 ? true : false; } /* Try to insert the INO/DEV pair into the global table, HTAB. diff --git a/src/ln.c b/src/ln.c index 0c35338..6e1ecdc 100644 --- a/src/ln.c +++ b/src/ln.c @@ -214,7 +214,7 @@ do_link (const char *source, const char *dest) misleading. */ && (backup_type == no_backups || !symbolic_link) && (!symbolic_link || stat (source, &source_stats) == 0) - && SAME_INODE (source_stats, dest_stats) + && SAME_INODE (source_stats, dest_stats) == 1 /* The following detects whether removing DEST will also remove SOURCE. If the file has only one link then both are surely the same link. Otherwise check whether they point to the same diff --git a/src/ls.c b/src/ls.c index 1bb6873..45543e4 100644 --- a/src/ls.c +++ b/src/ls.c @@ -1076,7 +1076,7 @@ dev_ino_compare (void const *x, void const *y) { struct dev_ino const *a = x; struct dev_ino const *b = y; - return SAME_INODE (*a, *b) ? true : false; + return SAME_INODE (*a, *b) == 1 ? true : false; } static void diff --git a/src/pwd.c b/src/pwd.c index cfbf5b7..a2e7a2b 100644 --- a/src/pwd.c +++ b/src/pwd.c @@ -280,7 +280,7 @@ robust_getcwd (struct file_name *file_name) while (1) { /* If we've reached the root, we're done. */ - if (SAME_INODE (dot_sb, *root_dev_ino)) + if (SAME_INODE (dot_sb, *root_dev_ino) == 1) break; find_dir_entry (&dot_sb, file_name, height++); @@ -315,7 +315,8 @@ logical_getcwd (void) } /* System call validation. */ - if (stat (wd, &st1) == 0 && stat (".", &st2) == 0 && SAME_INODE(st1, st2)) + if (stat (wd, &st1) == 0 && stat (".", &st2) == 0 + && SAME_INODE(st1, st2) == 1) return wd; return NULL; } -- 1.6.4.2