On Sat, 21 Sep 2013 18:45:15 +0200 Roland Mainz wrote:
> On Sat, Sep 21, 2013 at 3:33 PM, Glenn Fowler <[email protected]> wrote:
> > On Sat, 21 Sep 2013 08:51:38 +0200 Lionel Cons wrote:
> >> On 19 September 2013 18:53, Roland Mainz <[email protected]> wrote:
> >> > On Thu, Sep 19, 2013 at 6:08 PM, Glenn Fowler <[email protected]> 
> >> > wrote:
> >> >>
> >> >> can someone post urls for the man pages for
> >> >>         readlink(1)
> >> >>         realpath(1)
> >> >
> >> > 1. The relevant references:
> >> > The all-in-one manpage for busybox can be found here:
> >> > http://busybox.net/downloads/BusyBox.html
> >> >
> >> > FreeBSD readlink(1):
> >> > http://www.freebsd.org/cgi/man.cgi?query=readlink&apropos=0&sektion=1&manpath=FreeBSD+9.1-RELEASE&arch=default&format=html
> >> > FreeBSD realpath(1):
> >> > http://www.freebsd.org/cgi/man.cgi?query=realpath&apropos=0&sektion=1&manpath=FreeBSD+9.1-RELEASE&arch=default&format=html
> >
> > both man pages describe the operands as
> >         [ path ... ]
> >         [ file ... ]
> > but only the realpath says what happens if file is omitted (. is used)
> > neither say what happens if more than one path/file operand is specified
> > readlink annoyingly inverts -q/-v -- diagnostics are off by default -- 
> > *what other posix utility does that*
> >
> > so what does readlink do in silent mode when it is invoked with
> >         readlink is-a-symlink is-not-a-symlink is-another-symlink
> >
> > from the refs roland supplied the gnu readlink and realpath are very close 
> > modulo defaults
> > mainly readlink with no --canonicalize* options is in "readlink" mode, 
> > otherwise "realpath" mode
> > and the annoying one: readlink by default suppresses diagnostics
> >
> > so I need to know what happens on bsd and gnu for readlink and realpath for 
> > various combinations of
> > 0,1,2,3 path/file operands and within that various combinations of
> >         is-a-symlink is-not-a-symlink is-an-existing-path 
> > is-not-an-existing-path
> > in particular when there are multiple operands and an error occurs does the 
> > output have a blank line to mark the errors?

> Only realpath(1) supports multiple paths per invocation while
> readlink(1) only takes one link per invocation...

> > my intention is to provide one implementation of realpath with a union of 
> > the
> > ast --dirfd=fd + gnu readlink/realpath + bsd readlink/realpath options
> > and an additional --readlink option that puts it into "readlink" mode 
> > (operand is a symlink, diagnostics suppressed),
> > and a note that argv[0]=="*readlink" => --readlink

> Ahhgllll... IMO it would be easier (and cleaner... and easier to
> debug) to have two seperate utilities. I still haven't sorted out the
> sum(1) thing which provides almost all possible (hash-)sums with the
> slight twist that somewhere in the code is a small bug which makes it
> incompatible in the output to md5sum(1) ... please... just try to
> follow "KISS" and make two utilities from it (precedent: busybox(1)
> did the same...) ...

> > this will given us one implementation and one document to manage

> Just for the log:
> 1. FreeBSD readlink is available from
> http://ftp.FreeBSD.org/pub/FreeBSD/ports/local-distfiles/dd/readlink-20010616.tar.gz
> -- snip --
> $ sum -x sha512 ../readlink-20010616.tar.gz'
> a323c8afccdc25c8a63d97e0ed08674e7f63347c5910bcc453bf2baf87aa82ae1a63fb21e17ff5ab31a192a28c32946078d264620759d808c4ca4f775305b038
> readlink-20010616.tar.gz
> -- snip --

> 2. FreeBSD realpath(1) can be found here:
> http://svnweb.freebsd.org/base/head/bin/realpath/

> Took some searching to find them... it seems FreeBSD doesn't maintain
> an unified search engine to find source files across projects like
> OpenSolaris.org did... ;-(

> Here are the test results for "readlink" ... note that busybox has no -f 
> option:
> -- snip --
> $ readlink_freebsd bar
> foo
> $ busybox readlink bar
> foo
> $ readlink_freebsd . ; echo $?
> 1
> $ readlink_gnu . ; echo $?
> 1
> $ busybox readlink . ; echo $?
> 1
> $ readlink_freebsd -f bar
> /home/test001/tmp/readlink_test/readlink-20010616/foo
> $ readlink_gnu -f bar
> /home/test001/tmp/readlink_test/readlink-20010616/foo
> $ readlink_gnu -f .
> /home/test001/tmp/readlink_test/readlink-20010616
> $ readlink_freebsd -f .
> /home/test001/tmp/readlink_test/readlink-20010616
> $ readlink does_not_exist ; echo $?
> 1
> $ readlink_freebsd does_not_exist ; echo $?
> 1
> $ readlink -f does_not_exist ; echo $?
> /home/test001/tmp/readlink_test/readlink-20010616/does_not_exist
> 0
> $ readlink_freebsd -f does_not_exist ; echo $?
> /home/test001/tmp/readlink_test/readlink-20010616/does_not_exist
> 0
> -- snip --

> Quick dumb testscript for realpath(1):
> -- snip --
> typeset -a cmd=(
>     realpath_gnu
>     realpath_bsd
>     realpath_busybox
> )

> function realpath_gnu
> {
>     /usr/bin/realpath_gnu "$@"
> }
> function realpath_bsd
> {
>     /usr/bin/realpath_bsd "$@"
> }
> function realpath_busybox
> {
>     busybox realpath "$@"
> }

> ln -sf foo bar

> for cmd in "${cmd[@]}" ; do
>     for options in '.' "$PWD" 'bar' 'foo' 'no_such_file'; do
>         output="${ ${cmd} ${options} 2>&1 ; (( res=$?)) ;  }"
>         printf '# cmd=%q: options=%q output=%q, exit_code=%d\n' \
>             "${cmd}" \
>             "${options}" \
>             "${output}" "res"
>     done
> done

> -- snip --
> ... and the output is:
> -- snip --
> # cmd=realpath_gnu: options=.
> output=/home/test001/tmp/readlink_test/readlink-20010616, exit_code=0
> # cmd=realpath_gnu:
> options=/home/test001/tmp/readlink_test/readlink-20010616
> output=/home/test001/tmp/readlink_test/readlink-20010616, exit_code=0
> # cmd=realpath_gnu: options=bar
> output=/home/test001/tmp/readlink_test/readlink-20010616/foo,
> exit_code=0
> # cmd=realpath_gnu: options=foo
> output=/home/test001/tmp/readlink_test/readlink-20010616/foo,
> exit_code=0
> # cmd=realpath_gnu: options=no_such_file
> output=/home/test001/tmp/readlink_test/readlink-20010616/no_such_file,
> exit_code=0
> # cmd=realpath_bsd: options=.
> output=/home/test001/tmp/readlink_test/readlink-20010616, exit_code=0
> # cmd=realpath_bsd:
> options=/home/test001/tmp/readlink_test/readlink-20010616
> output=/home/test001/tmp/readlink_test/readlink-20010616, exit_code=0
> # cmd=realpath_bsd: options=bar
> output=/home/test001/tmp/readlink_test/readlink-20010616/foo,
> exit_code=0
> # cmd=realpath_bsd: options=foo
> output=/home/test001/tmp/readlink_test/readlink-20010616/foo,
> exit_code=0
> # cmd=realpath_bsd: options=no_such_file
> output=/home/test001/tmp/readlink_test/readlink-20010616/no_such_file,
> exit_code=0
> # cmd=realpath_busybox: options=.
> output=/home/test001/tmp/readlink_test/readlink-20010616, exit_code=0
> # cmd=realpath_busybox:
> options=/home/test001/tmp/readlink_test/readlink-20010616
> output=/home/test001/tmp/readlink_test/readlink-20010616, exit_code=0
> # cmd=realpath_busybox: options=bar
> output=/home/test001/tmp/readlink_test/readlink-20010616/foo,
> exit_code=0
> # cmd=realpath_busybox: options=foo
> output=/home/test001/tmp/readlink_test/readlink-20010616/foo,
> exit_code=0
> # cmd=realpath_busybox: options=no_such_file
> output=/home/test001/tmp/readlink_test/readlink-20010616/no_such_file,
> exit_code=0
> -- snip --

> I still need some time (mostly due to being sick (still twitching)) to
> come up with good testcases... ;-/

thanks for the tests
I won't be reading the other implementation sources
what happens with 0 operands and 2 operands
both man pages specify
        [ path ... ]
which implies 0 or more path args

_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to