fs: add symlink and readlink support
Subsystems (2)
v2 cover fs: add symlink and readlink support
HI,
v2: addres comments
please pull
The following changes since commit b77300ac6c6bbbc7eac774ff0076c7c05d39735f:
command/mount: add autodetection support (2012-08-21 18:53:00 +0800)
are available in the git repository at:
git://git.jcrosoft.org/barebox.git tags/fs-symlink
for you to fetch changes up to 4c04f687dc845afc9797d58885ab746f92ff7170:
defautenv: add support of symlink (2012-09-01 20:26:18 +0800)
----------------------------------------------------------------
fs: add symlink and readlink support
This patch series introduce the support of symlink and readlink at
1) vfs level
2) libc API
- symlink
- readlink
3) commands
- ln
- readlink
3) filesystem
- ramfs
- nfs
- envfs
----------------------------------------------------------------
Jean-Christophe PLAGNIOL-VILLARD (18):
fs: add readlink support
fs: rename stat to lstat as we implement lstat
fs: add symlink support
fs: implement stat
fs: open: add symlink support
fs: introduce get_mounted_path to get the path where a file is mounted
ramfs: add symlink and readlink support
nfs: add readlink support
test: add -L support to test if it's a symbolic link
command: add readlink support
command: add ln support
ls: add symlink support to -l
dirname: add -V option to return only path related to the mountpoint
recursive_action: add ACTION_FOLLOWLINKS support
envfs: introduce version major and minor
envfs: add support of variable inode size
envfs: add support of symlink
defautenv: add support of symlink
MAKEALL | 1 + commands/Kconfig | 10 +++ commands/Makefile | 2 + commands/dirname.c | 24 ++++++- commands/ln.c | 51 +++++++++++++++ commands/ls.c | 31 ++++++--- commands/readlink.c | 80 +++++++++++++++++++++++ commands/test.c | 11 +++- common/Makefile | 2 +- common/environment.c | 150 +++++++++++++++++++++++++++++++----------- fs/fs.c | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- fs/nfs.c | 86 ++++++++++++++++-------- fs/ramfs.c | 57 ++++++++++++++-- include/envfs.h | 15 ++++- include/fs.h | 12 ++++ include/libbb.h | 2 +- lib/recursive_action.c | 7 +- scripts/bareboxenv.c | 2 +- 18 files changed, 678 insertions(+), 99 deletions(-) create mode 100644 commands/ln.c create mode 100644 commands/readlink.c
Best Regards,
J.
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 1/18 fs: add readlink support
--- fs/fs.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 5 +++++ 2 files changed, 63 insertions(+)
fs/fs.c +58 -0
@@ -890,6 +890,64 @@ int close(int fd) }EXPORT_SYMBOL (close); +int readlink (const char *pathname,char *buf,size_t bufsiz) +{ +struct fs_driver_d *fsdrv; +struct fs_device_d *fsdev; +char *p =normalise_path (pathname); +char *freep = p; +int ret; +size_t len =0 ; +char tmp[PATH_MAX ]; + +memset (tmp,0 ,PATH_MAX ); + + buf[0 ] =0 ; + + ret =path_check_prereq (pathname,S_IFLNK ); +if (ret) + goto out; + + fsdev =get_fs_device_and_root_path (&p); +if (!fsdev) { + ret = -ENODEV ; + goto out; + } + fsdrv = fsdev->driver; + + len =min (bufsiz, (size_t )(PATH_MAX -1 )); +if (fsdrv->readlink) + ret = fsdrv->readlink (&fsdev->dev, p, tmp, len); +else + ret = -ENOSYS ; + +if (ret) + goto out; + +if (tmp[0 ] =='/' ) { +int l =strlen (fsdev->path); + +if (fsdev->path[l -1 ] =='/' ) + l--; + +if (l) { + len -= l; +strncat (buf, fsdev->path, l); + } + } + +strncat (buf, tmp, len); + +out: +free (freep); + +if (ret) + errno = -ret; + +return ret; +} +EXPORT_SYMBOL (readlink); +static int fs_match (struct device_d *dev,struct driver_d *drv) {return strcmp (dev->name, drv->name) ?-1 :0 ;
include/fs.h +5 -0
@@ -51,6 +51,9 @@ struct fs_driver_d {/* Truncate a file to given size */ int (*truncate)(struct device_d *dev,FILE *f,ulong size); +int (*readlink)(struct device_d *dev,const char *pathname,char *name, +size_t size); +int (*open)(struct device_d *dev,FILE *f,const char *pathname);int (*close)(struct device_d *dev,FILE *f);int (*read)(struct device_d *dev,FILE *f,void *buf,size_t size);
@@ -129,6 +132,8 @@ DIR *opendir(const char *pathname);struct dirent *readdir (DIR *dir);int closedir (DIR *dir); +int readlink (const char *path,char *buf,size_t bufsiz); +int mount (const char *device,const char *fsname,const char *path);int umount (const char *pathname);
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 2/18 fs: rename stat to lstat as we implement lstat
For compatibility put a inline on lstat for stat until we have the symlink support.
--- fs/fs.c | 10 +++++----- include/fs.h | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-)
fs/fs.c +5 -5
@@ -392,7 +392,7 @@ static int path_check_prereq(const char *path, unsigned int flags)unsigned int m;int ret =0 ; -if (stat (path, &s)) { +if (lstat (path, &s)) {if (flags &S_UB_DOES_NOT_EXIST ) goto out; ret = -ENOENT ;
@@ -434,7 +434,7 @@ static int parent_check_directory(const char *path)int ret;char *dir =dirname (xstrdup (path)); - ret =stat (dir, &s); + ret =lstat (dir, &s);free (dir);
@@ -523,7 +523,7 @@ int open(const char *pathname, int flags, ...)char *freep = path;int ret; - exist_err =stat (path, &s); + exist_err =lstat (path, &s);if (!exist_err &&S_ISDIR (s.st_mode)) { ret = -EISDIR ;
@@ -1216,7 +1216,7 @@ int closedir(DIR *dir) }EXPORT_SYMBOL (closedir); -int stat (const char *filename,struct stat *s) +int lstat (const char *filename,struct stat *s) {struct device_d *dev;struct fs_driver_d *fsdrv;
@@ -1255,7 +1255,7 @@ out:return ret; } -EXPORT_SYMBOL (stat); +EXPORT_SYMBOL (lstat);int mkdir (const char *pathname,mode_t mode) {
include/fs.h +5 -1
@@ -109,7 +109,11 @@ int creat(const char *pathname, mode_t mode);int unlink (const char *pathname);int close (int fd);int flush (int fd); -int stat (const char *filename,struct stat *s); +int lstat (const char *filename,struct stat *s); +static inline int stat (const char *filename,struct stat *s) +{ +return lstat (filename, s); +}int read (int fd,void *buf,size_t count);int ioctl (int fd,int request,void *buf);ssize_t write (int fd,const void *buf,size_t count);
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 3/18 fs: add symlink support
In reply to Jean-Christophe PLAGNIOL-VILLARDLimit it's support to existing file only
--- fs/fs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 3 +++ 2 files changed, 47 insertions(+)
fs/fs.c +44 -0
@@ -948,6 +948,50 @@ out: }EXPORT_SYMBOL (readlink); +int symlink (const char *pathname,const char *newpath) +{ +struct fs_driver_d *fsdrv; +struct fs_device_d *fsdev; +char *p =normalise_path (pathname); +int ret; +struct stat s; + +if (!stat (p, &s) &&S_ISDIR (s.st_mode)) { + ret = -ENOSYS ; + goto out; + } + +free (p); + p =normalise_path (newpath); + + ret =stat (p, &s); +if (!ret) { + ret = -EEXIST ; + goto out; + } + + fsdev =get_fs_device_and_root_path (&p); +if (!fsdev) { + ret = -ENODEV ; + goto out; + } + fsdrv = fsdev->driver; + +if (fsdrv->symlink) { + ret = fsdrv->symlink (&fsdev->dev, pathname, p); + }else { + ret = -EPERM ; + } + +out: +free (p); +if (ret) + errno = -ret; + +return ret; +} +EXPORT_SYMBOL (symlink); +static int fs_match (struct device_d *dev,struct driver_d *drv) {return strcmp (dev->name, drv->name) ?-1 :0 ;
include/fs.h +3 -0
@@ -51,6 +51,8 @@ struct fs_driver_d {/* Truncate a file to given size */ int (*truncate)(struct device_d *dev,FILE *f,ulong size); +int (*symlink)(struct device_d *dev,const char *pathname, +const char *newpath);int (*readlink)(struct device_d *dev,const char *pathname,char *name,size_t size);
@@ -136,6 +138,7 @@ DIR *opendir(const char *pathname);struct dirent *readdir (DIR *dir);int closedir (DIR *dir); +int symlink (const char *pathname,const char *newpath);int readlink (const char *path,char *buf,size_t bufsiz);int mount (const char *device,const char *fsname,const char *path);
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH 03/18] fs: add symlink support
Quoted 18 lines · Jean-Christophe PLAGNIOL-VILLARD
Limit it's support to existing file only
Signed-off-by Jean-Christophe PLAGNIOL-VILLARD <[email protected]>--- fs/fs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 3 +++ 2 files changed, 47 insertions(+)fs/fs.c +2
-0@@ -948,6 +948,50 @@ out: }EXPORT_SYMBOL (readlink); +int symlink (const char *pathname,const char *newpath) +{
fs/fs.c out: · line 962
Quoted 10 lines
fs/fs.c +10
-0+struct fs_driver_d *fsdrv; +struct fs_device_d *fsdev; +char *p =normalise_path (pathname); +int ret; +struct stat s; + +if (!stat (p, &s) &&S_ISDIR (s.st_mode)) { + ret = -ENOSYS ; + goto out; + }
newpath has to be checked for existence, not pathname.
Also I noticed that links to directories do not work.
Sascha
Signature · 9 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH 03/18] fs: add symlink support
Quoted 17 lines · Sascha Hauer
Quoted 16 lines · Jean-Christophe PLAGNIOL-VILLARD
Limit it's support to existing file only
Signed-off-by Jean-Christophe PLAGNIOL-VILLARD <[email protected]>--- fs/fs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 3 +++ 2 files changed, 47 insertions(+)fs/fs.c +0
-0@@ -948,6 +948,50 @@ out: }EXPORT_SYMBOL (readlink);
Quoted 14 lines
fs/fs.c out: · line 962
Quoted 12 lines
fs/fs.c +12
-0+int symlink (const char *pathname,const char *newpath) +{ +struct fs_driver_d *fsdrv; +struct fs_device_d *fsdev; +char *p =normalise_path (pathname); +int ret; +struct stat s; + +if (!stat (p, &s) &&S_ISDIR (s.st_mode)) { + ret = -ENOSYS ; + goto out; + }newpath has to be checked for existence, not pathname.
it's the case just after
1073 p = normalise_path(newpath);
1074
1075 ret = stat(p, &s);
1076 if (!ret) {
1077 ret = -EEXIST;
1078 goto out;
1079 }
Quoted 2 lines
Also I noticed that links to directories do not work.
yes this does not work that's why I return -ENOSYS if we try to create a symlink on a dir
Best Regards,
J.
Quoted 8 lines
Sascha
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 4/18 fs: implement stat
In reply to Jean-Christophe PLAGNIOL-VILLARDstat() stats the file pointed to by path and fills in buf.
--- fs/fs.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 6 ++-- 2 files changed, 104 insertions(+), 4 deletions(-)
fs/fs.c +102 -0
@@ -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,58 @@ 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++; + } + +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); + +free (path_free); + +return absolute_path; +} +char *normalise_path (const char *pathname) {char *path =xzalloc (strlen (pathname) +strlen (cwd) +2 );
@@ -512,6 +565,42 @@ out: }EXPORT_SYMBOL (unlink); +static char *realfile (const char *pathname,struct stat *s) +{ +char *path =normalise_path (pathname); +int ret; + + ret =lstat (path, s); +if (ret) + goto out; + +if (S_ISLNK (s->st_mode)) { +char tmp[PATH_MAX ]; +char *new_path; + +memset (tmp,0 ,PATH_MAX ); + + ret =readlink (path, tmp,PATH_MAX -1 ); +if (ret <0 ) + goto out; + + new_path =normalise_link (path, tmp); +free (path); +if (!new_path) +return ERR_PTR (-ENOMEM ); + path = new_path; + + ret =lstat (path, s); + } + +if (!ret) +return path; + +out: +free (path); +return ERR_PTR (ret); +} +int open (const char *pathname,int flags, ...) {struct fs_device_d *fsdev;
@@ -1260,6 +1349,19 @@ int closedir(DIR *dir) }EXPORT_SYMBOL (closedir); +int stat (const char *filename,struct stat *s) +{ +char *f; + + f =realfile (filename, s); +if (IS_ERR (f)) +return PTR_ERR (f); + +free (f); +return 0 ; +} +EXPORT_SYMBOL (stat); +int lstat (const char *filename,struct stat *s) {struct device_d *dev;
include/fs.h +2 -4
@@ -112,10 +112,7 @@ int unlink(const char *pathname);int close (int fd);int flush (int fd);int lstat (const char *filename,struct stat *s); -static inline int stat (const char *filename,struct stat *s) -{ -return lstat (filename, s); -} +int stat (const char *filename,struct stat *s);int read (int fd,void *buf,size_t count);int ioctl (int fd,int request,void *buf);ssize_t write (int fd,const void *buf,size_t count);
@@ -174,6 +171,7 @@ void *read_file(const char *filename, size_t *size);* of "..", "." and double slashes. The returned string must be freed wit free(). */ char *normalise_path (const char *path); +char *normalise_link (const char *pathname,const char * symlink);/* Register a new filesystem driver */ int register_fs_driver (struct fs_driver_d *fsdrv);
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH 04/18] fs: implement stat
Quoted 27 lines · Jean-Christophe PLAGNIOL-VILLARD
stat()stats the file pointed to by path and fills in buf.Signed-off-by Jean-Christophe PLAGNIOL-VILLARD <[email protected]>--- fs/fs.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 6 ++-- 2 files changed, 104 insertions(+), 4 deletions(-)fs/fs.c +4
-0@@ -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,58 @@ static int init_cwd(void)postcore_initcall (init_cwd); +char *normalise_link (const char *pathname,const char *symlink) +{ +const char *buf = symlink;
fs/fs.c static int init_cwd(void) · line 127
Quoted 10 lines
fs/fs.c +10
-0+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);
This is not used...
Quoted 5 lines
fs/fs.c +5
-0+ +while (*buf =='.' || *buf =='/' ) { +if (*buf =='.' ) { + point++; + }else if (*buf =='/' ) {
fs/fs.c static int init_cwd(void) · line 142
Quoted 10 lines
fs/fs.c +10
-0+ point =0 ; + dir++; + } +if (point >2 ) { + buf -=2 ; +break ; + } + buf++; + } +
...until here, so please move the allocation to here.
And as said before, either use xstrdup or check the return value.
fs/fs.c static int init_cwd(void) · line 155
Quoted 13 lines
fs/fs.c +13
-0+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 ;
You lose the allocation of strdup(pathname) here.
Quoted 15 lines
fs/fs.c +11
-0+ +strcat (absolute_path, path); +if (buf[0 ] !='/' ) +strcat (absolute_path,"/" ); +strcat (absolute_path, buf); + +free (path_free); + +return absolute_path; +} +char *normalise_path (const char *pathname) {char *path =xzalloc (strlen (pathname) +strlen (cwd) +2 );
fs/fs.c out: · line 568
Quoted 4 lines
fs/fs.c +1
-0@@ -512,6 +565,42 @@ out: }EXPORT_SYMBOL (unlink); +static char *realfile (const char *pathname,struct stat *s)
static char *realfile
Quoted 28 lines
fs/fs.c +28
-0+{ +char *path =normalise_path (pathname); +int ret; + + ret =lstat (path, s); +if (ret) + goto out; + +if (S_ISLNK (s->st_mode)) { +char tmp[PATH_MAX ]; +char *new_path; + +memset (tmp,0 ,PATH_MAX ); + + ret =readlink (path, tmp,PATH_MAX -1 ); +if (ret <0 ) + goto out; + + new_path =normalise_link (path, tmp); +free (path); +if (!new_path) +return ERR_PTR (-ENOMEM ); + path = new_path; + + ret =lstat (path, s); + } + +if (!ret)
fs/fs.c out: · line 606
Quoted 10 lines
fs/fs.c +7
-0+return path; + +out: +free (path); +return ERR_PTR (ret); +} +int open (const char *pathname,int flags, ...) {struct fs_device_d *fsdev;
Sascha
Signature · 9 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 5/18 fs: open: add symlink support
In reply to Jean-Christophe PLAGNIOL-VILLARD--- fs/fs.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
fs/fs.c +11 -4
@@ -606,13 +606,20 @@ int open(const char *pathname, int flags, ...)struct fs_device_d *fsdev;struct fs_driver_d *fsdrv;FILE *f; -int exist_err; +int exist_err =0 ;struct stat s; -char *path =normalise_path (pathname); -char *freep = path; +char *path; +char *freep;int ret; - exist_err =lstat (path, &s); + path =realfile (pathname, &s); + +if (IS_ERR (path)) { + exist_err =PTR_ERR (path); + path =normalise_path (pathname); + } + + freep = path;if (!exist_err &&S_ISDIR (s.st_mode)) { ret = -EISDIR ;
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 6/18 fs: introduce get_mounted_path to get the path where a file is mounted
In reply to Jean-Christophe PLAGNIOL-VILLARD--- fs/fs.c | 9 +++++++++ include/fs.h | 2 ++ 2 files changed, 11 insertions(+)
fs/fs.c +9 -0
@@ -240,6 +240,15 @@ static struct fs_device_d *get_fsdevice_by_path(const char *path)return fs_dev_root; } +char *get_mounted_path (const char *path) +{ +struct fs_device_d *fdev; + + fdev =get_fsdevice_by_path (path); + +return fdev->path; +} +static FILE files[MAX_FILES ];static FILE *get_file (void )
include/fs.h +2 -0
@@ -173,6 +173,8 @@ void *read_file(const char *filename, size_t *size);char *normalise_path (const char *path);char *normalise_link (const char *pathname,const char * symlink); +char *get_mounted_path (const char *path); +/* Register a new filesystem driver */ int register_fs_driver (struct fs_driver_d *fsdrv);
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 7/18 ramfs: add symlink and readlink support
In reply to Jean-Christophe PLAGNIOL-VILLARD--- fs/ramfs.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-)
fs/ramfs.c +52 -5
@@ -42,6 +42,7 @@ struct ramfs_inode {struct ramfs_inode *parent;struct ramfs_inode *next;struct ramfs_inode *child; +char *symlink;ulong mode;struct handle_d *handle;
@@ -176,6 +177,7 @@ static void ramfs_put_inode(struct ramfs_inode *node) data = tmp; } +free (node->symlink);free (node->name);free (node); }
@@ -212,18 +214,36 @@ static struct ramfs_inode* node_insert(struct ramfs_inode *parent_node, const ch/* ---------------------------------------------------------------*/ -static int ramfs_create (struct device_d *dev,const char *pathname,mode_t mode) +static int __ramfs_create (struct device_d *dev,const char *pathname, +mode_t mode,const char *symlink) {struct ramfs_priv *priv = dev->priv;struct ramfs_inode *node;char *file; node =rlookup_parent (priv, pathname, &file); -if (node) { -node_insert (node, file, mode); +if (!node) +return -ENOENT ; + + node =node_insert (node, file, mode); +if (!node) +return -ENOMEM ; + +if (!symlink)return 0 ; + + node->symlink =strdup (symlink); +if (!node->symlink) { +ramfs_put_inode (node); +return -ENOMEM ; } -return -ENOENT ; + +return 0 ; +} + +static int ramfs_create (struct device_d *dev,const char *pathname,mode_t mode) +{ +return __ramfs_create (dev, pathname, mode,NULL ); }static int ramfs_unlink (struct device_d *dev,const char *pathname)
@@ -532,12 +552,37 @@ static int ramfs_stat(struct device_d *dev, const char *filename, struct stat *sif (!node)return -ENOENT ; - s->st_size = node->size; + s->st_size = node->symlink ?strlen (node->symlink) : node->size; s->st_mode = node->mode;return 0 ; } +static int ramfs_symlink (struct device_d *dev,const char *pathname, +const char *newpath) +{ +mode_t mode =S_IFLNK |S_IRWXU |S_IRWXG |S_IRWXO ; + +return __ramfs_create (dev, newpath, mode, pathname); +} + +static int ramfs_readlink (struct device_d *dev,const char *pathname, +char *buf,size_t bufsiz) +{ +struct ramfs_priv *priv = dev->priv; +struct ramfs_inode *node =rlookup (priv, pathname); +int len; + +if (!node || !node->symlink) +return -ENOENT ; + + len =min (bufsiz,strlen (node->symlink)); + +memcpy (buf, node->symlink, len); + +return 0 ; +} +static int ramfs_probe (struct device_d *dev) {struct ramfs_inode *n;
@@ -584,6 +629,8 @@ static struct fs_driver_d ramfs_driver = { .readdir = ramfs_readdir, .closedir = ramfs_closedir, .stat = ramfs_stat, + .symlink = ramfs_symlink, + .readlink = ramfs_readlink, .flags = FS_DRIVER_NO_DEV, .drv = { .probe = ramfs_probe,
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 8/18 nfs: add readlink support
In reply to Jean-Christophe PLAGNIOL-VILLARD--- MAKEALL | 1 + fs/nfs.c | 86 ++++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 59 insertions(+), 28 deletions(-)
MAKEALL +1 -0
@@ -264,3 +264,4 @@ then else do_build_target ${ARCH} $1 fi +exit $nb_errors
fs/nfs.c +58 -28
104 lines not on this page · raw message
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 9/18 test: add -L support to test if it's a symbolic link
In reply to Jean-Christophe PLAGNIOL-VILLARD--- commands/test.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
commands/test.c +9 -2
@@ -44,6 +44,7 @@ typedef enum {OPT_FILE ,OPT_EXISTS ,OPT_MAX , +OPT_SYMBOLIC_LINK , } test_opts; static char *test_options[] = {
@@ -62,6 +63,7 @@ static char *test_options[] = { [OPT_FILE] = "-f", [OPT_DIRECTORY] = "-d", [OPT_EXISTS] = "-e", + [OPT_SYMBOLIC_LINK] = "-L", };static int parse_opt (const char *opt)
@@ -140,9 +142,10 @@ static int do_test(int argc, char *argv[])case OPT_FILE :case OPT_DIRECTORY :case OPT_EXISTS : +case OPT_SYMBOLIC_LINK : adv =2 ;if (ap[1 ] && *ap[1 ] !=']' &&strlen (ap[1 ])) { - expr =stat (ap[1 ], &statbuf); + expr = (opt ==OPT_SYMBOLIC_LINK ? lstat : stat)(ap[1 ], &statbuf);if (expr <0 ) { expr =0 ;break ;
@@ -160,6 +163,10 @@ static int do_test(int argc, char *argv[]) expr =1 ;break ; } +if (opt ==OPT_SYMBOLIC_LINK &&S_ISLNK (statbuf.st_mode)) { + expr =1 ; +break ; + } }break ;
@@ -224,7 +231,7 @@ static const char *test_aliases[] = { "[", NULL};static const __maybe_unused char cmd_test_help[] ="Usage: test [OPTIONS]\n" -"options: !, =, !=, -eq, -ne, -ge, -gt, -le, -lt, -o, -a, -z, -n, -d, -e, -f\n" +"options: !, =, !=, -eq, -ne, -ge, -gt, -le, -lt, -o, -a, -z, -n, -d, -e, -f, -L\n" "see 'man test' on your PC for more information.\n" ;static const __maybe_unused char cmd_test_usage[] ="minimal test like /bin/sh" ;
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 10/18 command: add readlink support
In reply to Jean-Christophe PLAGNIOL-VILLARD--- commands/Kconfig | 6 ++++ commands/Makefile | 1 + commands/readlink.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 commands/readlink.c
commands/Kconfig +6 -0
@@ -220,6 +220,12 @@ config CMD_DIRNAME Strip last component of file name and store the result in a environment variable +config CMD_READLINK + tristate + prompt "readlink" + help + read value of a symbolic link + endmenu menu "console "
commands/Makefile +1 -0
@@ -72,3 +72,4 @@ obj-$(CONFIG_CMD_AUTOMOUNT) += automount.o obj-$(CONFIG_CMD_GLOBAL) += global.o obj-$(CONFIG_CMD_BASENAME) += basename.o obj-$(CONFIG_CMD_DIRNAME) += dirname.o +obj-$(CONFIG_CMD_READLINK) += readlink.o
commands/readlink.c new file +80 -0
80 lines not on this page · raw message
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 11/18 command: add ln support
In reply to Jean-Christophe PLAGNIOL-VILLARD--- commands/Kconfig | 4 ++++ commands/Makefile | 1 + commands/ln.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 commands/ln.c
commands/Kconfig +4 -0
@@ -57,6 +57,10 @@ config CMD_READLINE tristate prompt "readline" +config CMD_LN + tristate + prompt "ln" + config CMD_TRUE tristate default y
commands/Makefile +1 -0
@@ -73,3 +73,4 @@ obj-$(CONFIG_CMD_GLOBAL) += global.o obj-$(CONFIG_CMD_BASENAME) += basename.o obj-$(CONFIG_CMD_DIRNAME) += dirname.o obj-$(CONFIG_CMD_READLINK) += readlink.o +obj-$(CONFIG_CMD_LN) += ln.o
commands/ln.c new file +51 -0
51 lines not on this page · raw message
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 12/18 ls: add symlink support to -l
In reply to Jean-Christophe PLAGNIOL-VILLARDbarebox:/ ls -l /env/init.d/
drwxrwxrwx 0 .
drwxrwxrwx 0 ..
lrwxrwxrwx 11 net -> ../boot/net
--- commands/ls.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-)
commands/ls.c +21 -10
@@ -29,13 +29,24 @@#include <getopt.h> #include <stringlist.h> -static void ls_one (const char *path,struct stat *s) +static void ls_one (const char *path,const char * fullname,struct stat *s) {char modestr[11 ];unsigned int namelen =strlen (path);mkmodestr (s->st_mode, modestr); -printf ("%s %10llu %*.*s\n" , modestr, s->st_size, namelen, namelen, path); +printf ("%s %10llu %*.*s" , modestr, s->st_size, namelen, namelen, path); + +if (S_ISLNK (s->st_mode)) { +char realname[PATH_MAX ]; + +memset (realname,0 ,PATH_MAX ); + +if (readlink (fullname, realname,PATH_MAX -1 ) >=0 ) +printf (" -> %s" , realname); + } + +puts ("\n" ); }int ls (const char *path,ulong flags)
@@ -48,14 +59,14 @@ int ls(const char *path, ulong flags)string_list_init (&sl); -if (stat (path, &s)) +if (lstat (path, &s))return -errno;if (flags &LS_SHOWARG && s.st_mode &S_IFDIR )printf ("%s:\n" , path);if (!(s.st_mode &S_IFDIR )) { -ls_one (path, &s); +ls_one (path, path, &s);return 0 ; }
@@ -65,12 +76,12 @@ int ls(const char *path, ulong flags)while ((d =readdir (dir))) {sprintf (tmp,"%s/%s" , path, d->d_name); -if (stat (tmp, &s)) +if (lstat (tmp, &s)) goto out;if (flags &LS_COLUMN )string_list_add_sorted (&sl, d->d_name);else -ls_one (d->d_name, &s); +ls_one (d->d_name, tmp, &s); }closedir (dir);
@@ -97,7 +108,7 @@ int ls(const char *path, ulong flags)continue ;sprintf (tmp,"%s/%s" , path, d->d_name); -if (stat (tmp, &s)) +if (lstat (tmp, &s)) goto out;if (s.st_mode &S_IFDIR ) {char *norm =normalise_path (tmp);
@@ -146,7 +157,7 @@ static int do_ls(int argc, char *argv[])/* first pass: all files */ while (o < argc) { - ret =stat (argv[o], &s); + ret =lstat (argv[o], &s);if (ret) {printf ("%s: %s: %s\n" , argv[0 ], argv[o],errno_str ());
@@ -158,7 +169,7 @@ static int do_ls(int argc, char *argv[])if (flags &LS_COLUMN )string_list_add_sorted (&sl, argv[o]);else -ls_one (argv[o], &s); +ls_one (argv[o], argv[o], &s); } o++;
@@ -173,7 +184,7 @@ static int do_ls(int argc, char *argv[])/* second pass: directories */ while (o < argc) { - ret =stat (argv[o], &s); + ret =lstat (argv[o], &s);if (ret) { o++;continue ;
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 13/18 dirname: add -V option to return only path related to the mountpoint
In reply to Jean-Christophe PLAGNIOL-VILLARD--- commands/dirname.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-)
commands/dirname.c +21 -3
@@ -24,20 +24,38 @@#include <command.h> #include <libgen.h> #include <environment.h> +#include <fs.h> +#include <getopt.h> static int do_dirname (int argc,char *argv[]) { -if (argc !=3 ) +int opt; +int path_fs =0 ; +int len =0 ; + +while ((opt =getopt (argc, argv,"V" )) >0 ) { +switch (opt) { +case 'V' : + path_fs =1 ; +break ; + } + } + +if (argc < optind +2 )return COMMAND_ERROR_USAGE ; -setenv (argv[2 ],dirname (argv[1 ])); +if (path_fs) + len =strlen (get_mounted_path (argv[optind])); + +setenv (argv[optind +1 ],dirname (argv[optind]) + len);return 0 ; } BAREBOX_CMD_HELP_START(dirname) -BAREBOX_CMD_HELP_USAGE("dirname NAME DIRNAME\n") +BAREBOX_CMD_HELP_USAGE("dirname [-V] NAME DIRNAME\n") BAREBOX_CMD_HELP_SHORT("strip last componext of NAME and store into $DIRNAME\n") +BAREBOX_CMD_HELP_SHORT("-V return the path relative to the mountpoint.\n")BAREBOX_CMD_HELP_END BAREBOX_CMD_START (dirname )
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 14/18 recursive_action: add ACTION_FOLLOWLINKS support
In reply to Jean-Christophe PLAGNIOL-VILLARDthis is need to support symlink in envfs
--- include/libbb.h | 2 +- lib/recursive_action.c | 7 ++++++- scripts/bareboxenv.c | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-)
include/libbb.h +1 -1
@@ -14,7 +14,7 @@ char* last_char_is(const char *s, int c);enum {ACTION_RECURSE = (1 <<0 ), -/* ACTION_FOLLOWLINKS = (1 << 1), - unused */ +ACTION_FOLLOWLINKS = (1 <<1 ),ACTION_DEPTHFIRST = (1 <<2 ),/*ACTION_REVERSE = (1 << 3), - unused */ };
lib/recursive_action.c +6 -1
@@ -54,14 +54,19 @@ int recursive_action(const char *fileName, const unsigned depth) {struct stat statbuf; +unsigned follow;int status;DIR *dir;struct dirent *next;if (!fileAction) fileAction = true_action;if (!dirAction) dirAction = true_action; - status =stat (fileName, &statbuf); + follow =ACTION_FOLLOWLINKS ; +if (depth ==0 ) + follow =ACTION_FOLLOWLINKS ; + follow &= flags; + status = (follow ? stat : lstat)(fileName, &statbuf);if (status <0 ) {#ifdef DEBUG_RECURS_ACTION bb_error_msg("status=%d followLinks=%d TRUE=%d",
scripts/bareboxenv.c +1 -1
@@ -73,7 +73,7 @@ char* last_char_is(const char *s, int c)enum {ACTION_RECURSE = (1 <<0 ), -/* ACTION_FOLLOWLINKS = (1 << 1), - unused */ +ACTION_FOLLOWLINKS = (1 <<1 ),ACTION_DEPTHFIRST = (1 <<2 ),/*ACTION_REVERSE = (1 << 3), - unused */ };
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 15/18 envfs: introduce version major and minor
In reply to Jean-Christophe PLAGNIOL-VILLARDthey are store in the super block at byte 16th and 17th.
set the verison at 0.1
--- common/environment.c | 2 ++ include/envfs.h | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-)
common/environment.c +2 -0
@@ -125,6 +125,8 @@ int envfs_save(char *filename, char *dirname) super = (struct envfs_super *)buf; super->magic =ENVFS_32 (ENVFS_MAGIC ); + super->major =ENVFS_MAJOR ; + super->minor =ENVFS_MINOR ; super->size =ENVFS_32 (size);/* second pass: copy files to buffer */
include/envfs.h +6 -1
@@ -5,6 +5,9 @@#include <asm/byteorder.h> #endif +#define ENVFS_MAJOR 0 +#define ENVFS_MINOR 1 +#define ENVFS_MAGIC 0x798fba79/* some random number */ #define ENVFS_INODE_MAGIC 0x67a8c78d#define ENVFS_END_MAGIC 0x6a87d6cd
@@ -29,8 +32,10 @@ struct envfs_super {uint32_t priority;uint32_t crc;/* crc for the data */ uint32_t size;/* size of data */ +uint8_t major;/* major */ +uint8_t minor;/* minor */ +uint16_t future;/* reserved for future use */ uint32_t flags;/* feature flags */ -uint32_t future;/* reserved for future use */ uint32_t sb_crc;/* crc for the superblock */ };
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 16/18 envfs: add support of variable inode size
In reply to Jean-Christophe PLAGNIOL-VILLARDIntroduce a struct envfs_inode_end with more data.
Today this will just containt the file mode to be able to add the symlink support.
But this is compatible with the previous envfs version as they will do not care about the extra as the previous version is just reading the filename and then consume the extra data without using them.
Increase the envfs version to 1.0
--- common/environment.c | 53 ++++++++++++++++++++++++++++++++++++++------------ include/envfs.h | 12 +++++++++--- 2 files changed, 50 insertions(+), 15 deletions(-)
common/environment.c +41 -12
@@ -53,6 +53,7 @@ int file_size_action(const char *filename, struct stat *statbuf, data->writep +=sizeof (struct envfs_inode ); data->writep +=PAD4 (strlen (filename) +1 -strlen (data->base)); + data->writep +=sizeof (struct envfs_inode_end ); data->writep +=PAD4 (statbuf->st_size);return 1 ; }
@@ -62,6 +63,7 @@ int file_save_action(const char *filename, struct stat *statbuf, {struct action_data *data = userdata;struct envfs_inode *inode; +struct envfs_inode_end *inode_end;int fd;int namelen =strlen (filename) +1 -strlen (data->base);
@@ -70,12 +72,16 @@ int file_save_action(const char *filename, struct stat *statbuf, inode = (struct envfs_inode *)data->writep; inode->magic =ENVFS_32 (ENVFS_INODE_MAGIC ); - inode->namelen =ENVFS_32 (namelen); + inode->headerlen =ENVFS_32 (PAD4 (namelen +sizeof (struct envfs_inode_end ))); inode->size =ENVFS_32 (statbuf->st_size); data->writep +=sizeof (struct envfs_inode );strcpy (data->writep, filename +strlen (data->base)); data->writep +=PAD4 (namelen); + inode_end = (struct envfs_inode_end *)data->writep; + data->writep +=sizeof (struct envfs_inode_end ); + inode_end->magic =ENVFS_32 (ENVFS_INODE_END_MAGIC ); + inode_end->mode =ENVFS_32 (S_IRWXU |S_IRWXG |S_IRWXO ); fd =open (filename,O_RDONLY );if (fd <0 ) {
@@ -176,8 +182,13 @@ int envfs_load(char *filename, char *dir)int envfd;int fd, ret =0 ;char *str, *tmp; -int namelen_full; +int headerlen_full;unsigned long size; +/* for envfs < 1.0 */ +struct envfs_inode_end inode_end_dummy; + + inode_end_dummy.mode =ENVFS_32 (S_IRWXU |S_IRWXG |S_IRWXO ); + inode_end_dummy.magic =ENVFS_32 (ENVFS_INODE_END_MAGIC ); envfd =open (filename,O_RDONLY );if (envfd <0 ) {
@@ -223,11 +234,18 @@ int envfs_load(char *filename, char *dir) goto out; } +if (super.major <ENVFS_MAJOR ) +printf ("envfs version %d.%d loaded into %d.%d\n" , + super.major, super.minor, +ENVFS_MAJOR ,ENVFS_MINOR ); +while (size) {struct envfs_inode *inode; -uint32_t inode_size, inode_namelen; +struct envfs_inode_end *inode_end; +uint32_t inode_size, inode_headerlen, namelen; inode = (struct envfs_inode *)buf; + buf +=sizeof (struct envfs_inode );if (ENVFS_32 (inode->magic) !=ENVFS_INODE_MAGIC ) {printf ("envfs: wrong magic on %s\n" , filename);
@@ -235,16 +253,30 @@ int envfs_load(char *filename, char *dir) goto out; } inode_size =ENVFS_32 (inode->size); - inode_namelen =ENVFS_32 (inode->namelen); + inode_headerlen =ENVFS_32 (inode->headerlen); + namelen =strlen (inode->data) +1 ; +if (super.major <1 ) + inode_end = &inode_end_dummy; +else + inode_end = (struct envfs_inode_end *)(buf +PAD4 (namelen)); -debug ("loading %s size %d namelen %d\n" , inode->data, - inode_size, inode_namelen); +debug ("loading %s size %d namelen %d headerlen %d\n" , inode->data, + inode_size, namelen, inode_headerlen); str =concat_path_file (dir, inode->data); tmp =strdup (str);make_directory (dirname (tmp));free (tmp); + headerlen_full =PAD4 (inode_headerlen); + buf += headerlen_full; + +if (ENVFS_32 (inode_end->magic) !=ENVFS_INODE_END_MAGIC ) { +printf ("envfs: wrong inode_end_magic on %s\n" , filename); + ret = -EIO ; + goto out; + } + fd =open (str,O_WRONLY |O_CREAT |O_TRUNC ,0644 );free (str);if (fd <0 ) {
@@ -253,9 +285,7 @@ int envfs_load(char *filename, char *dir) goto out; } - namelen_full =PAD4 (inode_namelen); - ret =write (fd, buf + namelen_full +sizeof (struct envfs_inode ), - inode_size); + ret =write (fd, buf, inode_size);if (ret < inode_size) {perror ("write" ); ret = -errno;
@@ -264,9 +294,8 @@ int envfs_load(char *filename, char *dir) }close (fd); - buf +=PAD4 (inode_namelen) +PAD4 (inode_size) + -sizeof (struct envfs_inode ); - size -=PAD4 (inode_namelen) +PAD4 (inode_size) + + buf +=PAD4 (inode_size); + size -= headerlen_full +PAD4 (inode_size) +sizeof (struct envfs_inode ); }
include/envfs.h +9 -3
@@ -5,18 +5,19 @@#include <asm/byteorder.h> #endif -#define ENVFS_MAJOR 0 -#define ENVFS_MINOR 1 +#define ENVFS_MAJOR 1 +#define ENVFS_MINOR 0#define ENVFS_MAGIC 0x798fba79/* some random number */ #define ENVFS_INODE_MAGIC 0x67a8c78d +#define ENVFS_INODE_END_MAGIC 0x68a8c78d#define ENVFS_END_MAGIC 0x6a87d6cd#define ENVFS_SIGNATURE "barebox envfs"struct envfs_inode {uint32_t magic;/* ENVFS_INODE_MAGIC */ uint32_t size;/* data size in bytes */ -uint32_t namelen;/* The length of the filename _including_ a trailing 0 */ +uint32_t headerlen;/* The length of the filename _including_ a trailing 0 */ char data[0 ];/* The filename (zero terminated) + padding to 4 byte boundary * followed by the data for this inode. * The next inode follows after the data + padding to 4 byte
@@ -24,6 +25,11 @@ struct envfs_inode {*/ }; +struct envfs_inode_end { +uint32_t magic;/* ENVFS_INODE_END_MAGIC */ +uint32_t mode;/* file mode */ +}; +/* * Superblock information at the beginning of the FS. */
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 17/18 envfs: add support of symlink
In reply to Jean-Christophe PLAGNIOL-VILLARD--- common/environment.c | 103 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 30 deletions(-)
common/environment.c +73 -30
@@ -54,7 +54,20 @@ int file_size_action(const char *filename, struct stat *statbuf, data->writep +=sizeof (struct envfs_inode ); data->writep +=PAD4 (strlen (filename) +1 -strlen (data->base)); data->writep +=sizeof (struct envfs_inode_end ); - data->writep +=PAD4 (statbuf->st_size); +if (S_ISLNK (statbuf->st_mode)) { +char path[PATH_MAX ]; + +memset (path,0 ,PATH_MAX ); + +if (readlink (filename, path,PATH_MAX -1 ) <0 ) { +perror ("read" ); +return 0 ; + } + data->writep +=PAD4 (strlen (path) +1 ); + }else { + data->writep +=PAD4 (statbuf->st_size); + } +return 1 ; }
@@ -67,13 +80,9 @@ int file_save_action(const char *filename, struct stat *statbuf,int fd;int namelen =strlen (filename) +1 -strlen (data->base); -debug ("handling file %s size %ld namelen %d\n" , filename +strlen (data->base), - statbuf->st_size, namelen); - inode = (struct envfs_inode *)data->writep; inode->magic =ENVFS_32 (ENVFS_INODE_MAGIC ); inode->headerlen =ENVFS_32 (PAD4 (namelen +sizeof (struct envfs_inode_end ))); - inode->size =ENVFS_32 (statbuf->st_size); data->writep +=sizeof (struct envfs_inode );strcpy (data->writep, filename +strlen (data->base));
@@ -83,19 +92,44 @@ int file_save_action(const char *filename, struct stat *statbuf, inode_end->magic =ENVFS_32 (ENVFS_INODE_END_MAGIC ); inode_end->mode =ENVFS_32 (S_IRWXU |S_IRWXG |S_IRWXO ); - fd =open (filename,O_RDONLY ); -if (fd <0 ) { -printf ("Open %s %s\n" , filename,errno_str ()); - goto out; - } +if (S_ISLNK (statbuf->st_mode)) { +char path[PATH_MAX ]; +int len; -if (read (fd, data->writep, statbuf->st_size) < statbuf->st_size) { -perror ("read" ); - goto out; - } -close (fd); +memset (path,0 ,PATH_MAX ); + +if (readlink (filename, path,PATH_MAX -1 ) <0 ) { +perror ("read" ); + goto out; + } + len =strlen (path) +1 ; + + inode_end->mode |=ENVFS_32 (S_IFLNK ); - data->writep +=PAD4 (statbuf->st_size); +memcpy (data->writep, path, len); + inode->size =ENVFS_32 (len); + data->writep +=PAD4 (len); +debug ("handling symlink %s size %ld namelen %d headerlen %d\n" , filename +strlen (data->base), + len, namelen,ENVFS_32 (inode->headerlen)); + }else { +debug ("handling file %s size %ld namelen %d headerlen %d\n" , filename +strlen (data->base), + statbuf->st_size, namelen,ENVFS_32 (inode->headerlen)); + + inode->size =ENVFS_32 (statbuf->st_size); + fd =open (filename,O_RDONLY ); +if (fd <0 ) { +printf ("Open %s %s\n" , filename,errno_str ()); + goto out; + } + +if (read (fd, data->writep, statbuf->st_size) < statbuf->st_size) { +perror ("read" ); + goto out; + } +close (fd); + + data->writep +=PAD4 (statbuf->st_size); + } out:return 1 ;
@@ -277,22 +311,31 @@ int envfs_load(char *filename, char *dir) goto out; } - fd =open (str,O_WRONLY |O_CREAT |O_TRUNC ,0644 ); -free (str); -if (fd <0 ) { -printf ("Open %s\n" ,errno_str ()); - ret = fd; - goto out; - } - - ret =write (fd, buf, inode_size); -if (ret < inode_size) { -perror ("write" ); - ret = -errno; +if (S_ISLNK (ENVFS_32 (inode_end->mode))) { +debug ("symlink: %s -> %s\n" , str, (char *)buf); +if (symlink ((char *)buf, str) <0 ) { +printf ("symlink: %s -> %s :" , str, (char *)buf); +perror ("" ); + } +free (str); + }else { + fd =open (str,O_WRONLY |O_CREAT |O_TRUNC ,0644 ); +free (str); +if (fd <0 ) { +printf ("Open %s\n" ,errno_str ()); + ret = fd; + goto out; + } + + ret =write (fd, buf, inode_size); +if (ret < inode_size) { +perror ("write" ); + ret = -errno; +close (fd); + goto out; + }close (fd); - goto out; } -close (fd); buf +=PAD4 (inode_size); size -= headerlen_full + PAD4(inode_size) +
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
PATCH v2 18/18 defautenv: add support of symlink
In reply to Jean-Christophe PLAGNIOL-VILLARD--- common/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
common/Makefile +1 -1
@@ -58,7 +58,7 @@ ifneq ($(CONFIG_DEFAULT_ENVIRONMENT_PATH),"") DEFAULT_ENVIRONMENT_PATH += $(CONFIG_DEFAULT_ENVIRONMENT_PATH) endif -ENV_FILES := $(shell cd $(srctree); for i in $(DEFAULT_ENVIRONMENT_PATH); do find $${i} -type f -exec readlink -f '{}' \;; done) +ENV_FILES := $(shell cd $(srctree); for i in $(DEFAULT_ENVIRONMENT_PATH); do find $${i} -type f ; done) endif # ifdef CONFIG_DEFAULT_ENVIRONMENT
Signature · 7 lines
1.7.10.4 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Quoted 5 lines · Jean-Christophe PLAGNIOL-VILLARD
HI,
v2: addres comments
Quoted 9 lines
please pull
The following changes since commitb77300ac6c6bbbc7eac774ff0076c7c05d39735f:command/mount: add autodetection support (2012-08-21 18:53:00 +0800)
are available in the git repository at:
git://git.jcrosoft.org/barebox.gittags/fs-symlink
The following results in a crash here:
# mkdir mymount # mount -t ramfs none mymount/ # ln /env/boot/net /mymount/link unable to handle paging request at address 0x1b5f655c pc : [<a7f044f0>] lr : [<a7f04b10>] sp : a6eff908 ip : 00000003 fp : 00000000 r10: a6f0efe4 r9 : 00000000 r8 : 00000003 r7 : 00000000 r6 : a6f00000 r5 : a6f0eff4 r4 : a6f0efec r3 : 1b5f6560 r2 : a6f0eff4 r1 : a6f0eff4 r0 : a6f0efec Flags: NzCv IRQs off FIQs off Mode SVC_32 [<a7f044f0>] (block_link_next+0x18/0x1c) from [<a7f04b10>] (tlsf_free+0x1c/0x88) [<a7f04b10>] (tlsf_free+0x1c/0x88) from [<a7f2828c>] (symlink+0xd0/0xfc) [<a7f2828c>] (symlink+0xd0/0xfc) from [<a7f1ac8c>] (do_ln+0x14/0x3c) [<a7f1ac8c>] (do_ln+0x14/0x3c) from [<a7f050b4>] (execute_command+0x38/0x7c) [<a7f050b4>] (execute_command+0x38/0x7c) from [<a7f01efc>] (run_list_real+0x8dc/0x9dc) [<a7f01efc>] (run_list_real+0x8dc/0x9dc) from [<a7f02144>] (parse_stream_outer+0x148/0x238) [<a7f02144>] (parse_stream_outer+0x148/0x238) from [<a7f024cc>] (run_shell+0x3c/0x7c) [<a7f024cc>] (run_shell+0x3c/0x7c) from [<a7f050b4>] (execute_command+0x38/0x7c) [<a7f050b4>] (execute_command+0x38/0x7c) from [<a7f01efc>] (run_list_real+0x8dc/0x9dc) [<a7f01efc>] (run_list_real+0x8dc/0x9dc) from [<a7f01a58>] (run_list_real+0x438/0x9dc)
[<a7f2c5e4>] (unwind_backtrace+0x0/0x9c) from [<a7f1bce0>] (panic+0x28/0x3c) [<a7f1bce0>] (panic+0x28/0x3c) from [<a7f2ca3c>] (do_exception+0x10/0x14) [<a7f2ca3c>] (do_exception+0x10/0x14) from [<a7f2cac8>] (do_data_abort+0x2c/0x38) [<a7f2cac8>] (do_data_abort+0x2c/0x38) from [<a7f2c810>] (data_abort+0x50/0x60)
Signature · 9 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Quoted 13 lines · Sascha Hauer
Quoted 12 lines · Jean-Christophe PLAGNIOL-VILLARD
HI,
v2: addres commentsplease pull
The following changes since commitb77300ac6c6bbbc7eac774ff0076c7c05d39735f:command/mount: add autodetection support (2012-08-21 18:53:00 +0800)
are available in the git repository at:
Quoted 8 lines
Quoted 2 lines
git://git.jcrosoft.org/barebox.gittags/fs-symlinkThe following results in a crash here:
# mkdir mymount # mount -t ramfs none mymount/ # ln /env/boot/net /mymount/link
found
this will fix it
fs/fs.c +12 -5
@@ -1060,17 +1060,24 @@ int symlink(const char *pathname, const char *newpath) {struct fs_driver_d *fsdrv;struct fs_device_d *fsdev; -char *p =normalise_path (pathname); +char *p; +char *freep =normalise_path (pathname);int ret;struct stat s; -if (!stat (p, &s) &&S_ISDIR (s.st_mode)) { +if (!freep) +return -ENOMEM ; + +if (!stat (freep, &s) &&S_ISDIR (s.st_mode)) { ret = -ENOSYS ; goto out; } -free (p); - p =normalise_path (newpath); +free (freep); + freep = p =normalise_path (newpath); + +if (!p) +return -ENOMEM ; ret =stat (p, &s);if (!ret) {
@@ -1092,7 +1099,7 @@ int symlink(const char *pathname, const char *newpath) } out: -free (p); +free (freep);if (ret) errno = -ret;
Best Regards,
J.
_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox