X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=c7b5ed2c8b9f09d75b2ab1cce1ba70191be4b0fa;hb=cf6888f05f691aa1a357e7e94f9bf7b98174bbc3;hp=573c68b3b5ef60a96cbea3252f530cd882547d00;hpb=4be24c244e22ef029cf1f014c0cf8433a49a8a37;p=yaffs2.git diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 573c68b..c7b5ed2 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -53,14 +53,14 @@ typedef struct { } yaffsfs_Inode; typedef struct{ - __u8 reading:1; - __u8 writing:1; - __u8 append:1; - __u8 shareRead:1; - __u8 shareWrite:1; + u8 reading:1; + u8 writing:1; + u8 append:1; + u8 shareRead:1; + u8 shareWrite:1; int inodeId:12; /* Index to corresponding yaffsfs_Inode */ int useCount:10; /* Use count for this handle */ - __u32 position; /* current position in file */ + u32 position; /* current position in file */ }yaffsfs_Handle; static yaffsfs_Inode yaffsfs_inode[YAFFSFS_N_HANDLES]; @@ -584,14 +584,14 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) int symDepth = 0; int errorReported = 0; int rwflags = oflag & ( O_RDWR | O_RDONLY | O_WRONLY); - __u8 shareRead = (sharing & YAFFS_SHARE_READ) ? 1 : 0; - __u8 shareWrite = (sharing & YAFFS_SHARE_WRITE) ? 1 : 0; - __u8 sharedReadAllowed; - __u8 sharedWriteAllowed; - __u8 alreadyReading; - __u8 alreadyWriting; - __u8 readRequested; - __u8 writeRequested; + u8 shareRead = (sharing & YAFFS_SHARE_READ) ? 1 : 0; + u8 shareWrite = (sharing & YAFFS_SHARE_WRITE) ? 1 : 0; + u8 sharedReadAllowed; + u8 sharedWriteAllowed; + u8 alreadyReading; + u8 alreadyWriting; + u8 readRequested; + u8 writeRequested; /* O_EXCL only has meaning if O_CREAT is specified */ if(!(oflag & O_CREAT)) @@ -732,7 +732,7 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) } else { yaffsfs_PutHandle(handle); if(!errorReported) { - yaffsfs_SetError(-EACCES); + yaffsfs_SetError(!obj ? -ENOSPC : -EACCES); errorReported = 1; } handle = -1; @@ -824,7 +824,7 @@ int yaffsfs_do_read(int fd, void *vbuf, unsigned int nbyte, int isPread, int off int nToRead = 0; int totalRead = 0; unsigned int maxRead; - __u8 *buf = (__u8 *)vbuf; + u8 *buf = (u8 *)vbuf; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); @@ -920,7 +920,7 @@ int yaffsfs_do_write(int fd, const void *vbuf, unsigned int nbyte, int isPwrite, int totalWritten = 0; int write_trhrough = 0; int nToWrite = 0; - const __u8 *buf = (const __u8 *)vbuf; + const u8 *buf = (const u8 *)vbuf; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); @@ -1058,30 +1058,28 @@ off_t yaffs_lseek(int fd, off_t offset, int whence) h = yaffsfs_GetHandlePointer(fd); obj = yaffsfs_GetHandleObject(fd); - if(!h || !obj) + if(!h || !obj){ /* bad handle */ yaffsfs_SetError(-EBADF); - else if(whence == SEEK_SET){ - if(offset >= 0) - pos = offset; - } - else if(whence == SEEK_CUR) { - if( (h->position + offset) >= 0) - pos = (h->position + offset); - } - else if(whence == SEEK_END) { - fSize = yaffs_get_obj_length(obj); - if(fSize >= 0 && (fSize + offset) >= 0) - pos = fSize + offset; - } - - if(pos >= 0) - h->position = pos; - else { - /* todo error */ + } else { + if(whence == SEEK_SET){ + if(offset >= 0) + pos = offset; + } else if(whence == SEEK_CUR) { + if( (h->position + offset) >= 0) + pos = (h->position + offset); + } else if(whence == SEEK_END) { + fSize = yaffs_get_obj_length(obj); + if(fSize >= 0 && (fSize + offset) >= 0) + pos = fSize + offset; + } + + if(pos >= 0) + h->position = pos; + else + yaffsfs_SetError(-EINVAL); } - yaffsfs_Unlock(); return pos; @@ -1730,8 +1728,40 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode) yaffs_obj_t *parent = NULL; yaffs_obj_t *dir = NULL; YCHAR *name; + YCHAR *use_path = NULL; + int path_length = 0; int retVal= -1; + int i; + + + /* + * We don't have a definition for max path length. + * We will use 3 * max name length instead. + */ + + path_length = strnlen(path,(YAFFS_MAX_NAME_LENGTH+1)*3 +1); + /* If the last character is a path divider, then we need to + * trim it back so that the name look-up works properly. + * eg. /foo/new_dir/ -> /foo/newdir + * Curveball: Need to handle multiple path dividers: + * eg. /foof/sdfse///// -> /foo/sdfse + */ + if(path_length > 0 && + yaffsfs_IsPathDivider(path[path_length-1])){ + use_path = YMALLOC(path_length + 1); + if(!use_path){ + yaffsfs_SetError(-ENOMEM); + return -1; + } + strcpy(use_path, path); + for(i = path_length-1; + i >= 0 && yaffsfs_IsPathDivider(use_path[i]); + i--) + use_path[i] = (YCHAR) 0; + path = use_path; + } + yaffsfs_Lock(); parent = yaffsfs_FindDirectory(NULL,path,&name,0); if(parent && yaffs_strnlen(name,5) == 0){ @@ -1757,6 +1787,9 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode) yaffsfs_Unlock(); + if(use_path) + YFREE(use_path); + return retVal; } @@ -2016,7 +2049,7 @@ void yaffs_remove_device(yaffs_dev_t *dev) typedef struct { - __u32 magic; + u32 magic; yaffs_dirent de; /* directory entry being used by this dsc */ YCHAR name[NAME_MAX+1]; /* name of directory being searched */ yaffs_obj_t *dirObj; /* ptr to directory being searched */