fs: add readlink support
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
This commit is contained in:
parent
5b1583d994
commit
2f17f1a22f
37
fs/fs.c
37
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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue