bug-gnulib
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]