From c3e035fe74c2aa3bf6ff00aa715a264232cc09a7 Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Mon, 14 Jun 2010 11:33:54 +1200 Subject: [PATCH] yaffs: Fix yaffsfs xattr error handling, add yaffs_lsetxattr and friends Error codes were not being handled correctly. yaffs_lsetxattr, yaffs_lgetxattr, yaffs_lremovexattr, yaffs_llistxattr. Signed-off-by: Charles Manning --- direct/yaffsfs.c | 127 ++++++++++++++++++++++++++++++++++++++--------- direct/yaffsfs.h | 4 ++ 2 files changed, 107 insertions(+), 24 deletions(-) diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index a494e34..9f6008d 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -1184,7 +1184,7 @@ int yaffs_fstat(int fd, struct yaffs_stat *buf) /* xattrib functions */ -int yaffs_setxattr(const YCHAR *path, const char *name, const void *data, int size, int flags) +static int yaffs_do_setxattr(const YCHAR *path, const char *name, const void *data, int size, int flags, int follow) { yaffs_Object *obj; @@ -1193,11 +1193,16 @@ int yaffs_setxattr(const YCHAR *path, const char *name, const void *data, int si yaffsfs_Lock(); obj = yaffsfs_FindObject(NULL,path,0); - obj = yaffsfs_FollowLink(obj,0); + if(follow) + obj = yaffsfs_FollowLink(obj,0); - if(obj) + if(obj) { retVal = yaffs_SetXAttribute(obj,name,data,size,flags); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* todo error not found */ yaffsfs_SetError(-ENOENT); @@ -1207,6 +1212,18 @@ int yaffs_setxattr(const YCHAR *path, const char *name, const void *data, int si } +int yaffs_setxattr(const YCHAR *path, const char *name, const void *data, int size, int flags) +{ + return yaffs_do_setxattr(path, name, data, size, flags, 1); +} + +int yaffs_lsetxattr(const YCHAR *path, const char *name, const void *data, int size, int flags) +{ + return yaffs_do_setxattr(path, name, data, size, flags, 0); +} + + + int yaffs_fsetxattr(int fd, const char *name, const void *data, int size, int flags) { yaffs_Object *obj; @@ -1216,9 +1233,13 @@ int yaffs_fsetxattr(int fd, const char *name, const void *data, int size, int fl yaffsfs_Lock(); obj = yaffsfs_GetHandleObject(fd); - if(obj) + if(obj) { retVal = yaffs_SetXAttribute(obj,name,data,size,flags); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* bad handle */ yaffsfs_SetError(-EBADF); @@ -1227,7 +1248,7 @@ int yaffs_fsetxattr(int fd, const char *name, const void *data, int size, int fl return retVal; } -int yaffs_getxattr(const YCHAR *path, const char *name, void *data, int size) +static int yaffs_do_getxattr(const YCHAR *path, const char *name, void *data, int size, int follow) { yaffs_Object *obj; @@ -1236,11 +1257,16 @@ int yaffs_getxattr(const YCHAR *path, const char *name, void *data, int size) yaffsfs_Lock(); obj = yaffsfs_FindObject(NULL,path,0); - obj = yaffsfs_FollowLink(obj,0); + if(follow) + obj = yaffsfs_FollowLink(obj,0); - if(obj) + if(obj) { retVal = yaffs_GetXAttribute(obj,name,data,size); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* todo error not found */ yaffsfs_SetError(-ENOENT); @@ -1250,6 +1276,17 @@ int yaffs_getxattr(const YCHAR *path, const char *name, void *data, int size) } +int yaffs_getxattr(const YCHAR *path, const char *name, void *data, int size) +{ + return yaffs_do_getxattr( path, name, data, size, 1); +} +int yaffs_lgetxattr(const YCHAR *path, const char *name, void *data, int size) +{ + return yaffs_do_getxattr( path, name, data, size, 0); +} + + + int yaffs_fgetxattr(int fd, const char *name, void *data, int size) { yaffs_Object *obj; @@ -1259,9 +1296,13 @@ int yaffs_fgetxattr(int fd, const char *name, void *data, int size) yaffsfs_Lock(); obj = yaffsfs_GetHandleObject(fd); - if(obj) + if(obj) { retVal = yaffs_GetXAttribute(obj,name,data,size); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* bad handle */ yaffsfs_SetError(-EBADF); @@ -1270,7 +1311,7 @@ int yaffs_fgetxattr(int fd, const char *name, void *data, int size) return retVal; } -int yaffs_listxattr(const YCHAR *path, char *data, int size) +static int yaffs_do_listxattr(const YCHAR *path, char *data, int size, int follow) { yaffs_Object *obj; @@ -1279,11 +1320,16 @@ int yaffs_listxattr(const YCHAR *path, char *data, int size) yaffsfs_Lock(); obj = yaffsfs_FindObject(NULL,path,0); - obj = yaffsfs_FollowLink(obj,0); + if(follow) + obj = yaffsfs_FollowLink(obj,0); - if(obj) + if(obj) { retVal = yaffs_ListXAttributes(obj, data,size); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* todo error not found */ yaffsfs_SetError(-ENOENT); @@ -1293,6 +1339,16 @@ int yaffs_listxattr(const YCHAR *path, char *data, int size) } +int yaffs_listxattr(const YCHAR *path, char *data, int size) +{ + return yaffs_do_listxattr(path, data, size, 1); +} + +int yaffs_llistxattr(const YCHAR *path, char *data, int size) +{ + return yaffs_do_listxattr(path, data, size, 0); +} + int yaffs_flistxattr(int fd, char *data, int size) { yaffs_Object *obj; @@ -1302,9 +1358,13 @@ int yaffs_flistxattr(int fd, char *data, int size) yaffsfs_Lock(); obj = yaffsfs_GetHandleObject(fd); - if(obj) + if(obj) { retVal = yaffs_ListXAttributes(obj,data,size); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* bad handle */ yaffsfs_SetError(-EBADF); @@ -1313,7 +1373,7 @@ int yaffs_flistxattr(int fd, char *data, int size) return retVal; } -int yaffs_removexattr(const YCHAR *path, const char *name) +static int yaffs_do_removexattr(const YCHAR *path, const char *name, int follow) { yaffs_Object *obj; @@ -1322,11 +1382,16 @@ int yaffs_removexattr(const YCHAR *path, const char *name) yaffsfs_Lock(); obj = yaffsfs_FindObject(NULL,path,0); - obj = yaffsfs_FollowLink(obj,0); + if(follow) + obj = yaffsfs_FollowLink(obj,0); - if(obj) + if(obj) { retVal = yaffs_RemoveXAttribute(obj,name); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + } else /* todo error not found */ yaffsfs_SetError(-ENOENT); @@ -1336,6 +1401,16 @@ int yaffs_removexattr(const YCHAR *path, const char *name) } +int yaffs_removexattr(const YCHAR *path, const char *name) +{ + return yaffs_do_removexattr(path, name, 1); +} + +int yaffs_lremovexattr(const YCHAR *path, const char *name) +{ + return yaffs_do_removexattr(path, name, 0); +} + int yaffs_fremovexattr(int fd, const char *name) { yaffs_Object *obj; @@ -1345,9 +1420,13 @@ int yaffs_fremovexattr(int fd, const char *name) yaffsfs_Lock(); obj = yaffsfs_GetHandleObject(fd); - if(obj) + if(obj){ retVal = yaffs_RemoveXAttribute(obj,name); - else + if(retVal< 0){ + yaffsfs_SetError(retVal); + retVal = -1; + } + }else /* bad handle */ yaffsfs_SetError(-EBADF); diff --git a/direct/yaffsfs.h b/direct/yaffsfs.h index 18cc22f..0c62145 100644 --- a/direct/yaffsfs.h +++ b/direct/yaffsfs.h @@ -247,15 +247,19 @@ int yaffs_lstat(const YCHAR *path, struct yaffs_stat *buf) ; int yaffs_fstat(int fd, struct yaffs_stat *buf) ; int yaffs_setxattr(const char *path, const char *name, const void *data, int size, int flags); +int yaffs_lsetxattr(const char *path, const char *name, const void *data, int size, int flags); int yaffs_fsetxattr(int fd, const char *name, const void *data, int size, int flags); int yaffs_getxattr(const char *path, const char *name, void *data, int size); +int yaffs_lgetxattr(const char *path, const char *name, void *data, int size); int yaffs_fgetxattr(int fd, const char *name, void *data, int size); int yaffs_removexattr(const char *path, const char *name); +int yaffs_lremovexattr(const char *path, const char *name); int yaffs_fremovexattr(int fd, const char *name); int yaffs_listxattr(const char *path, char *list, int size); +int yaffs_llistxattr(const char *path, char *list, int size); int yaffs_flistxattr(int fd, char *list, int size); -- 2.30.2