diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c index 672ca054c..9e3a6a33b 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c @@ -66,7 +66,17 @@ int kill(int argc, char *argv[]) } int pid = atoi(argv[1]); - pm_kill_task(pid, PM_KILL_TASK_ALL); - return 0; + return pm_kill_task(pid, PM_KILL_TASK_ALL); } -SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), kill, kill, kill command); \ No newline at end of file +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), kill, kill, kill command); + +int shell_symlink(int argc, char *argv[]) +{ + if (argc < 3) + { + return -1; + } + printf("%s %s %s\n", __func__, argv[1], argv[2]); + return symlink(argv[1], argv[2]); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), symlink, shell_symlink, symlink command); diff --git a/mkrtos_user/lib/sys_svr/inc/fs_cli.h b/mkrtos_user/lib/sys_svr/inc/fs_cli.h index e7c170eab..b299d1bdd 100644 --- a/mkrtos_user/lib/sys_svr/inc/fs_cli.h +++ b/mkrtos_user/lib/sys_svr/inc/fs_cli.h @@ -8,3 +8,4 @@ int fs_write(int fd, void *buf, size_t len); int fs_close(int fd); int fs_lseek(int fd, int offs, int whence); int fs_readdir(int _fd, struct dirent *dirent); +int fs_symlink(const char *src, const char *dst); diff --git a/mkrtos_user/lib/sys_svr/inc/fs_svr.h b/mkrtos_user/lib/sys_svr/inc/fs_svr.h index 9d61f00b8..24b5f96f0 100644 --- a/mkrtos_user/lib/sys_svr/inc/fs_svr.h +++ b/mkrtos_user/lib/sys_svr/inc/fs_svr.h @@ -22,3 +22,4 @@ int fs_svr_mkdir(char *path); int fs_svr_unlink(char *path); int fs_svr_renmae(char *oldname, char *newname); int fs_svr_fstat(int fd, stat_t *stat); +int fs_svr_symlink(const char *src, const char *dst); diff --git a/mkrtos_user/lib/sys_svr/inc/ns_types.h b/mkrtos_user/lib/sys_svr/inc/ns_types.h index 44b9951ca..77a70d189 100644 --- a/mkrtos_user/lib/sys_svr/inc/ns_types.h +++ b/mkrtos_user/lib/sys_svr/inc/ns_types.h @@ -10,23 +10,25 @@ enum node_type MOUNT_NODE, //!< 挂载节点 FILE_NODE, //!< 文件节点 DIR_NODE, //!< 存在子目录 + SYM_NODE, //!< 一个软链接节点 }; typedef struct ns_node { - struct ns_node *parent; - char node_name[NAMESPACE_PATH_LEN]; - enum node_type type; + struct ns_node *parent; //!< 父节点 + char node_name[NAMESPACE_PATH_LEN]; //!< 节点的类型 + enum node_type type; //!< 节点的类型 union { struct { - obj_handler_t node_hd; - pid_t pid; - }; - slist_head_t sub_dir; + obj_handler_t node_hd; //!< 存储设备ipc的hd号码 + pid_t pid; //!< 哪一个task注册的? + }; //!< FILE_NODE &MOUNT_NODE使用该结构 + slist_head_t sub_dir; //!< 只有DIR_NODE才有子目录 + char sym_path[NAMESPACE_PATH_LEN]; //!< SYM_NODE的软链接路径 }; - slist_head_t node; - int ref; + slist_head_t node; //!< 当前节点作为子节点使用 + int ref; //!< 引用计数 } ns_node_t; typedef struct ns diff --git a/mkrtos_user/lib/sys_svr/inc/rpc_prot.h b/mkrtos_user/lib/sys_svr/inc/rpc_prot.h index 42292354e..e3425b4b0 100644 --- a/mkrtos_user/lib/sys_svr/inc/rpc_prot.h +++ b/mkrtos_user/lib/sys_svr/inc/rpc_prot.h @@ -24,6 +24,7 @@ #define FS_CHDIR ((uint16_t)16) //!< 进入某个目录,可在客户端实现 暂不实现* #define FS_CWDIR ((uint16_t)17) //!< 获取当前目录,可在客户端实现 暂不实现* #define FS_MOUNT ((uint16_t)18) //!< 挂载节点 暂不实现* +#define FS_SYMLINK ((uint16_t)19) //!< 软链接 #define DRV_PROT 0x0003 #define DRV_OPEN ((uint16_t)0) //!< 打开设备 diff --git a/mkrtos_user/lib/sys_svr/src/fs_cli.c b/mkrtos_user/lib/sys_svr/src/fs_cli.c index d45eba8e3..5d78d458f 100644 --- a/mkrtos_user/lib/sys_svr/src/fs_cli.c +++ b/mkrtos_user/lib/sys_svr/src/fs_cli.c @@ -11,165 +11,10 @@ #include /*open*/ -// RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_OPEN, open, -// rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, -// rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags, -// rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mode) -msg_tag_t fs_t_open_call(obj_handler_t hd, rpc_ref_array_uint32_t_uint8_t_32_t *var0, rpc_int_t *var1, rpc_int_t *var2) -{ - void *buf; - ipc_msg_t *msg_ipc; - thread_msg_buf_get(2, (umword_t *)(&buf), ((void *)0)); - msg_ipc = (ipc_msg_t *)buf; - int off = 0; - int off_buf = 0; - int ret = -1; - size_t op_val = ((uint16_t)0); - rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); - off += rpc_align(sizeof(op_val), __alignof(((uint16_t)0))); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_ref_array_uint32_t_uint8_t_32_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 2) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_ref_array_uint32_t_uint8_t_32_t(var0, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_buf = ret; - } - } - } while (0); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 2) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_buf = ret; - } - } - } while (0); - do - { - if (1 == 1) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_int_t(var2, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 2) - { - if (1 == 1 || 1 == 4) - { - int ret = rpc_cli_msg_to_buf_rpc_int_t(var2, (uint8_t *)((uint8_t *)msg_ipc->map_buf), off_buf); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off_buf = ret; - } - } - } while (0); - msg_tag_t tag = thread_ipc_call(((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_buf) / ((sizeof(void *)))) + (((off_buf) % ((sizeof(void *)))) ? 1 : 0))), .prot = (0x0002)}), hd, ipc_timeout_create2(0, 0)); - if (((int16_t)((tag).prot)) < 0) - { - return tag; - } - off = 0; - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_cli_buf_to_msg_rpc_ref_array_uint32_t_uint8_t_32_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_cli_buf_to_msg_rpc_int_t(var1, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - do - { - if (1 == 1) - { - if (1 == 2 || 1 == 4) - { - int ret = rpc_cli_buf_to_msg_rpc_int_t(var2, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *))); - if (ret < 0) - { - return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)}); - } - off = ret; - } - } - } while (0); - return tag; -} +RPC_GENERATION_CALL3(fs_t, FS_PROT, FS_OPEN, open, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mode) sd_t fs_open(const char *path, int flags, int mode) { obj_handler_t hd; @@ -361,3 +206,19 @@ int fs_readdir(sd_t _fd, dirent_t *dirent) return msg_tag_get_val(tag); } +RPC_GENERATION_CALL2(fs_t, FS_PROT, FS_SYMLINK, symlink, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, src, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, dst) + +int fs_symlink(const char *src, const char *dst) +{ + rpc_ref_array_uint32_t_uint8_t_32_t rpc_src = { + .data = (uint8_t *)src, + .len = strlen(src) + 1, + }; + rpc_ref_array_uint32_t_uint8_t_32_t rpc_dst = { + .data = (uint8_t *)dst, + .len = strlen(dst) + 1, + }; + msg_tag_t tag = fs_t_symlink_call(u_get_global_env()->ns_hd, &rpc_src, &rpc_dst); +} diff --git a/mkrtos_user/lib/sys_svr/src/fs_svr.c b/mkrtos_user/lib/sys_svr/src/fs_svr.c index 2bb0f6df5..c3d9e6274 100644 --- a/mkrtos_user/lib/sys_svr/src/fs_svr.c +++ b/mkrtos_user/lib/sys_svr/src/fs_svr.c @@ -162,10 +162,25 @@ RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_STAT, fstat, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd, rpc_stat_t_t, rpc_stat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, stat) +/*symlink*/ +RPC_GENERATION_OP2(fs_t, FS_PROT, FS_SYMLINK, symlink, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, src, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, dst) +{ + src->data[src->len - 1] = 0; + dst->data[dst->len - 1] = 0; + return fs_svr_symlink(src->data, dst->data); +} + +RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_SYMLINK, symlink, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, src, + rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, dst) + /*dispatch*/ -RPC_DISPATCH12(fs_t, FS_PROT, typeof(FS_OPEN), FS_OPEN, open, FS_READ, read, +RPC_DISPATCH13(fs_t, FS_PROT, typeof(FS_OPEN), FS_OPEN, open, FS_READ, read, FS_WRITE, write, FS_CLOSE, close, FS_LSEEK, lseek, FS_FTRUNCATE, ftruncate, - FS_SYNC, fsync, FS_READDIR, readdir, FS_MKDIR, mkdir, FS_UNLINK, unlink, FS_RENAME, rename, FS_STAT, fstat) + FS_SYNC, fsync, FS_READDIR, readdir, FS_MKDIR, mkdir, FS_UNLINK, + unlink, FS_RENAME, rename, FS_STAT, fstat, FS_SYMLINK, symlink) void fs_init(fs_t *fs) { diff --git a/mkrtos_user/lib/sys_util/inc/u_rpc.h b/mkrtos_user/lib/sys_util/inc/u_rpc.h index 8b52f5b2e..221c15598 100644 --- a/mkrtos_user/lib/sys_util/inc/u_rpc.h +++ b/mkrtos_user/lib/sys_util/inc/u_rpc.h @@ -787,6 +787,89 @@ RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t) } \ return tag; \ } +#define RPC_DISPATCH13(struct_type, prot, op_type, func0_op, func0_name, func1_op, func1_name, \ + func2_op, func2_name, func3_op, func3_name, \ + func4_op, func4_name, func5_op, func5_name, func6_op, func6_name, \ + func7_op, func7_name, func8_op, func8_name, func9_op, func9_name, \ + func10_op, func10_name, func11_op, func11_name, func12_op, func12_name) \ + msg_tag_t rpc_##struct_type##_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \ + { \ + msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \ + size_t op_val; \ + \ + op_val = *((op_type *)(ipc_msg->msg_buf)); \ + switch (op_val) \ + { \ + case func0_op: \ + { \ + tag = struct_type##_##func0_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func1_op: \ + { \ + tag = struct_type##_##func1_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func2_op: \ + { \ + tag = struct_type##_##func2_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func3_op: \ + { \ + tag = struct_type##_##func3_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func4_op: \ + { \ + tag = struct_type##_##func4_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func5_op: \ + { \ + tag = struct_type##_##func5_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func6_op: \ + { \ + tag = struct_type##_##func6_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func7_op: \ + { \ + tag = struct_type##_##func7_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func8_op: \ + { \ + tag = struct_type##_##func8_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func9_op: \ + { \ + tag = struct_type##_##func9_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func10_op: \ + { \ + tag = struct_type##_##func10_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func11_op: \ + { \ + tag = struct_type##_##func11_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + case func12_op: \ + { \ + tag = struct_type##_##func12_name##_dispatch((struct_type *)obj, in_tag, ipc_msg); \ + } \ + break; \ + default: \ + break; \ + } \ + return tag; \ + } #include "u_rpc_1.h" #include "u_rpc_2.h" #include "u_rpc_3.h" \ No newline at end of file diff --git a/mkrtos_user/server/fs/cpiofs/fs_rpc.c b/mkrtos_user/server/fs/cpiofs/fs_rpc.c index 503ccc3ed..d339eb30c 100644 --- a/mkrtos_user/server/fs/cpiofs/fs_rpc.c +++ b/mkrtos_user/server/fs/cpiofs/fs_rpc.c @@ -94,7 +94,8 @@ int fs_svr_open(const char *path, int flags, int mode) { return -EACCES; } - if (path[0]=='/') { + if (path[0] == '/') + { path++; } @@ -227,7 +228,10 @@ int fs_svr_fstat(int fd, stat_t *stat) stat->st_size = file->file_size; return 0; } - +int fs_svr_symlink(const char *src, const char *dst) +{ + return -ENOSYS; +} void fs_svr_loop(void) { rpc_loop(); diff --git a/mkrtos_user/server/fs/fatfs/fs_rpc.c b/mkrtos_user/server/fs/fatfs/fs_rpc.c index e5506d646..6372b8117 100644 --- a/mkrtos_user/server/fs/fatfs/fs_rpc.c +++ b/mkrtos_user/server/fs/fatfs/fs_rpc.c @@ -336,7 +336,10 @@ int fs_svr_fstat(int fd, stat_t *stat) { return -ENOSYS; } - +int fs_svr_symlink(const char *src, const char *dst) +{ + return -ENOSYS; +} void fs_svr_loop(void) { rpc_loop(); diff --git a/mkrtos_user/server/init/src/namespace.c b/mkrtos_user/server/init/src/namespace.c index b5e12a223..f98fe1b0b 100644 --- a/mkrtos_user/server/init/src/namespace.c +++ b/mkrtos_user/server/init/src/namespace.c @@ -29,6 +29,15 @@ static ns_t ns; static fs_t ns_fs; int ns_reg(const char *path, obj_handler_t hd, enum node_type type); int ns_node_free(ns_node_t *node); +static int find_path(const char *name); + +/** + * @brief 查找每一个节点,并进行删除 + * + * @param head + * @param pid + * @param to_del + */ static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid, int to_del) { ns_node_t *pos; @@ -58,11 +67,28 @@ static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid, int to_del) pos = next; } } +/** + * @brief 从ns删除某个task注册的所有节点 + * + * @param pid + * @param to_del + */ void ns_node_del_by_pid(pid_t pid, int to_del) { _ns_node_del_by_pid(&ns.root_node.sub_dir, pid, to_del); } -static ns_node_t *node_init(ns_node_t *new_node, ns_node_t *parent, const char *name, obj_handler_t hd, enum node_type type) +/** + * @brief 初始化一个节点 + * + * @param new_node + * @param parent + * @param name + * @param hd + * @param type + * @return ns_node_t* + */ +static ns_node_t *node_init(ns_node_t *new_node, ns_node_t *parent, + const char *name, obj_handler_t hd, enum node_type type) { strncpy(new_node->node_name, name, sizeof(new_node->node_name)); new_node->node_name[sizeof(new_node->node_name) - 1] = 0; @@ -75,13 +101,20 @@ static ns_node_t *node_init(ns_node_t *new_node, ns_node_t *parent, const char * parent->ref++; //! 父目录的引用计数+1 } slist_init(&new_node->node); - if (type == DIR_NODE) + switch (type) { + case DIR_NODE: slist_init(&new_node->sub_dir); - } - else - { + break; + case FILE_NODE: + case MOUNT_NODE: new_node->node_hd = hd; + break; + case SYM_NODE: + new_node->sym_path[0] = 0; + break; + default: + break; } return new_node; } @@ -190,6 +223,9 @@ static ns_node_t *node_lookup(ns_node_t *dir, const char *name, size_t *ret_inx) goto end; } break; + default: + assert(0); + break; } } find_inx += inx; @@ -236,6 +272,7 @@ int ns_node_free(ns_node_t *node) handler_free_umap(node->node_hd); break; default: + assert(0); break; } if (slist_in_list(&node->node)) @@ -252,7 +289,7 @@ int fs_svr_open(const char *path, int flags, int mode) size_t ret_inx; int len; -again: + // again: node = node_lookup(&ns.root_node, path, &ret_inx); if (!node) { @@ -261,6 +298,7 @@ again: len = strlen(path); if (len != ret_inx) { + /* 这里应该用mkdir创建 if (flags & O_CREAT) { int ret = ns_reg(path, 0, DIR_NODE); @@ -271,6 +309,7 @@ again: } goto again; } + */ return -ENOENT; } file_desc_t *fd_p = fd_alloc(node); @@ -359,6 +398,10 @@ int fs_svr_unlink(char *path) { ns_node_free(node); } + else + { + return -ENOTEMPTY; + } } else { @@ -367,6 +410,49 @@ int fs_svr_unlink(char *path) return 0; } +/** + * @brief 创建一个软链接节点 + * + * @param src + * @param dst + * @return int + */ +int fs_svr_symlink(const char *src, const char *dst) +{ + ns_node_t *node; + size_t ret_inx; + int len; + + node = node_lookup(&ns.root_node, dst, &ret_inx); + if (!node) + { + return -ENOENT; + } + len = strlen(dst); + if (len == ret_inx) + { + // 已经存在 + return -EEXIST; + } + int inx = find_path(dst); + + if (ret_inx != inx) + { + // 父级目录不存在 + return -ENOENT; + } + ns_node_t *new_node = create_node(&ns.root_node, dst + inx, 0, SYM_NODE); + + if (!new_node) + { + return -ENOMEM; + } + strncpy(new_node->sym_path, src, NAMESPACE_PATH_LEN); + new_node->sym_path[NAMESPACE_PATH_LEN - 1] = 0; + assert(node->type == DIR_NODE); + slist_add_append(&node->sub_dir, &new_node->node); + return 0; +} static int find_path(const char *name) { @@ -445,7 +531,7 @@ int namespace_register(const char *path, obj_handler_t hd, int type) handler_free_umap(hd); return -ECANCELED; } - int ret = ns_reg(path, hd, type); // TODO:增加类型支持 + int ret = ns_reg(path, hd, type); printf("register svr, name is %s, hd is %d\n", path, hd); return ret; } @@ -508,7 +594,9 @@ void fs_svr_sync(int fd) } int fs_svr_mkdir(char *path) { - return -ENOSYS; + int ret = ns_reg(path, 0, DIR_NODE); + + return ret; } int fs_svr_renmae(char *oldname, char *newname) {