From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29266 invoked from network); 26 Mar 2008 16:25:53 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.2.4 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 26 Mar 2008 16:25:53 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 23718 invoked from network); 26 Mar 2008 16:25:49 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 26 Mar 2008 16:25:49 -0000 Received: (qmail 6855 invoked by alias); 26 Mar 2008 16:25:46 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 24751 Received: (qmail 6839 invoked from network); 26 Mar 2008 16:25:46 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 26 Mar 2008 16:25:46 -0000 Received: from puffy.raveland.org (puffy.raveland.org [195.200.166.230]) by bifrost.dotsrc.org (Postfix) with ESMTP id 98C3E8097826 for ; Wed, 26 Mar 2008 17:25:38 +0100 (CET) Received: from coredump.raveland.priv (bofh.pacwan.net [195.200.191.36]) by puffy.raveland.org (Postfix) with ESMTP id 755D1713464; Wed, 26 Mar 2008 17:25:37 +0100 (CET) Date: Wed, 26 Mar 2008 17:25:33 +0100 From: Pea To: Peter Stephenson Cc: Baptiste Daroussin , zsh-workers@sunsite.dk Subject: Re: _canonical_path not working on *BSD Message-ID: <20080326172533.0b587b55@coredump.raveland.priv> In-Reply-To: <200803261604.m2QG41Ke017772@news01.csr.com> References: <20080326114413.80713vrmznwpnyuc@bapt.selfip.org> <080326083638.ZM16858@torch.brasslantern.com> <200803261540.m2QFeJmm017381@news01.csr.com> <200803261604.m2QG41Ke017772@news01.csr.com> Organization: Raveland X-Mailer: Claws Mail 3.3.0 (GTK+ 2.12.7; i386-unknown-openbsd4.3) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: ClamAV 0.91.2/6396/Wed Mar 26 12:29:12 2008 on bifrost X-Virus-Status: Clean Le Wed, 26 Mar 2008 16:04:01 +0000, Peter Stephenson a =E9crit : > Peter Stephenson wrote: > > Bart Schaefer wrote: > > > On Mar 26, 11:44am, Baptiste Daroussin wrote: > > > } > > > } _canonical_path is not working on freebsd, it rely on readlink > > >=20 > > > Try this. I don't actually have any mount points that are symlink > > > targets so it's hard to test, but I think this is right: > > >=20 > > > -if (( ! $+commands[readlink] )); then > > > +if ! zmodload -F zsh/stat b:zstat 2>/dev/null; then > >=20 > > That's probably a better solution; it doesn't necessarily work on > > all systems, particularly if the shell is statically linked, but it > > should be at least as widely applicable as, and easier to test for > > than, anything involving readlink. >=20 > Hmm... sorry about all the traffic... actually, it still doesn't > guarantee to give a canonical path as "readlink -f" does, since it > doesn't check if the value returned is itself a symbolic link, and > also it returns empty instead of the original file if it wasn't a > link. We would need to do something like the following... if I've > correctly divined that the intention in both cases is that if a file > exists at all we should always use the name, but converted to the > canonical form. >=20 > Index: Completion/Unix/Type/_canonical_paths > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_canonical_paths,v > retrieving revision 1.1 > diff -u -r1.1 _canonical_paths > --- Completion/Unix/Type/_canonical_paths 28 May 2006 18:36:06 > -0000 1.1 +++ Completion/Unix/Type/_canonical_paths 26 > Mar 2008 15:58:52 -0000 @@ -27,18 +27,28 @@ > =20 > shift 2 > =20 > -if (( ! $+commands[readlink] )); then > +if ! zmodload -F zsh/stat b:zstat 2>/dev/null; then > _wanted "$tag" expl "$desc" compadd $__gopts $@ && ret=3D0 > return ret > fi > =20 > +typeset addfile newfile > typeset -a matches files > =20 > if (( $__opts[(I)-N] )); then > files=3D($@) > else > for __index in $@; do > - files+=3D$(readlink -qf $__index) > + addfile=3D$__index > + while true; do > + newfile=3D$(zstat +link $addfile) > + if [[ -n $newfile ]]; then > + addfile=3D$newfile > + else > + break > + fi > + done > + files+=3D($addfile) > done > fi > =20 > @@ -48,8 +58,18 @@ > expref=3D${~origpref} > [[ $origpref =3D=3D (|*/). ]] && rltrim=3D. > curpref=3D${${expref%$rltrim}:-./} > - canpref=3D$(readlink -qf $curpref) > - if [[ $? -eq 0 ]]; then > + if zstat $curpref >&/dev/null; then > + canpref=3D$curpref > + while true; do > + newfile=3D$(zstat +link $canpref) > + if [[ -n $newfile ]]; then > + canpref=3D$newfile > + else > + break > + fi > + done > + fi > + if [[ -n "$canpref" ]]; then > [[ $curpref =3D=3D */ && $canpref =3D=3D *[^/] ]] && canpref+=3D/ > canpref+=3D$rltrim > [[ $expref =3D=3D *[^/] && $canpref =3D=3D */ ]] && origpref+=3D/ >=20 >=20 This patch doesn't work on OpenBSD (-current @i386). umount [TAB] gives me: [pea@coredump:~]% umount _canonical_paths_add_paths:zstat:1: usr/src/sys: no such file or directory _canonical_paths_add_paths:zstat:1: usr/src/sys: no such file or directory=20 umount / /dev/sd0a /dev/svnd0a /home/pea