修复ipc映射时错误的bug
This commit is contained in:
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
@@ -174,7 +174,12 @@
|
||||
"__strerror.h": "c",
|
||||
"sstream": "c",
|
||||
"u_drv.h": "c",
|
||||
"__node_handle": "c"
|
||||
"__node_handle": "c",
|
||||
"__hash_table": "c",
|
||||
"__tuple": "c",
|
||||
"limits": "c",
|
||||
"compare": "c",
|
||||
"algorithm": "c"
|
||||
},
|
||||
"cortex-debug.showRTOS": false,
|
||||
"cortex-debug.variableUseNaturalFormat": false,
|
||||
|
||||
@@ -83,18 +83,20 @@ typedef union vpage
|
||||
struct
|
||||
{
|
||||
umword_t attrs : 4; //!< 权限
|
||||
umword_t : 8; //!< 保留
|
||||
umword_t flags : 8; //!< 保留
|
||||
umword_t addr : (WORD_BITS - 12); //!< 地址
|
||||
};
|
||||
} vpage_t;
|
||||
|
||||
#define VPAGE_FLAGS_MAP 0x1 //!< 是否ipc时立刻映射操作
|
||||
|
||||
static inline vpage_t vpage_create_raw(umword_t raw)
|
||||
{
|
||||
return (vpage_t){.raw = raw};
|
||||
}
|
||||
static inline vpage_t vpage_create3(umword_t attrs, umword_t resv, umword_t addr)
|
||||
static inline vpage_t vpage_create3(umword_t attrs, umword_t flags, umword_t addr)
|
||||
{
|
||||
return (vpage_t){.attrs = attrs, .addr = addr};
|
||||
return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr};
|
||||
}
|
||||
static inline obj_handler_t vpage_get_obj_handler(vpage_t vpage)
|
||||
{
|
||||
|
||||
@@ -220,14 +220,19 @@ static int ipc_data_copy(thread_t *dst_th, thread_t *src_th, msg_tag_t tag)
|
||||
task_t *dst_tk = thread_get_bind_task(dst_th);
|
||||
for (int i = 0; i < map_len; i++)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
vpage_t dst_page = vpage_create_raw(dst_ipc->map_buf[i]);
|
||||
vpage_t src_page = vpage_create_raw(src_ipc->map_buf[i]);
|
||||
|
||||
int ret = obj_map_src_dst(&dst_tk->obj_space, &src_tk->obj_space,
|
||||
if (src_page.flags & VPAGE_FLAGS_MAP)
|
||||
{
|
||||
ret = obj_map_src_dst(&dst_tk->obj_space, &src_tk->obj_space,
|
||||
vpage_get_obj_handler(dst_page),
|
||||
vpage_get_obj_handler(src_page),
|
||||
dst_tk->lim,
|
||||
vpage_get_attrs(src_page), &del);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#define THREAD_MAIN THREAD_PROT
|
||||
#define TASK_THIS TASK_PROT
|
||||
|
||||
|
||||
#define MSG_TAG_KNL_ERR 0x8
|
||||
|
||||
typedef union msg_tag
|
||||
@@ -79,16 +78,18 @@ typedef union vpage
|
||||
struct
|
||||
{
|
||||
umword_t attrs : 4; //!< 权限
|
||||
umword_t : 8; //!< 保留
|
||||
umword_t flags : 8; //!< 保留
|
||||
umword_t addr : (WORD_BITS - 12); //!< 地址
|
||||
};
|
||||
} vpage_t;
|
||||
|
||||
#define VPAGE_FLAGS_MAP 0x1 //!< 是否ipc时立刻映射
|
||||
|
||||
static inline vpage_t vpage_create_raw(umword_t raw)
|
||||
{
|
||||
return (vpage_t){.raw = raw};
|
||||
}
|
||||
static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t resv, umword_t addr)
|
||||
static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t flags, umword_t addr)
|
||||
{
|
||||
return (vpage_t){.attrs = attrs, .addr = addr};
|
||||
return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr};
|
||||
}
|
||||
|
||||
@@ -106,6 +106,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd)
|
||||
};
|
||||
rpc_obj_handler_t_t rpc_svr_hd = {
|
||||
.data = newfd,
|
||||
.del_map_flags = VPAGE_FLAGS_MAP,
|
||||
};
|
||||
|
||||
msg_tag_t tag = ns_t_query_call(u_get_global_env()->ns_hd, &rpc_path, &rpc_svr_hd);
|
||||
@@ -117,7 +118,7 @@ int ns_query(const char *path, obj_handler_t *svr_hd)
|
||||
}
|
||||
if (reg_hd(path, newfd) == FALSE)
|
||||
{
|
||||
printf("客户端服务缓存区已满.\n");
|
||||
printf("The client service cache is full.\n");
|
||||
handler_free_umap(newfd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -37,133 +37,19 @@ RPC_GENERATION_OP2(ns_t, NS_QUERY_OP, query,
|
||||
int ret = namespace_query((char *)(path->data), &cli_hd->data);
|
||||
if (ret >= 0)
|
||||
{
|
||||
printf("请求服务[%s]成功.\n", (char *)(path->data));
|
||||
printf("The request service [%s] was successful.", (char *)(path->data));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("请求服务[%s]失败.\n", (char *)(path->data));
|
||||
printf("Failed to request service [%s]", (char *)(path->data));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query,
|
||||
// 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_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
|
||||
msg_tag_t ns_t_query_dispatch(ns_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg)
|
||||
{
|
||||
rpc_array_uint32_t_uint8_t_32_t var0;
|
||||
rpc_obj_handler_t_t var1;
|
||||
size_t op_val;
|
||||
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf);
|
||||
int off = 0;
|
||||
rpc_var_rpc_array_uint32_t_uint8_t_32_t_init(&var0);
|
||||
rpc_var_rpc_obj_handler_t_t_init(&var1);
|
||||
op_val = *((typeof(((uint16_t)1)) *)value);
|
||||
if (op_val != ((uint16_t)1))
|
||||
{
|
||||
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (-71)});
|
||||
}
|
||||
off += sizeof(typeof(((uint16_t)1)));
|
||||
off = rpc_align(off, __alignof(typeof(((uint16_t)1))));
|
||||
do
|
||||
{
|
||||
if (1 == 1)
|
||||
{
|
||||
if (1 == 1 || 1 == 4)
|
||||
{
|
||||
int ret = rpc_svr_buf_to_msg_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), 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 (2 == 1)
|
||||
{
|
||||
if (4 == 1 || 4 == 4)
|
||||
{
|
||||
int ret = rpc_svr_buf_to_msg_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), 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);
|
||||
short ret_val = ns_t_query_op(obj, &var0, &var1);
|
||||
if (ret_val < 0)
|
||||
{
|
||||
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)});
|
||||
}
|
||||
off = 0;
|
||||
int off_map = 0;
|
||||
do
|
||||
{
|
||||
if (1 == 1)
|
||||
{
|
||||
if (1 == 2 || 1 == 4)
|
||||
{
|
||||
int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(value), 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 (2 == 1)
|
||||
{
|
||||
if (4 == 2 || 4 == 4)
|
||||
{
|
||||
int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(value), 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 == 2 || 1 == 4)
|
||||
{
|
||||
int ret = rpc_svr_msg_to_buf_rpc_array_uint32_t_uint8_t_32_t(&var0, (uint8_t *)(ipc_msg->map_buf), off_map);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
|
||||
}
|
||||
off_map = ret;
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
do
|
||||
{
|
||||
if (2 == 2)
|
||||
{
|
||||
if (4 == 2 || 4 == 4)
|
||||
{
|
||||
int ret = rpc_svr_msg_to_buf_rpc_obj_handler_t_t(&var1, (uint8_t *)(ipc_msg->map_buf), off_map);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
|
||||
}
|
||||
off_map = ret;
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = ((((off_map) / ((sizeof(void *)))) + (((off_map) % ((sizeof(void *)))) ? 1 : 0))), .prot = (ret_val)});
|
||||
}
|
||||
RPC_GENERATION_DISPATCH2(ns_t, NS_QUERY_OP, query,
|
||||
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_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_INOUT, RPC_TYPE_BUF, cli_hd)
|
||||
|
||||
RPC_DISPATCH2(ns_t, typeof(NS_REGISTER_OP), NS_REGISTER_OP, register, NS_QUERY_OP, query)
|
||||
|
||||
void ns_init(ns_t *ns)
|
||||
|
||||
@@ -193,14 +193,14 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
|
||||
RPC_ARRAY_TYPE_DEF(len_type, data_type, length); \
|
||||
RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
|
||||
{ \
|
||||
if (rpc_align(len, __alignof(d->len)) + d->len > \
|
||||
if (rpc_align(len, __alignof(d->len)) > \
|
||||
IPC_MSG_SIZE) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
len = rpc_align(len, __alignof(d->len)); \
|
||||
*((typeof(d->len) *)(&buf[len])) = d->len; \
|
||||
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
|
||||
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
@@ -215,14 +215,14 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
|
||||
} \
|
||||
RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
|
||||
{ \
|
||||
if (rpc_align(len, __alignof(d->len)) + d->len > \
|
||||
if (rpc_align(len, __alignof(d->len)) > \
|
||||
max) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
len = rpc_align(len, __alignof(d->len)); \
|
||||
d->len = *((typeof(d->len) *)(&buf[len])); \
|
||||
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
|
||||
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
@@ -237,14 +237,14 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
|
||||
} \
|
||||
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
|
||||
{ \
|
||||
if (rpc_align(len, __alignof(d->len)) + d->len > \
|
||||
if (rpc_align(len, __alignof(d->len)) > \
|
||||
IPC_MSG_SIZE) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
len = rpc_align(len, __alignof(d->len)); \
|
||||
*((typeof(d->len) *)(&buf[len])) = d->len; \
|
||||
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
|
||||
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
@@ -259,14 +259,13 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
|
||||
} \
|
||||
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
|
||||
{ \
|
||||
if (rpc_align(len, __alignof(d->len)) + d->len > \
|
||||
max) \
|
||||
if (rpc_align(len, __alignof(d->len)) > max) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
len = rpc_align(len, __alignof(d->len)); \
|
||||
d->len = *((typeof(d->len) *)(&buf[len])); \
|
||||
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
|
||||
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
@@ -308,13 +307,13 @@ RPC_ARRAY_DEF(uint32_t, uint8_t, 32)
|
||||
RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length); \
|
||||
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_##len_type##_##data_type##_##length##_t, int) \
|
||||
{ \
|
||||
if (rpc_align(len, __alignof(d->len)) + d->len > IPC_MSG_SIZE) \
|
||||
if (rpc_align(len, __alignof(d->len)) > IPC_MSG_SIZE) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
len = rpc_align(len, __alignof(d->len)); \
|
||||
*((typeof(d->len) *)(&buf[len])) = d->len; \
|
||||
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
|
||||
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
@@ -329,14 +328,14 @@ RPC_ARRAY_DEF(uint32_t, uint8_t, 32)
|
||||
} \
|
||||
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int) \
|
||||
{ \
|
||||
if (rpc_align(len, __alignof(d->len)) + d->len > \
|
||||
if (rpc_align(len, __alignof(d->len)) > \
|
||||
max) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
len = rpc_align(len, __alignof(d->len)); \
|
||||
d->len = *((typeof(d->len) *)(&buf[len])); \
|
||||
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
|
||||
if (rpc_align(len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
|
||||
{ \
|
||||
return -ETOLONG; \
|
||||
} \
|
||||
@@ -361,7 +360,16 @@ RPC_REF_ARRAY_DEF(uint32_t, uint8_t, 32)
|
||||
* @brief Construct a new rpc type def object
|
||||
*
|
||||
*/
|
||||
RPC_TYPE_DEF(obj_handler_t);
|
||||
// RPC_TYPE_DEF(obj_handler_t);
|
||||
#define RPC_OBJ_HANDLER_TYPE_DEF(type) \
|
||||
typedef struct rpc_##type \
|
||||
{ \
|
||||
type data; \
|
||||
uint8_t del_map_flags; \
|
||||
} rpc_##type##_t
|
||||
|
||||
RPC_OBJ_HANDLER_TYPE_DEF(obj_handler_t);
|
||||
|
||||
/**
|
||||
* @brief Construct a new rpc cli msg to buf without impl object
|
||||
*
|
||||
@@ -373,7 +381,7 @@ RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
|
||||
return -ETOLONG;
|
||||
}
|
||||
len = rpc_align(len, __alignof(d->data));
|
||||
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
|
||||
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0xff & (~(d->del_map_flags)), d->data).raw;
|
||||
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
|
||||
}
|
||||
/**
|
||||
@@ -395,7 +403,7 @@ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
|
||||
return -ETOLONG;
|
||||
}
|
||||
len = rpc_align(len, __alignof(d->data));
|
||||
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
|
||||
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0xff & (~(d->del_map_flags)), d->data).raw;
|
||||
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -21,7 +21,7 @@ void sys_info_unlock(void)
|
||||
|
||||
int sys_info_save(void)
|
||||
{
|
||||
int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777);
|
||||
int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777);
|
||||
if (fd < 0)
|
||||
{
|
||||
return fd;
|
||||
@@ -40,7 +40,7 @@ int sys_info_save(void)
|
||||
}
|
||||
int sys_info_read(void)
|
||||
{
|
||||
int fd = fs_open("/sys_info.bin", O_CREAT | O_WRONLY, 0777);
|
||||
int fd = fs_open("/sys_info.bin", O_CREAT | O_RDONLY, 0777);
|
||||
if (fd < 0)
|
||||
{
|
||||
return fd;
|
||||
|
||||
@@ -25,11 +25,11 @@ int main(int argc, char *args[])
|
||||
printf("argc:%d args[0]:%s\n", argc, args[0]);
|
||||
drv_init();
|
||||
u_sleep_ms(100);
|
||||
sys_info.devID = 12;
|
||||
sys_info_save();
|
||||
sys_info.devID = 0;
|
||||
sys_info_read();
|
||||
assert(sys_info.devID == 12);
|
||||
// sys_info.devID = 12;
|
||||
// sys_info_save();
|
||||
// sys_info.devID = 0;
|
||||
// sys_info_read();
|
||||
// assert(sys_info.devID == 12);
|
||||
ulog_write_str(u_get_global_env()->log_hd, "app start..\n");
|
||||
relay_test();
|
||||
while (1)
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
/ Locale and Namespace Configurations
|
||||
/---------------------------------------------------------------------------*/
|
||||
|
||||
#define FF_CODE_PAGE 932
|
||||
#define FF_CODE_PAGE 437
|
||||
/* This option specifies the OEM code page to be used on the target system.
|
||||
/ Incorrect code page setting can cause a file open failure.
|
||||
/
|
||||
@@ -113,8 +113,8 @@
|
||||
*/
|
||||
|
||||
|
||||
#define FF_USE_LFN 0
|
||||
#define FF_MAX_LFN 255
|
||||
#define FF_USE_LFN 1
|
||||
#define FF_MAX_LFN 64
|
||||
/* The FF_USE_LFN switches the support for LFN (long file name).
|
||||
/
|
||||
/ 0: Disable LFN. FF_MAX_LFN has no effect.
|
||||
@@ -224,7 +224,7 @@
|
||||
/ System Configurations
|
||||
/---------------------------------------------------------------------------*/
|
||||
|
||||
#define FF_FS_TINY 0
|
||||
#define FF_FS_TINY 1
|
||||
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
|
||||
/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
|
||||
/ Instead of private sector buffer eliminated from the file object, common sector
|
||||
|
||||
@@ -18,7 +18,7 @@ typedef struct file_desc
|
||||
FIL fp;
|
||||
} file_desc_t;
|
||||
|
||||
#define FILE_DESC_NR 1
|
||||
#define FILE_DESC_NR 8
|
||||
static file_desc_t files[FILE_DESC_NR];
|
||||
|
||||
void *file_temp_buf_get(void)
|
||||
|
||||
Reference in New Issue
Block a user