X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=191c34f6bd1b6f79209c5642a4df244e1b79a85a;hp=a494e34ca67612b093ea97899d4d05215324b477;hb=570d9b811895119f6b3411678cbdcaa27226f403;hpb=4a96d43bb566f00596a31a41c535cabbf52d4f20 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index a494e34..191c34f 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -30,13 +30,6 @@ #define YAFFSFS_RW_SHIFT (13) #define YAFFSFS_RW_SIZE (1<prefix && cfg->dev){ + ylist_for_each(cfg, &yaffsfs_deviceList){ + dev = ylist_entry(cfg, yaffs_Device, devList); leftOver = path; - p = cfg->prefix; + p = dev->param.name; thisMatchLength = 0; matching = 1; @@ -319,16 +318,23 @@ static yaffs_Device *yaffsfs_FindDevice(const YCHAR *path, YCHAR **restOfPath) /* Skip over any /s in leftOver */ while(yaffsfs_IsPathDivider(*leftOver)) leftOver++; - - if( matching && (thisMatchLength > longestMatch)){ - /* Matched prefix */ + // Skip over any /s in p + while(yaffsfs_IsPathDivider(*p)) + p++; + + // p should now be at the end of the string (ie. fully matched) + if(*p) + matching = 0; + + if( matching && (thisMatchLength > longestMatch)) + { + // Matched prefix *restOfPath = (YCHAR *)leftOver; - retval = cfg->dev; + retval = dev; longestMatch = thisMatchLength; } - cfg++; } return retval; } @@ -567,12 +573,21 @@ int yaffs_open(const YCHAR *path, int oflag, int mode) if(obj) obj = yaffs_GetEquivalentObject(obj); - if(obj && obj->variantType != YAFFS_OBJECT_TYPE_FILE) + if(obj && + obj->variantType != YAFFS_OBJECT_TYPE_FILE && + obj->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) obj = NULL; if(obj){ - /* The file already exists */ + /* The file already exists or it might be a directory */ + + /* If it is a directory then we can't open it as a file */ + if(obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY){ + openDenied = 1; + yaffsfs_SetError(-EISDIR); + errorReported = 1; + } /* Open should fail if O_CREAT and O_EXCL are specified since * the file exists @@ -826,10 +841,10 @@ int yaffsfs_do_write(int fd, const void *vbuf, unsigned int nbyte, int isPwrite, yaffsfs_SetError(-EINVAL); totalWritten=-1; } else if( h && obj){ - if(isPwrite) - startPos = offset; if(h->append) startPos = yaffs_GetObjectFileLength(obj); + else if(isPwrite) + startPos = offset; else startPos = h->position; @@ -1091,7 +1106,7 @@ static int yaffsfs_DoStat(yaffs_Object *obj,struct yaffs_stat *buf) obj = yaffs_GetEquivalentObject(obj); if(obj && buf){ - buf->st_dev = (int)obj->myDev->context; + buf->st_dev = (int)obj->myDev->osContext; buf->st_ino = obj->objectId; buf->st_mode = obj->yst_mode & ~S_IFMT; /* clear out file type bits */ @@ -1180,11 +1195,11 @@ int yaffs_fstat(int fd, struct yaffs_stat *buf) return retVal; } - +#ifndef CONFIG_YAFFS_WINCE /* 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 +1208,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 +1227,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 +1248,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 +1263,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 +1272,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 +1291,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 +1311,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 +1326,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 +1335,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 +1354,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 +1373,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 +1388,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 +1397,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 +1416,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 +1435,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); @@ -1355,6 +1449,7 @@ int yaffs_fremovexattr(int fd, const char *name) return retVal; } +#endif #ifdef CONFIG_YAFFS_WINCE int yaffs_get_wince_times(int fd, unsigned *wctime, unsigned *watime, unsigned *wmtime) @@ -1767,7 +1862,7 @@ int yaffs_inodecount(const YCHAR *path) yaffsfs_Lock(); dev = yaffsfs_FindDevice(path,&dummy); if(dev && dev->isMounted) { - int nObjects = dev->nObjectsCreated - dev->nFreeObjects; + int nObjects = dev->nObjects; if(nObjects > dev->nHardLinks) retVal = nObjects - dev->nHardLinks; } @@ -1780,26 +1875,23 @@ int yaffs_inodecount(const YCHAR *path) } - -void yaffs_initialise(yaffsfs_DeviceConfiguration *cfgList) +void yaffs_AddDevice(yaffs_Device *dev) { + dev->isMounted = 0; + dev->param.removeObjectCallback = yaffsfs_RemoveObjectCallback; - yaffsfs_DeviceConfiguration *cfg; - - yaffsfs_configurationList = cfgList; - - yaffsfs_InitHandles(); + if(!dev->devList.next) + YINIT_LIST_HEAD(&dev->devList); - cfg = yaffsfs_configurationList; + ylist_add(&dev->devList,&yaffsfs_deviceList); +} - while(cfg && cfg->prefix && cfg->dev){ - cfg->dev->isMounted = 0; - cfg->dev->param.removeObjectCallback = yaffsfs_RemoveObjectCallback; - cfg++; - } +void yaffs_RemoveDevice(yaffs_Device *dev) +{ + ylist_del_init(&dev->devList); +} -} /* Directory search stuff. */