From 4a6c8b1e04695c03d4c7d6e27a21a03e2ecf7050 Mon Sep 17 00:00:00 2001 From: Renaud Barbier Date: Wed, 29 Jan 2014 11:06:51 +0000 Subject: UBIFS: implement readlink entry point Implement the readlink entry point for future use by the DA923RC. Signed-off-by: Renaud Barbier Signed-off-by: Sascha Hauer --- fs/ubifs/ubifs.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'fs') diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c index dfa6107458..e2f9593f20 100644 --- a/fs/ubifs/ubifs.c +++ b/fs/ubifs/ubifs.c @@ -24,6 +24,7 @@ */ #include +#include #include #include #include @@ -549,6 +550,42 @@ static int ubifs_stat(struct device_d *dev, const char *filename, struct stat *s return 0; } +static char *ubifs_symlink(struct inode *inode) +{ + struct ubifs_inode *ui; + char *symlink; + + ui = ubifs_inode(inode); + symlink = malloc(ui->data_len + 1); + + memcpy(symlink, ui->data, ui->data_len); + symlink[ui->data_len] = '\0'; + + return symlink; +} + +static int ubifs_readlink(struct device_d *dev, const char *pathname, char *buf, + size_t bufsz) +{ + struct ubifs_priv *priv = dev->priv; + struct inode *inode; + char *symlink; + int len; + + inode = ubifs_findfile(priv->sb, pathname); + + if (!inode) + return -ENOENT; + + symlink = ubifs_symlink(inode); + + len = min(bufsz, strlen(symlink)); + memcpy(buf, symlink, len); + free(symlink); + + return 0; +} + static int ubifs_probe(struct device_d *dev) { struct fs_device_d *fsdev = dev_to_fs_device(dev); @@ -609,6 +646,7 @@ static struct fs_driver_d ubifs_driver = { .readdir = ubifs_readdir, .closedir = ubifs_closedir, .stat = ubifs_stat, + .readlink = ubifs_readlink, .type = filetype_ubifs, .flags = 0, .drv = { -- cgit v1.2.3