[PATCH 04/18] fs: implement stat

Roberto Nibali rnibali at gmail.com
Fri Aug 24 05:25:37 EDT 2012


Hi

> diff --git a/fs/fs.c b/fs/fs.c
> index a19e1f4..9f2e82c 100644
> --- a/fs/fs.c
> +++ b/fs/fs.c
> @@ -26,6 +26,7 @@
>  #include <errno.h>
>  #include <malloc.h>
>  #include <linux/stat.h>
> +#include <linux/err.h>
>  #include <fcntl.h>
>  #include <xfuncs.h>
>  #include <init.h>
> @@ -111,6 +112,60 @@ static int init_cwd(void)
>
>  postcore_initcall(init_cwd);
>
> +char *normalise_link(const char *pathname, const char* symlink)
> +{
> +       const char *buf = symlink;
> +       char *path_free, *path;
> +       char *absolute_path;
> +       int point = 0;
> +       int dir = 1;
> +       int len;
> +
> +       if (symlink[0] == '/')
> +               return strdup(symlink);
> +
> +       path = path_free = strdup(pathname);
> +
> +       while (*buf == '.' || *buf == '/') {
> +               if (*buf == '.') {
> +                       point++;
> +               } else if (*buf == '/') {
> +                       point = 0;
> +                       dir++;
> +               }
> +               if (point > 2) {
> +                       buf -= 2;
> +                       break;
> +               }
> +               buf++;
> +       }
> +
> +       if (dir) {
> +               while(dir) {
> +                       path = dirname(path);
> +                       dir--;
> +               }
> +       }
> +
> +       len = strlen(buf) + strlen(path) + 1;
> +       if (buf[0] != '/')
> +               len++;
> +
> +       absolute_path = calloc(sizeof(char), len);
> +
> +       if(!absolute_path)
> +               return NULL;
> +
> +       strcat(absolute_path, path);
> +       if (buf[0] != '/')
> +               strcat(absolute_path, "/");
> +       strcat(absolute_path, buf);

Not that it matters hugely here, but how about strlcat(3) and checking
the return value?

Cheers
Roberto



More information about the barebox mailing list