From 2f17f1a22f112bbc1eaa179914f0e5069f2a5ba2 Mon Sep 17 00:00:00 2001 From: Jean-Christophe PLAGNIOL-VILLARD Date: Fri, 17 Aug 2012 00:48:35 +0800 Subject: [PATCH] fs: add readlink support Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD --- fs/fs.c | 37 +++++++++++++++++++++++++++++++++++++ include/fs.h | 5 +++++ 2 files changed, 42 insertions(+) diff --git a/fs/fs.c b/fs/fs.c index 0b376a544..6a855130a 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -890,6 +890,43 @@ 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; + + 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; + + if (fsdrv->readlink) + ret = fsdrv->readlink(&fsdev->dev, p, buf, bufsiz); + else + ret = -ENOSYS; + + if (ret) + goto out; + +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; diff --git a/include/fs.h b/include/fs.h index c0b9f71fb..906d192a7 100644 --- a/include/fs.h +++ b/include/fs.h @@ -50,6 +50,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); @@ -124,6 +127,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);