yaffs direct: Fix yaffs_mkdir error paths
[yaffs2.git] / direct / yaffsfs.c
index 15d5aeb7b0ed35911f3edb8ea12fc090636981a6..3745f6189011c60bd14e63b9184c8212f9b36351 100644 (file)
@@ -1187,11 +1187,6 @@ int yaffsfs_DoUnlink(const YCHAR *path,int isDirectory)
 }
 
 
-int yaffs_rmdir(const YCHAR *path)
-{
-       return yaffsfs_DoUnlink(path,1);
-}
-
 int yaffs_unlink(const YCHAR *path)
 {
        return yaffsfs_DoUnlink(path,0);
@@ -1724,7 +1719,7 @@ int yaffs_access(const YCHAR *path, int amode)
        struct yaffs_obj *obj=NULL;
        struct yaffs_obj *dir=NULL;
 
-       int retval = 0;
+       int retval = -1;
 
        if(amode & ~(R_OK | W_OK | X_OK)){
                yaffsfs_SetError(-EINVAL);
@@ -1749,10 +1744,10 @@ int yaffs_access(const YCHAR *path, int amode)
                if((amode & X_OK) && !(obj->yst_mode & S_IEXEC))
                        access_ok = 0;
 
-               if(!access_ok) {
+               if(!access_ok)
                        yaffsfs_SetError(-EACCES);
-                       retval = -1;
-               }
+               else
+                       retval = 0;
        }
 
        yaffsfs_Unlock();
@@ -1819,22 +1814,17 @@ int yaffs_fchmod(int fd, mode_t mode)
 }
 
 
-int yaffs_mkdir(const YCHAR *path, mode_t mode)
+static int yaffsfs_alt_dir_path(const YCHAR *path, YCHAR **ret_path)
 {
-       struct yaffs_obj *parent = NULL;
-       struct yaffs_obj *dir = NULL;
-       YCHAR *name;
-       YCHAR *use_path = NULL;
-       int path_length = 0;
-       int retVal= -1;
+       YCHAR *alt_path = NULL;
+       int path_length;
        int i;
 
-
        /*
         * We don't have a definition for max path length.
         * We will use 3 * max name length instead.
         */
-       
+       *ret_path = NULL;
        path_length = strnlen(path,(YAFFS_MAX_NAME_LENGTH+1)*3 +1);
 
        /* If the last character is a path divider, then we need to
@@ -1845,50 +1835,79 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode)
         */
        if(path_length > 0 && 
                yaffsfs_IsPathDivider(path[path_length-1])){
-               use_path = YMALLOC(path_length + 1);
-               if(!use_path){
-                       yaffsfs_SetError(-ENOMEM);
+               alt_path = YMALLOC(path_length + 1);
+               if(!alt_path)
                        return -1;
-               }
-               strcpy(use_path, path);
+               strcpy(alt_path, path);
                for(i = path_length-1;
-                       i >= 0 && yaffsfs_IsPathDivider(use_path[i]);
+                       i >= 0 && yaffsfs_IsPathDivider(alt_path[i]);
                        i--)
-                       use_path[i] = (YCHAR) 0;
-               path = use_path;
+                       alt_path[i] = (YCHAR) 0;
+       }
+       *ret_path = alt_path;
+       return 0;
+}
+
+int yaffs_mkdir(const YCHAR *path, mode_t mode)
+{
+       struct yaffs_obj *parent = NULL;
+       struct yaffs_obj *dir = NULL;
+       YCHAR *name;
+       YCHAR *alt_path = NULL;
+       int retVal= -1;
+
+       if(yaffsfs_alt_dir_path(path, &alt_path) < 0){
+               yaffsfs_SetError(-ENOMEM);
+               return -1;
        }
+       if(alt_path)
+               path = alt_path;
        
        yaffsfs_Lock();
        parent = yaffsfs_FindDirectory(NULL,path,&name,0);
-       if(parent && yaffs_strnlen(name,5) == 0){
+       if(!parent)
+               yaffsfs_SetError(-ENOTDIR);
+       else if(parent && yaffs_strnlen(name,5) == 0){
                /* Trying to make the root itself */
                yaffsfs_SetError(-EEXIST);
-       } else if(parent && parent->my_dev->read_only){
-               yaffsfs_SetError(-EINVAL);
-       } else {
-               if(parent)
-                       dir = yaffs_create_dir(parent,name,mode,0,0);
+       } else if(parent && parent->my_dev->read_only)
+               yaffsfs_SetError(-EROFS);
+       else {
+               dir = yaffs_create_dir(parent,name,mode,0,0);
                if(dir)
                        retVal = 0;
-               else {
-                       if(!parent)
-                               yaffsfs_SetError(-ENOENT); /* missing path */
-                       else if (yaffs_find_by_name(parent,name))
-                               yaffsfs_SetError(-EEXIST); /* the name already exists */
-                       else
-                               yaffsfs_SetError(-ENOSPC); /* just assume no space */
-                       retVal = -1;
-               }
+               else if (yaffs_find_by_name(parent,name))
+                       yaffsfs_SetError(-EEXIST); /* the name already exists */
+               else
+                       yaffsfs_SetError(-ENOSPC); /* just assume no space */
        }
 
        yaffsfs_Unlock();
 
-       if(use_path)
-               YFREE(use_path);
+       if(alt_path)
+               YFREE(alt_path);
 
        return retVal;
 }
 
+int yaffs_rmdir(const YCHAR *path)
+{
+       int result;
+       YCHAR *alt_path;
+
+       if(yaffsfs_alt_dir_path(path, &alt_path) < 0){
+               yaffsfs_SetError(-ENOMEM);
+               return -1;
+       }
+       if(alt_path)
+               path = alt_path;
+       result =  yaffsfs_DoUnlink(path,1);
+       if(alt_path)
+               YFREE(alt_path);
+       return result;
+}
+
+
 void * yaffs_getdev(const YCHAR *path)
 {
        struct yaffs_dev *dev=NULL;
@@ -2332,8 +2351,12 @@ int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath)
 
        yaffsfs_Lock();
        parent = yaffsfs_FindDirectory(NULL,newpath,&name,0);
-       if(parent && parent->my_dev->read_only)
-               yaffsfs_SetError(-EINVAL);
+       if(!parent)
+               yaffsfs_SetError(-ENOTDIR);
+       else if( strlen(name) < 1)
+               yaffsfs_SetError(-ENOENT);
+       else if(parent->my_dev->read_only)
+               yaffsfs_SetError(-EROFS);
        else if(parent){
                obj = yaffs_create_symlink(parent,name,mode,0,0,oldpath);
                if(obj)
@@ -2342,9 +2365,6 @@ int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath)
                        yaffsfs_SetError(-ENOSPC); /* just assume no space for now */
                        retVal = -1;
                }
-       } else {
-               yaffsfs_SetError(-EINVAL);
-               retVal = -1;
        }
 
        yaffsfs_Unlock();