尝试给他ns添加symlink

This commit is contained in:
zhangzheng
2023-12-10 23:51:39 +08:00
parent fe32abf266
commit 7d735dccd4
11 changed files with 253 additions and 184 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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) //!< 打开设备

View File

@@ -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);
}

View File

@@ -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)
{

View File

@@ -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"

View File

@@ -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();

View File

@@ -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();

View File

@@ -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)
{