尝试给他ns添加symlink
This commit is contained in:
@@ -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);
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) //!< 打开设备
|
||||
|
||||
@@ -11,165 +11,10 @@
|
||||
#include <assert.h>
|
||||
|
||||
/*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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user