[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