On Thursday 08 November 2007 09:11, Paul Fox wrote:
> $ ls -l tmp
> total 1
> lrwxrwxrwx 1 pgf users 7 Nov  8 11:03 dangling -> no-file
> -rw-rw-r-- 1 pgf users 0 Nov  8 11:03 existingfile
> lrwxrwxrwx 1 pgf users 6 Nov  8 11:02 foobar -> foobar
>
> $ ./busybox testreadlink tmp/dangling
> xmalloc_readlink returns no-file
> xmalloc_readlink_follow returns tmp/no-file
>
> $ ./busybox testreadlink tmp/existingfile
> xmalloc_readlink returns (null)
> xmalloc_readlink_follow returns tmp/existingfile
>
> $ ./busybox testreadlink tmp/foobar
> xmalloc_readlink returns foobar
> xmalloc_readlink_follow returns (null)
>
> $ ./busybox testreadlink tmp/non-existingfile
> xmalloc_readlink returns (null)
> xmalloc_readlink_follow returns tmp/non-existingfile
>
>
> this seems like the right behavior to me.

to me too.

> /*
>  * this routine is not the same as realpath(), which
>  * canonicalizes the given path completely.  this routine only
>  * follows trailing symlinks until a real file is reached, and
>  * returns its name.  if the path ends in a dangling link, or if
>  * the target doesn't exist, the path is returned in any case.
>  * intermediate symlinks in the path are not expanded -- only
>  * those at the tail.
>  * a malloced char* is returned, which must be freed by the caller.
>  */
> char *xmalloc_follow_symlinks(const char *path)

I thought you are done and edited it in svn already, sorry.
I didn't want to collide.

> {
>       char *buf = NULL, *lpc, *linkpath;

No need to store NULL

>       int bufsize;
>       smallint looping = 0;
>
>       buf = strdup(path);

xstrdup

>       bufsize = strlen(path) + 1;
>
>       while(1) {
>               linkpath = xmalloc_readlink(buf);
>               if (!linkpath) {
>                       if (errno == EINVAL || errno == ENOENT)

I see. You added ENOENT. If it is the only new addition,
it seems ok to me.

>                               return buf;
>                       free(buf);
>                       return NULL;
>               }
>
>               if (looping++ > MAXSYMLINKS) {
>                       free(linkpath);
>                       free(buf);
>                       return NULL;
>               }
>
>               if (*linkpath == '/') {
>                       free(buf);
>                       bufsize = strlen(linkpath) + 1;
>                       buf = linkpath;
>               } else {
>                       bufsize += strlen(linkpath);
>                       buf = xrealloc(buf, bufsize);
>                       lpc = bb_get_last_path_component_strip(buf);
>                       strcpy(lpc, linkpath);
>                       free(linkpath);
>               }
>       }
>
> }


Thanks
--
vda
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to