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... ;-/

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) [email protected]
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)
_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to