[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: same-inode.h and OpenVMS
From: |
Jim Meyering |
Subject: |
Re: same-inode.h and OpenVMS |
Date: |
Sat, 31 Dec 2011 10:20:18 +0100 |
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.