fs/tmpfs: Remove the temporary strdup in all place
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com> Change-Id: I224cc9d4ec5fd08937f9f2ddfff022866090be29
This commit is contained in:
parent
c406e03cfe
commit
6a09ed09f1
@ -83,7 +83,7 @@ static int tmpfs_realloc_file(FAR struct tmpfs_file_s *tfo,
|
|||||||
static void tmpfs_release_lockedobject(FAR struct tmpfs_object_s *to);
|
static void tmpfs_release_lockedobject(FAR struct tmpfs_object_s *to);
|
||||||
static void tmpfs_release_lockedfile(FAR struct tmpfs_file_s *tfo);
|
static void tmpfs_release_lockedfile(FAR struct tmpfs_file_s *tfo);
|
||||||
static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
|
static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
|
||||||
FAR const char *name);
|
FAR const char *name, size_t len);
|
||||||
static int tmpfs_remove_dirent(FAR struct tmpfs_directory_s *tdo,
|
static int tmpfs_remove_dirent(FAR struct tmpfs_directory_s *tdo,
|
||||||
FAR const char *name);
|
FAR const char *name);
|
||||||
static int tmpfs_add_dirent(FAR struct tmpfs_directory_s *tdo,
|
static int tmpfs_add_dirent(FAR struct tmpfs_directory_s *tdo,
|
||||||
@ -95,14 +95,15 @@ static FAR struct tmpfs_directory_s *tmpfs_alloc_directory(void);
|
|||||||
static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
|
static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
|
||||||
FAR const char *relpath, FAR struct tmpfs_directory_s **tdo);
|
FAR const char *relpath, FAR struct tmpfs_directory_s **tdo);
|
||||||
static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
||||||
FAR const char *relpath, FAR struct tmpfs_object_s **object,
|
FAR const char *relpath, size_t len,
|
||||||
|
FAR struct tmpfs_object_s **object,
|
||||||
FAR struct tmpfs_directory_s **parent);
|
FAR struct tmpfs_directory_s **parent);
|
||||||
static int tmpfs_find_file(FAR struct tmpfs_s *fs,
|
static int tmpfs_find_file(FAR struct tmpfs_s *fs,
|
||||||
FAR const char *relpath,
|
FAR const char *relpath,
|
||||||
FAR struct tmpfs_file_s **tfo,
|
FAR struct tmpfs_file_s **tfo,
|
||||||
FAR struct tmpfs_directory_s **parent);
|
FAR struct tmpfs_directory_s **parent);
|
||||||
static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
|
static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
|
||||||
FAR const char *relpath,
|
FAR const char *relpath, size_t len,
|
||||||
FAR struct tmpfs_directory_s **tdo,
|
FAR struct tmpfs_directory_s **tdo,
|
||||||
FAR struct tmpfs_directory_s **parent);
|
FAR struct tmpfs_directory_s **parent);
|
||||||
static int tmpfs_statfs_callout(FAR struct tmpfs_directory_s *tdo,
|
static int tmpfs_statfs_callout(FAR struct tmpfs_directory_s *tdo,
|
||||||
@ -450,7 +451,7 @@ static void tmpfs_release_lockedfile(FAR struct tmpfs_file_s *tfo)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
|
static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
|
||||||
FAR const char *name)
|
FAR const char *name, size_t len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -458,7 +459,8 @@ static int tmpfs_find_dirent(FAR struct tmpfs_directory_s *tdo,
|
|||||||
|
|
||||||
for (i = 0;
|
for (i = 0;
|
||||||
i < tdo->tdo_nentries &&
|
i < tdo->tdo_nentries &&
|
||||||
strcmp(tdo->tdo_entry[i].tde_name, name) != 0;
|
(strncmp(tdo->tdo_entry[i].tde_name, name, len) != 0 ||
|
||||||
|
tdo->tdo_entry[i].tde_name[len] != 0);
|
||||||
i++);
|
i++);
|
||||||
|
|
||||||
/* Return what we found, if anything */
|
/* Return what we found, if anything */
|
||||||
@ -478,7 +480,7 @@ static int tmpfs_remove_dirent(FAR struct tmpfs_directory_s *tdo,
|
|||||||
|
|
||||||
/* Search the list of directory entries for a match */
|
/* Search the list of directory entries for a match */
|
||||||
|
|
||||||
index = tmpfs_find_dirent(tdo, name);
|
index = tmpfs_find_dirent(tdo, name, strlen(name));
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
{
|
{
|
||||||
return index;
|
return index;
|
||||||
@ -594,28 +596,19 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
|
|||||||
{
|
{
|
||||||
FAR struct tmpfs_directory_s *parent;
|
FAR struct tmpfs_directory_s *parent;
|
||||||
FAR struct tmpfs_file_s *newtfo;
|
FAR struct tmpfs_file_s *newtfo;
|
||||||
FAR char *copy;
|
FAR const char *name;
|
||||||
FAR char *name;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Duplicate the path variable so that we can modify it */
|
|
||||||
|
|
||||||
copy = strdup(relpath);
|
|
||||||
if (copy == NULL)
|
|
||||||
{
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Separate the path into the file name and the path to the parent
|
/* Separate the path into the file name and the path to the parent
|
||||||
* directory.
|
* directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
name = strrchr(copy, '/');
|
name = strrchr(relpath, '/');
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
{
|
{
|
||||||
/* No subdirectories... use the root directory */
|
/* No subdirectories... use the root directory */
|
||||||
|
|
||||||
name = copy;
|
name = relpath;
|
||||||
parent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
parent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
||||||
|
|
||||||
/* Lock the root directory to emulate the behavior of
|
/* Lock the root directory to emulate the behavior of
|
||||||
@ -625,7 +618,6 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
|
|||||||
ret = tmpfs_lock_directory(parent);
|
ret = tmpfs_lock_directory(parent);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
kmm_free(copy);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -633,25 +625,25 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Terminate the parent directory path */
|
|
||||||
|
|
||||||
*name++ = '\0';
|
|
||||||
|
|
||||||
/* Locate the parent directory that should contain this name.
|
/* Locate the parent directory that should contain this name.
|
||||||
* On success, tmpfs_find_directory() will lock the parent
|
* On success, tmpfs_find_directory() will lock the parent
|
||||||
* directory and increment the reference count.
|
* directory and increment the reference count.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_directory(fs, copy, &parent, NULL);
|
ret = tmpfs_find_directory(fs, relpath, name - relpath, &parent, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_copy;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip the '/' path separator */
|
||||||
|
|
||||||
|
name++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify that no object of this name already exists in the directory */
|
/* Verify that no object of this name already exists in the directory */
|
||||||
|
|
||||||
ret = tmpfs_find_dirent(parent, name);
|
ret = tmpfs_find_dirent(parent, name, strlen(name));
|
||||||
if (ret != -ENOENT)
|
if (ret != -ENOENT)
|
||||||
{
|
{
|
||||||
/* Something with this name already exists in the directory.
|
/* Something with this name already exists in the directory.
|
||||||
@ -690,9 +682,8 @@ static int tmpfs_create_file(FAR struct tmpfs_s *fs,
|
|||||||
parent->tdo_refs--;
|
parent->tdo_refs--;
|
||||||
tmpfs_unlock_directory(parent);
|
tmpfs_unlock_directory(parent);
|
||||||
|
|
||||||
/* Free the copy of the relpath and return success */
|
/* Return success */
|
||||||
|
|
||||||
kmm_free(copy);
|
|
||||||
*tfo = newtfo;
|
*tfo = newtfo;
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
@ -705,9 +696,6 @@ errout_with_file:
|
|||||||
errout_with_parent:
|
errout_with_parent:
|
||||||
parent->tdo_refs--;
|
parent->tdo_refs--;
|
||||||
tmpfs_unlock_directory(parent);
|
tmpfs_unlock_directory(parent);
|
||||||
|
|
||||||
errout_with_copy:
|
|
||||||
kmm_free(copy);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -752,34 +740,24 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
|
|||||||
{
|
{
|
||||||
FAR struct tmpfs_directory_s *parent;
|
FAR struct tmpfs_directory_s *parent;
|
||||||
FAR struct tmpfs_directory_s *newtdo;
|
FAR struct tmpfs_directory_s *newtdo;
|
||||||
FAR char *copy;
|
FAR const char *name;
|
||||||
FAR char *name;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Duplicate the path variable so that we can modify it */
|
|
||||||
|
|
||||||
copy = strdup(relpath);
|
|
||||||
if (copy == NULL)
|
|
||||||
{
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Separate the path into the file name and the path to the parent
|
/* Separate the path into the file name and the path to the parent
|
||||||
* directory.
|
* directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
name = strrchr(copy, '/');
|
name = strrchr(relpath, '/');
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
{
|
{
|
||||||
/* No subdirectories... use the root directory */
|
/* No subdirectories... use the root directory */
|
||||||
|
|
||||||
name = copy;
|
name = relpath;
|
||||||
parent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
parent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
||||||
|
|
||||||
ret = tmpfs_lock_directory(parent);
|
ret = tmpfs_lock_directory(parent);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
kmm_free(copy);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -787,25 +765,25 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Terminate the parent directory path */
|
|
||||||
|
|
||||||
*name++ = '\0';
|
|
||||||
|
|
||||||
/* Locate the parent directory that should contain this name.
|
/* Locate the parent directory that should contain this name.
|
||||||
* On success, tmpfs_find_directory() will lockthe parent
|
* On success, tmpfs_find_directory() will lockthe parent
|
||||||
* directory and increment the reference count.
|
* directory and increment the reference count.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_directory(fs, copy, &parent, NULL);
|
ret = tmpfs_find_directory(fs, relpath, name - relpath, &parent, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_copy;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip the '/' path separator */
|
||||||
|
|
||||||
|
name++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify that no object of this name already exists in the directory */
|
/* Verify that no object of this name already exists in the directory */
|
||||||
|
|
||||||
ret = tmpfs_find_dirent(parent, name);
|
ret = tmpfs_find_dirent(parent, name, strlen(name));
|
||||||
if (ret != -ENOENT)
|
if (ret != -ENOENT)
|
||||||
{
|
{
|
||||||
/* Something with this name already exists in the directory.
|
/* Something with this name already exists in the directory.
|
||||||
@ -845,7 +823,6 @@ static int tmpfs_create_directory(FAR struct tmpfs_s *fs,
|
|||||||
|
|
||||||
parent->tdo_refs--;
|
parent->tdo_refs--;
|
||||||
tmpfs_unlock_directory(parent);
|
tmpfs_unlock_directory(parent);
|
||||||
kmm_free(copy);
|
|
||||||
|
|
||||||
/* Return the (unlocked, unreferenced) directory object to the caller */
|
/* Return the (unlocked, unreferenced) directory object to the caller */
|
||||||
|
|
||||||
@ -865,9 +842,6 @@ errout_with_directory:
|
|||||||
errout_with_parent:
|
errout_with_parent:
|
||||||
parent->tdo_refs--;
|
parent->tdo_refs--;
|
||||||
tmpfs_unlock_directory(parent);
|
tmpfs_unlock_directory(parent);
|
||||||
|
|
||||||
errout_with_copy:
|
|
||||||
kmm_free(copy);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -876,43 +850,40 @@ errout_with_copy:
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
||||||
FAR const char *relpath,
|
FAR const char *relpath, size_t len,
|
||||||
FAR struct tmpfs_object_s **object,
|
FAR struct tmpfs_object_s **object,
|
||||||
FAR struct tmpfs_directory_s **parent)
|
FAR struct tmpfs_directory_s **parent)
|
||||||
{
|
{
|
||||||
FAR struct tmpfs_object_s *to = NULL;
|
FAR struct tmpfs_object_s *to = NULL;
|
||||||
FAR struct tmpfs_directory_s *tdo = NULL;
|
FAR struct tmpfs_directory_s *tdo = NULL;
|
||||||
FAR struct tmpfs_directory_s *next_tdo;
|
FAR struct tmpfs_directory_s *next_tdo;
|
||||||
FAR char *segment;
|
FAR const char *segment;
|
||||||
FAR char *next_segment;
|
FAR const char *next_segment;
|
||||||
FAR char *tkptr;
|
|
||||||
FAR char *copy;
|
|
||||||
int index;
|
int index;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Make a copy of the path (so that we can modify it via strtok) */
|
|
||||||
|
|
||||||
copy = strdup(relpath);
|
|
||||||
if (copy == NULL)
|
|
||||||
{
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Traverse the file system for any object with the matching name */
|
/* Traverse the file system for any object with the matching name */
|
||||||
|
|
||||||
to = fs->tfs_root.tde_object;
|
to = fs->tfs_root.tde_object;
|
||||||
next_tdo = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
next_tdo = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
||||||
|
|
||||||
for (segment = strtok_r(copy, "/", &tkptr);
|
for (segment = relpath; len != 0; segment = next_segment + 1)
|
||||||
segment != NULL;
|
|
||||||
segment = next_segment)
|
|
||||||
{
|
{
|
||||||
/* Get the next segment after the one we are currently working on.
|
/* Get the next segment after the one we are currently working on.
|
||||||
* This will be NULL is we are working on the final segment of the
|
* This will be NULL is we are working on the final segment of the
|
||||||
* relpath.
|
* relpath.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
next_segment = strtok_r(NULL, "/", &tkptr);
|
next_segment = memchr(segment, '/', len);
|
||||||
|
if (next_segment)
|
||||||
|
{
|
||||||
|
len -= next_segment + 1 - segment;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
next_segment = segment + len;
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Search the next directory. */
|
/* Search the next directory. */
|
||||||
|
|
||||||
@ -922,12 +893,11 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
|||||||
* directory.
|
* directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
index = tmpfs_find_dirent(tdo, segment);
|
index = tmpfs_find_dirent(tdo, segment, next_segment - segment);
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
{
|
{
|
||||||
/* No object with this name exists in the directory. */
|
/* No object with this name exists in the directory. */
|
||||||
|
|
||||||
kmm_free(copy);
|
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -939,7 +909,7 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
|||||||
{
|
{
|
||||||
/* No. Was this the final segment in the path? */
|
/* No. Was this the final segment in the path? */
|
||||||
|
|
||||||
if (next_segment == NULL)
|
if (len == 0)
|
||||||
{
|
{
|
||||||
/* Then we can break out of the loop now */
|
/* Then we can break out of the loop now */
|
||||||
|
|
||||||
@ -951,7 +921,6 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
|||||||
* segments do no correspond to directories.
|
* segments do no correspond to directories.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
kmm_free(copy);
|
|
||||||
return -ENOTDIR;
|
return -ENOTDIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -968,10 +937,6 @@ static int tmpfs_find_object(FAR struct tmpfs_s *fs,
|
|||||||
* Increment the reference count on the located object.
|
* Increment the reference count on the located object.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Free the dup'ed string */
|
|
||||||
|
|
||||||
kmm_free(copy);
|
|
||||||
|
|
||||||
/* Return what we found */
|
/* Return what we found */
|
||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
@ -1034,7 +999,7 @@ static int tmpfs_find_file(FAR struct tmpfs_s *fs,
|
|||||||
* reference count on both.
|
* reference count on both.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_object(fs, relpath, &to, parent);
|
ret = tmpfs_find_object(fs, relpath, strlen(relpath), &to, parent);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
/* We found it... but is it a regular file? */
|
/* We found it... but is it a regular file? */
|
||||||
@ -1069,7 +1034,7 @@ static int tmpfs_find_file(FAR struct tmpfs_s *fs,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
|
static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
|
||||||
FAR const char *relpath,
|
FAR const char *relpath, size_t len,
|
||||||
FAR struct tmpfs_directory_s **tdo,
|
FAR struct tmpfs_directory_s **tdo,
|
||||||
FAR struct tmpfs_directory_s **parent)
|
FAR struct tmpfs_directory_s **parent)
|
||||||
{
|
{
|
||||||
@ -1078,7 +1043,7 @@ static int tmpfs_find_directory(FAR struct tmpfs_s *fs,
|
|||||||
|
|
||||||
/* Find the object at this path */
|
/* Find the object at this path */
|
||||||
|
|
||||||
ret = tmpfs_find_object(fs, relpath, &to, parent);
|
ret = tmpfs_find_object(fs, relpath, len, &to, parent);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
/* We found it... but is it a regular file? */
|
/* We found it... but is it a regular file? */
|
||||||
@ -1907,7 +1872,7 @@ static int tmpfs_opendir(FAR struct inode *mountpt, FAR const char *relpath,
|
|||||||
* lock on the returned directory.
|
* lock on the returned directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_directory(fs, relpath, &tdo, NULL);
|
ret = tmpfs_find_directory(fs, relpath, strlen(relpath), &tdo, NULL);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
dir->u.tmpfs.tf_tdo = tdo;
|
dir->u.tmpfs.tf_tdo = tdo;
|
||||||
@ -2377,7 +2342,7 @@ static int tmpfs_rmdir(FAR struct inode *mountpt, FAR const char *relpath)
|
|||||||
* on each.
|
* on each.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_directory(fs, relpath, &tdo, &parent);
|
ret = tmpfs_find_directory(fs, relpath, strlen(relpath), &tdo, &parent);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_lock;
|
goto errout_with_lock;
|
||||||
@ -2458,8 +2423,7 @@ static int tmpfs_rename(FAR struct inode *mountpt,
|
|||||||
FAR struct tmpfs_object_s *to;
|
FAR struct tmpfs_object_s *to;
|
||||||
FAR struct tmpfs_s *fs;
|
FAR struct tmpfs_s *fs;
|
||||||
FAR const char *oldname;
|
FAR const char *oldname;
|
||||||
FAR char *newname;
|
FAR const char *newname;
|
||||||
FAR char *copy;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
finfo("mountpt: %p oldrelpath: %s newrelpath: %s\n",
|
finfo("mountpt: %p oldrelpath: %s newrelpath: %s\n",
|
||||||
@ -2471,20 +2435,11 @@ static int tmpfs_rename(FAR struct inode *mountpt,
|
|||||||
fs = mountpt->i_private;
|
fs = mountpt->i_private;
|
||||||
DEBUGASSERT(fs != NULL && fs->tfs_root.tde_object != NULL);
|
DEBUGASSERT(fs != NULL && fs->tfs_root.tde_object != NULL);
|
||||||
|
|
||||||
/* Duplicate the newpath variable so that we can modify it */
|
|
||||||
|
|
||||||
copy = strdup(newrelpath);
|
|
||||||
if (copy == NULL)
|
|
||||||
{
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get exclusive access to the file system */
|
/* Get exclusive access to the file system */
|
||||||
|
|
||||||
ret = tmpfs_lock(fs);
|
ret = tmpfs_lock(fs);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
kmm_free(copy);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2492,12 +2447,12 @@ static int tmpfs_rename(FAR struct inode *mountpt,
|
|||||||
* parent directory.
|
* parent directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
newname = strrchr(copy, '/');
|
newname = strrchr(newrelpath, '/');
|
||||||
if (newname == NULL)
|
if (newname == NULL)
|
||||||
{
|
{
|
||||||
/* No subdirectories... use the root directory */
|
/* No subdirectories... use the root directory */
|
||||||
|
|
||||||
newname = copy;
|
newname = newrelpath;
|
||||||
newparent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
newparent = (FAR struct tmpfs_directory_s *)fs->tfs_root.tde_object;
|
||||||
|
|
||||||
tmpfs_lock_directory(newparent);
|
tmpfs_lock_directory(newparent);
|
||||||
@ -2505,27 +2460,28 @@ static int tmpfs_rename(FAR struct inode *mountpt,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Terminate the parent directory path */
|
|
||||||
|
|
||||||
*newname++ = '\0';
|
|
||||||
|
|
||||||
/* Locate the parent directory that should contain this name.
|
/* Locate the parent directory that should contain this name.
|
||||||
* On success, tmpfs_find_directory() will lockthe parent
|
* On success, tmpfs_find_directory() will lockthe parent
|
||||||
* directory and increment the reference count.
|
* directory and increment the reference count.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_directory(fs, copy, &newparent, NULL);
|
ret = tmpfs_find_directory(fs, newrelpath, newname - newrelpath,
|
||||||
|
&newparent, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_lock;
|
goto errout_with_lock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip the '/' path separator */
|
||||||
|
|
||||||
|
newname++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify that no object of this name already exists in the destination
|
/* Verify that no object of this name already exists in the destination
|
||||||
* directory.
|
* directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_dirent(newparent, newname);
|
ret = tmpfs_find_dirent(newparent, newname, strlen(newname));
|
||||||
if (ret != -ENOENT)
|
if (ret != -ENOENT)
|
||||||
{
|
{
|
||||||
/* Something with this name already exists in the directory.
|
/* Something with this name already exists in the directory.
|
||||||
@ -2545,7 +2501,8 @@ static int tmpfs_rename(FAR struct inode *mountpt,
|
|||||||
* the reference count on both.
|
* the reference count on both.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_object(fs, oldrelpath, &to, &oldparent);
|
ret = tmpfs_find_object(fs, oldrelpath, strlen(oldrelpath),
|
||||||
|
&to, &oldparent);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_newparent;
|
goto errout_with_newparent;
|
||||||
@ -2591,7 +2548,6 @@ errout_with_newparent:
|
|||||||
|
|
||||||
errout_with_lock:
|
errout_with_lock:
|
||||||
tmpfs_unlock(fs);
|
tmpfs_unlock(fs);
|
||||||
kmm_free(copy);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2675,7 +2631,7 @@ static int tmpfs_stat(FAR struct inode *mountpt, FAR const char *relpath,
|
|||||||
* reference count on the object.
|
* reference count on the object.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = tmpfs_find_object(fs, relpath, &to, NULL);
|
ret = tmpfs_find_object(fs, relpath, strlen(relpath), &to, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
goto errout_with_fslock;
|
goto errout_with_fslock;
|
||||||
|
Loading…
Reference in New Issue
Block a user