diff options
| author | prife <[email protected]> | 2013-04-03 09:10:49 -0700 |
|---|---|---|
| committer | prife <[email protected]> | 2013-04-03 09:10:49 -0700 |
| commit | e952d55d6d4801ec04bda9364b31387caab9ee90 (patch) | |
| tree | 9484c284ee30960b74132f3dead31e2d62c8f0db /components/dfs | |
| parent | 425d26786f0f5569473a99176d3cac9aa1bae5bf (diff) | |
| parent | f95cd9a35456bc88621ff544466329258ff80510 (diff) | |
Merge pull request #70 from geniusgogo/dfs-fixbug
Dfs clean and optimized code
Diffstat (limited to 'components/dfs')
| -rw-r--r-- | components/dfs/src/dfs.c | 16 | ||||
| -rw-r--r-- | components/dfs/src/dfs_fs.c | 49 |
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; |
