Real path of soft links with missing target

maxxedev at gmail.com maxxedev at gmail.com
Wed Jul 20 18:19:20 UTC 2022


Ah, how about readlink[3]?

    #include <limits.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>

    int main(int argc, char** argv) {
     char* path = "foo-source";
     char resolved[PATH_MAX + 1] = {0};
     printf("%d\n", readlink(path, resolved, sizeof(resolved))); // 10 bytes
     printf("%d\n", errno); // 0
     printf("%s\n", resolved);   // "foo-target"
     return 0;
    }

Motivation is: how could one replicate "ls -l" functionality in Java?
"ls -l" does show the link target even if it's missing.

[3] https://pubs.opengroup.org/onlinepubs/009696699/functions/readlink.html


On Wed, Jul 20, 2022 at 10:41 AM Brian Burkhalter
<brian.burkhalter at oracle.com> wrote:
>
>
> On Jul 20, 2022, at 10:16 AM, maxxedev at gmail.com wrote:
>
>    #include <limits.h>
>    #include <stdlib.h>
>    #include <stdio.h>
>    #include <errno.h>
>
>    int main(int argc, char** argv) {
>        char* path = "foo-source";
>        char resolved[PATH_MAX + 1] = {0};
>        char* result = realpath(path, resolved);
>        printf("%d\n", result == NULL);  // 1
>        printf("%d\n", errno == ENOENT); // 1
>        printf("%s\n", resolved);   // "foo-target"
>        return 0;
>    }
>
>
> When I run the above code in /tmp/ on Ubuntu 22.04 as
>
> $ ln -s foo-target foo-source
> $ ./resolve
>
> it prints
>
> 1
> 1
> /tmp/foo-target
>
> As realpath(3) states
>
> “[If there is an error, ] it returns NULL, the contents of the array resolved_path are undefined, and errno is set to indicate the error.”
>
> I don’t think one can rely on resolved_path or the return value when there is an error so I don’t know what we could do here. That resolved_path ends up being the link seems like an artifact that one cannot count on.
>
> Brian
>
>
>


More information about the nio-dev mailing list