linux-man.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pierre Habouzit <madcoder-zi3NMfd+bKEdnm+yROfE0A@public.gmane.org>
To: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Ulrich Drepper <drepper-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: [Bug libc/11459] New: ftw doesn't work like documented (may be a   documentation bug)
Date: Thu, 24 Jun 2010 22:12:16 +0200	[thread overview]
Message-ID: <20100624201216.GB5357@madism.org> (raw)
In-Reply-To: <AANLkTikWG4U2wWS6ccM98Mg32WNrVCu5QCmz46hQ7lCC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

I think it makes sense indeed.

On Thu, Jun 10, 2010 at 07:04:20AM +0200, Michael Kerrisk wrote:
> Hi Pierre,
> 
> Thanks for following up on this. I still think the current man page
> text is correct. See below.
> 
> On Wed, Jun 9, 2010 at 12:46 PM, Pierre Habouzit <madcoder-zi3NMfd+bKEdnm+yROfE0A@public.gmane.org> wrote:
> > On Thu, Jun 03, 2010 at 09:18:22AM +0200, Michael Kerrisk wrote:
> >> Hi Pierre,
> >>
> >> On Wed, Jun 2, 2010 at 11:42 PM, Pierre Habouzit <madcoder@madism.org> wrote:
> >> > On Mon, May 24, 2010 at 07:41:49PM +0200, Michael Kerrisk wrote:
> >> >> Hello Pierre,
> >> >>
> >> >> On Tue, Apr 6, 2010 at 11:03 AM, Pierre Habouzit <madcoder@madism.org> wrote:
> >> >> > See below a bug reported against the glibc.  Since the glibc maintainer
> >> >> > dodged that one, I assume the bug indeed is in the documentation of
> >> >> > ftw(3). My manpages are the 3.24-1 Debian package.
> >> >>
> >> >> Yes. The man page is clearly incorrect. Thanks for reporting this.
> >> >>
> >> >> > IMHO the patch is:
> >> >> >
> >> >> >  -fpath is the pathname of the entry relative to dirpath.
> >> >> >  +fpath is the pathname of the entry relative to the current working directory.
> >> >> >
> >> >> > POSIX is very vague about what "fpath" should be btw.
> >> >>
> >> >> (Agreed. It could be more precise.)
> >> >>
> >> >> I believe the correct text should be this:
> >> >>
> >> >>        fpath   is  the  pathname  of  the  entry,  and  is
> >> >>        expressed either as  a  pathname  relative  to  the
> >> >>        calling  process's current working directory at the
> >> >>        time of the call to ftw(), if dirpath was expressed
> >> >>        as a relative pathname, or as an absolute pathname,
> >> >>        if dirpath was expressed as an  absolute  pathname..
> >> >>
> >> >> I have updated the man page accordingly, but would welcome
> >> >> review/checking of this text.
> >> >
> >> > Afaict, it's not correct: ftw may perform chdir() calls, so the pathname
> >> > is relative to the current working directory at the time `fn` is called.
> >> >
> >> > I'd rather phrase it that way (minus probable english mistakes):
> >> >
> >> >    fpath is the pathname of the entry, and is either a relative
> >> >    pathname to the current working directory of the application when
> >> >    `fn` is called, or as an absolute pathname.
> >>
> >> Thanks for taking a look at this. However, I *think* your analysis is
> >> wrong, and my proposed changes is right. But, still I'd like some
> >> further confirmation. Please take a look at the the program below, and
> >> the output produced when it runs.
> >
> > Yeah, that's because you're doing chdir()s during ftw, which is
> > undefined behaviour as documented in the manpage already IIRC.
> 
> True. That is documented in the POSIX page, but not currently in
> man-pages. I've fixed that now. Thanks.
> 
> > The point is, ftw() /may/ decide to do chdir() by itself sometimes, and
> > then the path is relative to the current working directory as set by
> > ftw().
> 
> I'm not sure why you think it may decide to do this. If this was
> unpredictable, then it would create difficulties for the application,
> as far as I can tell, since it would take quite some effort to
> correctly interpret the pathname supplied to 'fn'. And POSIX seems
> fairly clear on the point (at least for nftw()):
> 
>        FTW_CHDIR
>               If set, nftw() shall change  the  current  working
>               directory to each directory as it reports files in
>               that directory. If clear, nftw() shall not  change
>               the current working directory.
> 
> > I'm pretty sure it's what POSIX authorizes ftw() to perform chdirs.
> 
> See above.
> 
> > And when I look at ftw.c in the glibc, it's also pretty much what
> > happens in the case when you set FTW_CHDIR in the flags: ftw() forces a
> > chdir before the fn() call, and makes the path relative to this cwd.
> 
> Yes to the first part, but as far as I can see, still no to the last
> part ("and makes the path relative to this cwd" ). See below.
> 
> > It happens that the glibc doesn't seem to perform any kind of chdir() in
> > the other cases (IOW when FTW_CHDIR isn't set), but I'm pretty sure
> > POSIX allows ftw() to do so.
> 
> I don't see anywhere that POSIX authorizes that, and it wouldn't seem
> sensible to do so. See above.
> 
> Here's a variation on my earlier test program that uses nftw()
> instead. If "c" is provided in the second command line argument, it
> uses "FTW_CHDIR". Looking at the results, do you agree with my
> analysis?
> 
> $ cat n.c
> #define _GNU_SOURCE
> #define _XOPEN_SOURCE 500
> #include <ftw.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> 
> 
> static int
> displayFileInfo(const char *fpath, const struct stat *sb,
>                 int tflag, struct FTW *ftwbuf)
> {
>     printf("%-3s %2d %7lld   %-40s %d %s\n",
>         (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
>         (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
>         (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :
>         (tflag == FTW_SLN) ? "sln" : "???",
>         ftwbuf->level, (long long) sb->st_size,
>         fpath, ftwbuf->base, fpath + ftwbuf->base);
> #ifdef DO_CHDIR
>     /* Let's mess with the curent directory during the ftw() call,
>        to see what value is passed to 'pathname' in successive calls
>        to displayFileInfo() */
> 
>     chdir("..");
> #endif
>     system("pwd");
>     return 0;           /* To tell nftw() to continue */
> }
> 
> int
> main(int argc, char *argv[])
> {
>     int flags = 0;
> 
>     if (argc > 2 && strchr(argv[2], 'd') != NULL)
>         flags |= FTW_DEPTH;
>     if (argc > 2 && strchr(argv[2], 'p') != NULL)
>         flags |= FTW_PHYS;
>     if (argc > 2 && strchr(argv[2], 'c') != NULL)
>         flags |= FTW_CHDIR;
> 
>     if (nftw((argc < 2) ? "." : argv[1], displayFileInfo, 20, flags) == -1) {
>         perror("nftw");
>         exit(EXIT_FAILURE);
>     }
> 
>     exit(EXIT_SUCCESS);
> }
> 
> $ cc -o n n.c
> $ cd dir1
> /home/mtk/tlpi/dl/dir1
> $ find ../dir2
> .../dir2
> .../dir2/sub
> .../dir2/sub/d
> .../dir2/sub/b
> .../dir2/sub/c
> .../dir2/sub/a
> .../dir2/bbb
> $ ../n ../dir2 c
> d    0    4096   ../dir2                                  3 dir2
> /home/mtk/tlpi/dirs_links
> d    1    4096   ../dir2/sub                              8 sub
> /home/mtk/tlpi/dirs_links/dir2
> f    2       0   ../dir2/sub/d                            12 d
> /home/mtk/tlpi/dirs_links/dir2/sub
> f    2       0   ../dir2/sub/b                            12 b
> /home/mtk/tlpi/dirs_links/dir2/sub
> f    2       0   ../dir2/sub/c                            12 c
> /home/mtk/tlpi/dirs_links/dir2/sub
> f    2       0   ../dir2/sub/a                            12 a
> /home/mtk/tlpi/dirs_links/dir2/sub
> f    1      38   ../dir2/bbb                              8 bbb
> /home/mtk/tlpi/dirs_links/dir2
> $ ../n ../dir2
> d    0    4096   ../dir2                                  3 dir2
> /home/mtk/tlpi/dl/dir1
> d    1    4096   ../dir2/sub                              8 sub
> /home/mtk/tlpi/dl/dir1
> f    2       0   ../dir2/sub/d                            12 d
> /home/mtk/tlpi/dl/dir1
> f    2       0   ../dir2/sub/b                            12 b
> /home/mtk/tlpi/dl/dir1
> f    2       0   ../dir2/sub/c                            12 c
> /home/mtk/tlpi/dl/dir1
> f    2       0   ../dir2/sub/a                            12 a
> /home/mtk/tlpi/dl/dir1
> f    1      38   ../dir2/bbb                              8 bbb
> /home/mtk/tlpi/dl/dir1
> 
> Thanks,
> 
> Michael

-- 
·O·  Pierre Habouzit
··O                                                madcoder@debian.org
OOO                                                http://www.madism.org
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2010-06-24 20:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20100403201146.28880.qmail@sourceware.org>
     [not found] ` <20100403201146.28880.qmail-9JcytcrH/bA+uJoB2kUjGw@public.gmane.org>
     [not found]   ` <20100331172608.11459.madcoder-8fiUuRrzOP0dnm+yROfE0A@public.gmane.org>
2010-04-06  9:03     ` [Bug libc/11459] New: ftw doesn't work like documented (may be a documentation bug) Pierre Habouzit
     [not found]       ` <20100406090358.GP11893-FHnHQIk6zPswS4c7l5MyDw@public.gmane.org>
2010-05-24 17:41         ` Michael Kerrisk
     [not found]           ` <AANLkTim05fJpMXD1owEON-70WwxDUkxIvYIgkn7EfBEf-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-02 21:42             ` Pierre Habouzit
     [not found]               ` <20100602214257.GB21506-zi3NMfd+bKEdnm+yROfE0A@public.gmane.org>
2010-06-03  7:18                 ` Michael Kerrisk
     [not found]                   ` <AANLkTinhGzNB_dabQcan3c1nQuGwkaTIBAVZuRO2dJty-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-09 10:46                     ` Pierre Habouzit
     [not found]                       ` <20100609104629.GA2340-zi3NMfd+bKEdnm+yROfE0A@public.gmane.org>
2010-06-10  5:04                         ` Michael Kerrisk
     [not found]                           ` <AANLkTikWG4U2wWS6ccM98Mg32WNrVCu5QCmz46hQ7lCC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-24 20:12                             ` Pierre Habouzit [this message]
     [not found]                               ` <20100624201216.GB5357-zi3NMfd+bKEdnm+yROfE0A@public.gmane.org>
2010-06-25  4:53                                 ` Michael Kerrisk

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100624201216.GB5357@madism.org \
    --to=madcoder-zi3nmfd+bkednm+yrofe0a@public.gmane.org \
    --cc=drepper-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).