summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorprife <[email protected]>2013-04-03 09:10:49 -0700
committerprife <[email protected]>2013-04-03 09:10:49 -0700
commite952d55d6d4801ec04bda9364b31387caab9ee90 (patch)
tree9484c284ee30960b74132f3dead31e2d62c8f0db /components
parent425d26786f0f5569473a99176d3cac9aa1bae5bf (diff)
parentf95cd9a35456bc88621ff544466329258ff80510 (diff)
Merge pull request #70 from geniusgogo/dfs-fixbug
Dfs clean and optimized code
Diffstat (limited to 'components')
-rw-r--r--components/dfs/src/dfs.c16
-rw-r--r--components/dfs/src/dfs_fs.c49
2 files changed, 34 insertions, 31 deletions
diff --git a/components/dfs/src/dfs.c b/components/dfs/src/dfs.c
index fc4d4f847b..e1d78d398c 100644
--- a/components/dfs/src/dfs.c
+++ b/components/dfs/src/dfs.c
@@ -188,11 +188,11 @@ void fd_put(struct dfs_fd *fd)
dfs_unlock();
};
-/**
+/**
* @ingroup Fd
*
* This function will return whether this file has been opend.
- *
+ *
* @param pathname the file path name.
*
* @return 0 on file has been open successfully, -1 on open failed.
@@ -220,7 +220,7 @@ int fd_is_open(const char *pathname)
/* get file path name under mounted file system */
if (fs->path[0] == '/' && fs->path[1] == '\0')
mountpath = fullpath;
- else
+ else
mountpath = fullpath + strlen(fs->path);
dfs_lock();
@@ -271,7 +271,7 @@ const char *dfs_subdir(const char *directory, const char *filename)
return dir;
}
-/**
+/**
* this function will normalize a path according to specified parent directory
* and file name.
*
@@ -308,20 +308,20 @@ char *dfs_normalize_path(const char *directory, const char *filename)
return RT_NULL;
/* join path and file name */
- rt_snprintf(fullpath, strlen(directory) + strlen(filename) + 2,
+ rt_snprintf(fullpath, strlen(directory) + strlen(filename) + 2,
"%s/%s", directory, filename);
}
else
{
fullpath = rt_strdup(filename); /* copy string */
-
+
if (fullpath == RT_NULL)
return RT_NULL;
}
src = fullpath;
dst = fullpath;
-
+
dst0 = dst;
while (1)
{
@@ -380,7 +380,7 @@ up_one:
dst --;
if (dst < dst0)
{
- rt_free(fullpath);
+ rt_free(fullpath);
return RT_NULL;
}
while (dst0 < dst && dst[-1] != '/')
diff --git a/components/dfs/src/dfs_fs.c b/components/dfs/src/dfs_fs.c
index cb57df2513..b37d4ffd15 100644
--- a/components/dfs/src/dfs_fs.c
+++ b/components/dfs/src/dfs_fs.c
@@ -32,8 +32,10 @@
int dfs_register(const struct dfs_filesystem_operation *ops)
{
int index, result;
+ int free_index;
result = 0;
+ free_index = DFS_FILESYSTEM_TYPES_MAX;
/* lock filesystem */
dfs_lock();
@@ -41,29 +43,28 @@ int dfs_register(const struct dfs_filesystem_operation *ops)
/* check if this filesystem was already registered */
for (index = 0; index < DFS_FILESYSTEM_TYPES_MAX; index++)
{
- if (filesystem_operation_table[index] != RT_NULL &&
- strcmp(filesystem_operation_table[index]->name, ops->name) == 0)
+ if (filesystem_operation_table[index] == RT_NULL)
+ {
+ /* find out an empty filesystem type entry */
+ if (free_index == DFS_FILESYSTEM_TYPES_MAX)
+ free_index = index;
+ }
+ else if (strcmp(filesystem_operation_table[index]->name, ops->name) == 0)
{
result = -1;
goto err;
}
}
- /* find out an empty filesystem type entry */
- for (index = 0;
- index < DFS_FILESYSTEM_TYPES_MAX && filesystem_operation_table[index] != RT_NULL;
- index ++)
- ;
-
/* filesystem type table full */
- if (index == DFS_FILESYSTEM_TYPES_MAX)
+ if (free_index == DFS_FILESYSTEM_TYPES_MAX)
{
result = -1;
goto err;
}
/* save the filesystem's operations */
- filesystem_operation_table[index] = ops;
+ filesystem_operation_table[free_index] = ops;
err:
dfs_unlock();
@@ -217,7 +218,7 @@ int dfs_mount(const char *device_name,
struct dfs_filesystem *fs;
char *fullpath=RT_NULL;
rt_device_t dev_id;
- int index;
+ int index, free_index;
/* open specific device */
if (device_name != RT_NULL)
@@ -241,20 +242,22 @@ int dfs_mount(const char *device_name,
dfs_lock();
for (index = 0; index < DFS_FILESYSTEM_TYPES_MAX; index++)
{
+ if (filesystem_operation_table[index] == RT_NULL)
+ continue;
+
if (strcmp(filesystem_operation_table[index]->name, filesystemtype) == 0)
break;
}
+ dfs_unlock();
/* can't find filesystem */
if (index == DFS_FILESYSTEM_TYPES_MAX)
{
rt_set_errno(-DFS_STATUS_ENODEV);
- dfs_unlock();
return -1;
}
ops = filesystem_operation_table[index];
- dfs_unlock();
/* make full path for special file */
fullpath = dfs_normalize_path(RT_NULL, path);
@@ -280,33 +283,33 @@ int dfs_mount(const char *device_name,
dfs_file_close(&fd);
}
+ free_index = DFS_FILESYSTEMS_MAX;
/* check whether the file system mounted or not */
dfs_lock();
for (index = 0; index < DFS_FILESYSTEMS_MAX; index ++)
{
- if (filesystem_table[index].ops != RT_NULL &&
- strcmp(filesystem_table[index].path, path) == 0)
+ if (filesystem_table[index].ops == RT_NULL)
+ {
+ /* find out an empty filesystem table entry */
+ if (free_index == DFS_FILESYSTEMS_MAX)
+ free_index = index;
+ }
+ else if (strcmp(filesystem_table[index].path, path) == 0)
{
rt_set_errno(-DFS_STATUS_EINVAL);
goto err1;
}
}
- /* find out an empty filesystem table entry */
- for (index = 0;
- index < DFS_FILESYSTEMS_MAX && filesystem_table[index].ops != RT_NULL;
- index ++)
- ;
-
/* can't find en empty filesystem table entry */
- if (index == DFS_FILESYSTEMS_MAX)
+ if (free_index == DFS_FILESYSTEMS_MAX)
{
rt_set_errno(-DFS_STATUS_ENOSPC);
goto err1;
}
/* register file system */
- fs = &(filesystem_table[index]);
+ fs = &(filesystem_table[free_index]);
fs->path = fullpath;
fs->ops = ops;
fs->dev_id = dev_id;