On Mon, Jul 25, 2005 at 12:19:00PM -0700, Bruce Korb wrote:
> Hmm.  Interesting problem.   The "realpath(3C)" documentation
> specifically references PATH_MAX:
> 
> > NAME
> >        realpath - return the canonicalized absolute pathname
> > 
> > SYNOPSIS
> >        #include <limits.h>
> >        #include <stdlib.h>
> >        char *realpath(const char *path, char *resolved_path);
> > [...]
> > ERRORS
> > [...]
> >        ENAMETOOLONG
> >               A component of a path name exceeded NAME_MAX
> >               characters,  or  an entire path name exceeded PATH_MAX
> >               characters.
> 
> and the code in question is only compiled in if "realpath" is known
> to be in the library.  And, yes, I know about the extended GNU doc:
> 
> > BUGS
> >        Never  use this function. It is broken by design since it is
> >        impossible to determine a suitable size for the output
> >        buffer.  According to POSIX a  buffer of size PATH_MAX
> >        suffices, but PATH_MAX need not be a defined constant, and
> >        may have to be obtained  using  pathconf().   And  asking
> >        pathconf() does not really help, since on the one hand POSIX
> >        warns that the result of pathconf() may be huge and
> >        unsuitable for mallocing  mem- ory.  And  on  the  other hand
> >        pathconf() may return -1 to signify that
> >        PATH_MAX is not bounded.
> 
> but since no viable alternative is suggested, it leaves one in a difficult
> spot.  

The GNU C library manual (as in, libc.info.gz) suggests using
canonicalize_file_name in chapter 14.5, "Symbolic Links":

Function: char * canonicalize_file_name (const char *NAME)

     The `canonicalize_file_name' function returns the absolute name of
     the file named by NAME which contains no `.', `..' components nor
     any repeated path separators (`/') or symlinks.  The result is
     passed back as the return value of the function in a block of
     memory allocated with `malloc'.  If the result is not used anymore
     the memory should be freed with a call to `free'.

     In any of the path components except the last one is missing the
     function returns a NULL pointer.  This is also what is returned if
     the length of the path reaches or exceeds `PATH_MAX' characters.
     In any case `errno' is set accordingly.

    `ENAMETOOLONG'
          The resulting path is too long.  This error only occurs on
          systems which have a limit on the file name length.

    `EACCES'
          At least one of the path components is not readable.

    `ENOENT'
          The input file name is empty.

    `ENOENT'
          At least one of the path components does not exist.

    `ELOOP'
          More than `MAXSYMLINKS' many symlinks have been followed.

     This function is a GNU extension and is declared in `stdlib.h'.

So you could perhaps use this function if available (i.e. on GNU/Linux
and GNU/Hurd), and realpath() otherwise.  I don't much about this
though, so maybe this is bad advise.


cheers,

Michael

-- 
Michael Banck
Debian Developer
[EMAIL PROTECTED]
http://www.advogato.org/person/mbanck/diary.html


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to