Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Aug 2017 20:30:09 +0200
From:      Nikolaus Rath <Nikolaus@rath.org>
To:        freebsd-fs@freebsd.org
Subject:   Re: Can telldir() == 0 value be made special?
Message-ID:  <87lgmbfob2.fsf@vostro.rath.org>
In-Reply-To: <CAG6CVpVViqnbGuVn_JETBC5Q0NoYfC4VJK7iWjEfA7tFurQ2ag@mail.gmail.com> (Conrad Meyer's message of "Tue, 22 Aug 2017 07:42:36 -0700")
References:  <87bmn7kf3b.fsf@vostro.rath.org> <CAG6CVpVViqnbGuVn_JETBC5Q0NoYfC4VJK7iWjEfA7tFurQ2ag@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Aug 22 2017, Conrad Meyer <cem@freebsd.org> wrote:
> Hi Nikolaus,
>
> As you have surmised, DIR* seekpoints are created dynamically whenever
> requested by user's telldir() call:

Good to know, thanks!

> I believe we could special case zero without breaking ABI
> compatibility of correct programs.  Something like this:
>
> --- a/lib/libc/gen/telldir.c
> +++ b/lib/libc/gen/telldir.c
> @@ -70,6 +70,20 @@ telldir(DIR *dirp)
>                 }
>         }
>         if (lp =3D=3D NULL) {
> +               /* Create special zero telldir entry, similar to Linux */
> +               if (dirp->dd_td->td_loccnt =3D=3D 0 && dirp->dd_loc !=3D =
0) {
> +                       lp =3D malloc(sizeof(struct ddloc));
> +                       if (lp =3D=3D NULL) {
> +                               if (__isthreaded)
> +                                       _pthread_mutex_unlock(&dirp->dd_l=
ock);
> +                               return (-1);
> +                       }
> +                       lp->loc_index =3D dirp->dd_td->td_loccnt++;
> +                       lp->loc_seek =3D 0;
> +                       lp->loc_loc =3D 0;
> +                       LIST_INSERT_HEAD(&dirp->dd_td->td_locq, lp, loc_l=
qe);
> +               }
> +
>                 lp =3D malloc(sizeof(struct ddloc));
>                 if (lp =3D=3D NULL) {
>                         if (__isthreaded)
>
> I don't know if there are any downsides to special-casing zero like
> this, other than additional code complexity.

This seems a little more complex than I would have expected. Is this
maybe turning zero into a valid argument for seekdir() even if telldir()
has never been called?

That would be even better, but the minimal change that I need is just to
ensure that telldir() either (a) never returns zero, or (b) only returns
zero if called at the beginning of the stream.


Best,
-Nikolaus

--=20
GPG Fingerprint: ED31 791B 2C5C 1613 AF38 8B8A D113 FCAC 3C4E 599F

             =C2=BBTime flies like an arrow, fruit flies like a Banana.=C2=
=AB



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?87lgmbfob2.fsf>