Paul Eggert wrote: > On OpenVMS st_ino is an array of three ino_t values, so grep's > a.st_ino == b.st_ino compares *pointers*, and yields 0. Ouch. > > For other GNU programs we often don't worry about OpenVMS, > but grep is a special case, as it's actually used on OpenVMS > <http://h71000.www7.hp.com/opensource/gnv.html> > and grep uses st_ino so rarely that it's easy to port around > this particular problem. Here's a proposed patch. > One part is to grep, the other to gnulib, so I'll CC: > this to bug-gnulib. > > > ---- grep patch ---- > grep: fix directory loop check on OpenVMS > * src/main.c (grepdir): Use SAME_INODE instead of rolling our own. > diff --git a/src/main.c b/src/main.c > index ca6f85f..43b938e 100644 > --- a/src/main.c > +++ b/src/main.c > @@ -1515,8 +1515,7 @@ grepdir (char const *dir, struct stats const *stats) > { > for (ancestor = stats; (ancestor = ancestor->parent) != 0; ) > { > - if (ancestor->stat.st_ino == stats->stat.st_ino > - && ancestor->stat.st_dev == stats->stat.st_dev) > + if (SAME_INODE (ancestor->stat, stats->stat)) > { > if (!suppress_errors) > error (0, 0, _("warning: %s: %s"), dir,
Obviously an improvement, and no semantic change, assuming the existing SAME_INODE macro. > ---- gnulib patch ---- > * lib/same-inode.h (SAME_INODE): Port to OpenVMS. > diff --git a/lib/same-inode.h b/lib/same-inode.h > index d434b94..7956a7d 100644 > --- a/lib/same-inode.h > +++ b/lib/same-inode.h > @@ -18,8 +18,16 @@ > #ifndef SAME_INODE_H > # define SAME_INODE_H 1 > > -# define SAME_INODE(Stat_buf_1, Stat_buf_2) \ > - ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \ > - && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev) > +# ifdef __VMS > +# define SAME_INODE(a, b) \ > + ((a).st_ino[0] == (b).st_ino[0] \ > + && (a).st_ino[1] == (b).st_ino[1] \ > + && (a).st_ino[2] == (b).st_ino[2] \ > + && (a).st_dev == (b).st_dev) > +# else > +# define SAME_INODE(a, b) \ > + ((a).st_ino == (b).st_ino \ > + && (a).st_dev == (b).st_dev) > +# endif Clean, safe, no impact on other systems. Looks perfect.