cpiofs能够正常加载
This commit is contained in:
@@ -53,8 +53,13 @@ long syscall_backend(long sys_inx, ...);
|
||||
void fs_backend_init(void);
|
||||
|
||||
long be_lseek(long fd, long offset, long whence);
|
||||
long sys_be_lseek(va_list ap);
|
||||
int be_open(const char *path, int flags, mode_t mode);
|
||||
long sys_be_open(va_list ap);
|
||||
long sys_be_open_at(va_list ap);
|
||||
int be_close(int fd);
|
||||
long sys_be_close(va_list ap);
|
||||
long sys_be_getdents(va_list ap);
|
||||
long be_read(long fd, char *buf, long size);
|
||||
long be_write(long fd, char *buf, long size);
|
||||
long be_readv(long fd, const struct iovec *iov, long iovcnt);
|
||||
|
||||
@@ -7,12 +7,16 @@ typedef long (*sys_call_func)(va_list ap);
|
||||
|
||||
static const sys_call_func sys_call_list[] = {
|
||||
// TODO: add syscall func pointer.
|
||||
[SYS_openat] = sys_be_open_at,
|
||||
[SYS_close] = sys_be_close,
|
||||
[SYS_munmap] = sys_munmap,
|
||||
[SYS_mmap] = sys_mmap,
|
||||
[SYS_read] = sys_be_read,
|
||||
[SYS_write] = sys_be_write,
|
||||
[SYS_writev] = sys_be_writev,
|
||||
[SYS_ioctl] = sys_be_ioctl,
|
||||
[SYS_lseek] = sys_be_lseek,
|
||||
[SYS_getdents64] = sys_be_getdents,
|
||||
[SYS_set_tid_address] = sys_set_tid_address,
|
||||
// [__ARM_NR_set_tls] = sys_set_thread_area,
|
||||
// [SYS_exit] = be_exit,
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
|
||||
#include "fs_backend.h"
|
||||
#include "syscall_backend.h"
|
||||
#include "fs_cli.h"
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <u_prot.h>
|
||||
#include <u_log.h>
|
||||
#include <u_env.h>
|
||||
#include <u_task.h>
|
||||
#include <cons_cli.h>
|
||||
#include <sys/uio.h>
|
||||
#include <assert.h>
|
||||
#include <u_util.h>
|
||||
#include "fd_map.h"
|
||||
#include "fs_cli.h"
|
||||
#include "syscall_backend.h"
|
||||
#include "u_sleep.h"
|
||||
#include <assert.h>
|
||||
#include <cons_cli.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/uio.h>
|
||||
#include <u_env.h>
|
||||
#include <u_log.h>
|
||||
#include <u_prot.h>
|
||||
#include <u_task.h>
|
||||
#include <u_util.h>
|
||||
AUTO_CALL(101)
|
||||
void fs_backend_init(void)
|
||||
{
|
||||
@@ -25,71 +25,84 @@ int be_open(const char *path, int flags, mode_t mode)
|
||||
{
|
||||
int fd = fs_open(path, flags, mode);
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
if (fd < 0) {
|
||||
return fd;
|
||||
}
|
||||
int user_fd = fd_map_alloc(0, fd, FD_FS);
|
||||
|
||||
if (user_fd < 0)
|
||||
{
|
||||
if (user_fd < 0) {
|
||||
be_close(user_fd);
|
||||
}
|
||||
return user_fd;
|
||||
}
|
||||
long sys_be_open(va_list ap)
|
||||
{
|
||||
void *path;
|
||||
long flags;
|
||||
long mode;
|
||||
|
||||
ARG_3_BE(ap, path, void *, flags, long, mode, long);
|
||||
|
||||
return be_open(path, flags, mode);
|
||||
}
|
||||
long sys_be_open_at(va_list ap)
|
||||
{
|
||||
long resv;
|
||||
void *path;
|
||||
long flags;
|
||||
long mode;
|
||||
|
||||
ARG_4_BE(ap, resv, long, path, void *, flags, long, mode, long);
|
||||
|
||||
return be_open(path, flags, mode);
|
||||
}
|
||||
int be_close(int fd)
|
||||
{
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_free(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
} break;
|
||||
case FD_FS: {
|
||||
return fs_close(u_fd.priv_fd);
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
long sys_be_close(va_list ap)
|
||||
{
|
||||
long fd;
|
||||
|
||||
ARG_1_BE(ap, fd, long);
|
||||
|
||||
return be_close(fd);
|
||||
}
|
||||
static int be_tty_read(char *buf, long size)
|
||||
{
|
||||
pid_t pid;
|
||||
int len;
|
||||
int r_len = 0;
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
if (size == 0) {
|
||||
return 0;
|
||||
}
|
||||
task_get_pid(TASK_THIS, (umword_t *)(&pid));
|
||||
|
||||
while (r_len < size)
|
||||
{
|
||||
if (pid == 0)
|
||||
{
|
||||
while (r_len < size) {
|
||||
if (pid == 0) {
|
||||
len = ulog_read_bytes(u_get_global_env()->log_hd, buf + r_len, size - r_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
len = cons_read(buf + r_len, size - r_len);
|
||||
}
|
||||
if (len < 0)
|
||||
{
|
||||
if (len < 0) {
|
||||
return len;
|
||||
}
|
||||
else if (len == 0)
|
||||
{
|
||||
} else if (len == 0) {
|
||||
u_sleep_ms(10);
|
||||
continue;
|
||||
}
|
||||
@@ -103,22 +116,16 @@ long be_read(long fd, char *buf, long size)
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
return be_tty_read(buf, size);
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
} break;
|
||||
case FD_FS: {
|
||||
return fs_read(u_fd.priv_fd, buf, size);
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
@@ -130,33 +137,24 @@ long be_write(long fd, char *buf, long size)
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
pid_t pid;
|
||||
|
||||
task_get_pid(TASK_THIS, (umword_t *)(&pid));
|
||||
if (pid == 0)
|
||||
{
|
||||
if (pid == 0) {
|
||||
ulog_write_bytes(u_get_global_env()->log_hd, buf, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cons_write(buf, size);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
} break;
|
||||
case FD_FS: {
|
||||
return fs_write(u_fd.priv_fd, buf, size);
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
@@ -165,51 +163,38 @@ long be_write(long fd, char *buf, long size)
|
||||
long be_readv(long fd, const struct iovec *iov, long iovcnt)
|
||||
{
|
||||
long wlen = 0;
|
||||
for (int i = 0; i < iovcnt; i++)
|
||||
{
|
||||
for (int i = 0; i < iovcnt; i++) {
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
pid_t pid;
|
||||
int read_cn;
|
||||
|
||||
task_get_pid(TASK_THIS, (umword_t *)(&pid));
|
||||
if (pid == 0)
|
||||
{
|
||||
if (pid == 0) {
|
||||
read_cn = ulog_read_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
again_read:
|
||||
read_cn = cons_read(iov[i].iov_base, iov[i].iov_len);
|
||||
if (read_cn < 0)
|
||||
{
|
||||
if (read_cn < 0) {
|
||||
return read_cn;
|
||||
}
|
||||
else if (read_cn == 0)
|
||||
{
|
||||
} else if (read_cn == 0) {
|
||||
u_sleep_ms(10); // TODO:改成信号量
|
||||
goto again_read;
|
||||
}
|
||||
}
|
||||
wlen += read_cn;
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
} break;
|
||||
case FD_FS: {
|
||||
int rsize = fs_read(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len);
|
||||
|
||||
wlen += rsize;
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
@@ -219,40 +204,30 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt)
|
||||
long be_writev(long fd, const struct iovec *iov, long iovcnt)
|
||||
{
|
||||
long wlen = 0;
|
||||
for (int i = 0; i < iovcnt; i++)
|
||||
{
|
||||
for (int i = 0; i < iovcnt; i++) {
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
pid_t pid;
|
||||
|
||||
task_get_pid(TASK_THIS, (umword_t *)(&pid));
|
||||
if (pid == 0)
|
||||
{
|
||||
if (pid == 0) {
|
||||
ulog_write_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
cons_write(iov[i].iov_base, iov[i].iov_len);
|
||||
} else {
|
||||
cons_write(iov[i].iov_base, iov[i].iov_len);
|
||||
}
|
||||
wlen += iov[i].iov_len;
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
} break;
|
||||
case FD_FS: {
|
||||
int wsize = fs_write(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len);
|
||||
|
||||
wlen += wsize;
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
@@ -313,27 +288,30 @@ long be_lseek(long fd, long offset, long whence)
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
return -ENOSYS;
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
} break;
|
||||
case FD_FS: {
|
||||
return fs_lseek(u_fd.priv_fd, offset, whence);
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
long sys_be_lseek(va_list ap)
|
||||
{
|
||||
long fd;
|
||||
long offset;
|
||||
long whence;
|
||||
ARG_3_BE(ap, fd, long, offset, long, whence, long);
|
||||
|
||||
return be_lseek(fd, offset, whence);
|
||||
}
|
||||
long be_symlink(const char *src, const char *dst)
|
||||
{
|
||||
return fs_symlink(src, dst);
|
||||
@@ -343,24 +321,27 @@ long be_getdents(long fd, char *buf, size_t size)
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
switch (u_fd.type) {
|
||||
case FD_TTY: {
|
||||
return -ENOSYS;
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
} break;
|
||||
case FD_FS: {
|
||||
ret = fs_readdir(u_fd.priv_fd, (struct dirent *)buf);
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
long sys_be_getdents(va_list ap)
|
||||
{
|
||||
long fd;
|
||||
char *buf;
|
||||
size_t size;
|
||||
ARG_3_BE(ap, fd, long, buf, char *, size, long);
|
||||
|
||||
return be_getdents(fd, buf, size);
|
||||
}
|
||||
|
||||
@@ -47,14 +47,14 @@ int be_futex(uint32_t *uaddr, int futex_op, uint32_t val,
|
||||
}
|
||||
|
||||
_try_again:
|
||||
sys_read_info(SYS_PROT, &sys_info);
|
||||
sys_read_info(SYS_PROT, &sys_info, 0);
|
||||
st_val = sys_info.sys_tick;
|
||||
tag = futex_ctrl(FUTEX_PROT, uaddr, futex_op, val, total, uaddr2, val3, pt->tid);
|
||||
if (msg_tag_get_val(tag) == -ETIMEDOUT)
|
||||
{
|
||||
umword_t en_val;
|
||||
|
||||
sys_read_info(SYS_PROT, &sys_info);
|
||||
sys_read_info(SYS_PROT, &sys_info, 0);
|
||||
en_val = sys_info.sys_tick;
|
||||
if (en_val - st_val < total)
|
||||
{
|
||||
|
||||
@@ -121,7 +121,7 @@ long be_clock_gettime(clockid_t clk_id, struct timespec *tp)
|
||||
return -ENODEV;
|
||||
}
|
||||
sys_info_t info;
|
||||
sys_read_info(SYS_PROT, &info);
|
||||
sys_read_info(SYS_PROT, &info, 0);
|
||||
|
||||
unsigned long ts = info.sys_tick;
|
||||
|
||||
|
||||
@@ -31,9 +31,9 @@ typedef union msg_tag
|
||||
struct
|
||||
{
|
||||
umword_t flags : 4; // 3bit:代表错误由内核报告
|
||||
umword_t msg_buf_len : 5;
|
||||
umword_t map_buf_len : 2;
|
||||
umword_t prot : WORD_BITS - 12;
|
||||
umword_t msg_buf_len : 7;
|
||||
umword_t map_buf_len : 5;
|
||||
umword_t prot : WORD_BITS - 16;
|
||||
};
|
||||
} msg_tag_t;
|
||||
|
||||
|
||||
@@ -9,7 +9,9 @@ typedef struct sys_info
|
||||
umword_t sys_clk;
|
||||
} sys_info_t;
|
||||
|
||||
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info);
|
||||
#define SYS_FLAGS_MAP_CPIO_FS 0x01
|
||||
|
||||
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info, umword_t flags);
|
||||
msg_tag_t sys_reboot(obj_handler_t obj);
|
||||
msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free);
|
||||
msg_tag_t sys_dis_info(obj_handler_t obj, umword_t irq_inx);
|
||||
@@ -18,13 +20,13 @@ static inline umword_t sys_read_tick(void)
|
||||
{
|
||||
sys_info_t info;
|
||||
|
||||
sys_read_info(SYS_PROT, &info);
|
||||
sys_read_info(SYS_PROT, &info, 0);
|
||||
return info.sys_tick;
|
||||
}
|
||||
static inline umword_t sys_read_clk(void)
|
||||
{
|
||||
sys_info_t info;
|
||||
|
||||
sys_read_info(SYS_PROT, &info);
|
||||
sys_read_info(SYS_PROT, &info, 0);
|
||||
return info.sys_clk;
|
||||
}
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
#include "u_types.h"
|
||||
#include "u_prot.h"
|
||||
|
||||
#define MSG_BUG_LEN 128
|
||||
#define MSG_BUG_LEN CONFIG_THREAD_MSG_BUG_LEN
|
||||
#define MSG_BUF_RECV_R_FLAGS 0x02U //!< 接收上次发送数据的接收者
|
||||
#define MSG_BUF_REPLY_FLAGS 0x04U //!<
|
||||
|
||||
#define IPC_MSG_SIZE 96 //!< IPC消息大小
|
||||
#define MAP_BUF_SIZE 16 //!< 映射消息大小
|
||||
#define IPC_MSG_SIZE CONFIG_THREAD_IPC_MSG_LEN //!< IPC消息大小
|
||||
#define MAP_BUF_SIZE CONFIG_THREAD_MAP_BUF_LEN //!< 映射消息大小
|
||||
#define IPC_USER_SIZE 12 //!< 用户态消息大小
|
||||
|
||||
typedef struct ipc_msg
|
||||
|
||||
@@ -15,7 +15,7 @@ enum sys_op
|
||||
DIS_IRQ,
|
||||
};
|
||||
|
||||
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info)
|
||||
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info, umword_t flags)
|
||||
{
|
||||
register volatile umword_t r0 asm(ARCH_REG_0);
|
||||
register volatile umword_t r1 asm(ARCH_REG_1);
|
||||
@@ -23,7 +23,7 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info)
|
||||
register volatile umword_t r3 asm(ARCH_REG_3);
|
||||
|
||||
mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw,
|
||||
0,
|
||||
flags,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
|
||||
@@ -116,7 +116,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
|
||||
msg_tag_t tag;
|
||||
sys_info_t sys_info;
|
||||
|
||||
tag = sys_read_info(SYS_PROT, &sys_info);
|
||||
tag = sys_read_info(SYS_PROT, &sys_info, 0);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
return -ENOENT;
|
||||
|
||||
@@ -128,7 +128,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
|
||||
sys_info_t sys_info;
|
||||
int ret;
|
||||
|
||||
tag = sys_read_info(SYS_PROT, &sys_info);
|
||||
tag = sys_read_info(SYS_PROT, &sys_info, 0);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
return -ENOENT;
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
#include "cons_cli.h"
|
||||
#include "cpiofs.h"
|
||||
#include "fs_svr.h"
|
||||
#include "rpc_prot.h"
|
||||
#include "u_env.h"
|
||||
#include "u_log.h"
|
||||
#include "u_rpc.h"
|
||||
#include "u_rpc_svr.h"
|
||||
#include "u_sys.h"
|
||||
#include "fs_svr.h"
|
||||
#include "cons_cli.h"
|
||||
#include "u_log.h"
|
||||
#include "u_env.h"
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <dirent.h>
|
||||
#include "rpc_prot.h"
|
||||
#include "cpiofs.h"
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
static fs_t fs;
|
||||
|
||||
typedef struct file_desc
|
||||
{
|
||||
typedef struct file_desc {
|
||||
pid_t pid;
|
||||
addr_t file_addr;
|
||||
size_t file_size;
|
||||
@@ -30,17 +29,14 @@ static file_desc_t fds[CPIO_FS_FD_NR];
|
||||
|
||||
static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset, int *fd, int type)
|
||||
{
|
||||
for (int i = 0; i < CPIO_FS_FD_NR; i++)
|
||||
{
|
||||
if (fds[i].file_addr == 0)
|
||||
{
|
||||
for (int i = 0; i < CPIO_FS_FD_NR; i++) {
|
||||
if (fds[i].file_addr == 0) {
|
||||
fds[i].pid = thread_get_src_pid();
|
||||
fds[i].file_addr = file_addr;
|
||||
fds[i].file_size = file_size;
|
||||
fds[i].offset = offset;
|
||||
fds[i].type = type;
|
||||
if (fd)
|
||||
{
|
||||
if (fd) {
|
||||
*fd = i;
|
||||
}
|
||||
return fds + i;
|
||||
@@ -50,80 +46,67 @@ static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset,
|
||||
}
|
||||
static file_desc_t *fd_get(int fd)
|
||||
{
|
||||
if (fd < 0 || fd >= CPIO_FS_FD_NR)
|
||||
{
|
||||
if (fd < 0 || fd >= CPIO_FS_FD_NR) {
|
||||
return NULL;
|
||||
}
|
||||
if (fds[fd].file_addr == 0)
|
||||
{
|
||||
if (fds[fd].file_addr == 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (fds[fd].pid != thread_get_src_pid())
|
||||
{
|
||||
if (fds[fd].pid != thread_get_src_pid()) {
|
||||
return NULL;
|
||||
}
|
||||
return &fds[fd];
|
||||
}
|
||||
static void fd_free(int fd)
|
||||
{
|
||||
if (fd < 0 || fd >= CPIO_FS_FD_NR)
|
||||
{
|
||||
if (fd < 0 || fd >= CPIO_FS_FD_NR) {
|
||||
return;
|
||||
}
|
||||
if (fds[fd].file_addr)
|
||||
{
|
||||
if (fds[fd].pid == thread_get_src_pid())
|
||||
{
|
||||
if (fds[fd].file_addr) {
|
||||
if (fds[fd].pid == thread_get_src_pid()) {
|
||||
fds[fd].file_addr = 0;
|
||||
fds[fd].pid = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static sys_info_t sys_info;
|
||||
void fs_svr_init(void)
|
||||
{
|
||||
msg_tag_t tag;
|
||||
|
||||
fs_init(&fs);
|
||||
meta_reg_svr_obj(&fs.svr, FS_PROT);
|
||||
tag = sys_read_info(SYS_PROT, &sys_info, SYS_FLAGS_MAP_CPIO_FS);
|
||||
assert(msg_tag_get_val(tag) >= 0);
|
||||
}
|
||||
int fs_svr_open(const char *path, int flags, int mode)
|
||||
{
|
||||
msg_tag_t tag;
|
||||
sys_info_t sys_info;
|
||||
char *o_path;
|
||||
|
||||
if (flags & O_RDWR)
|
||||
{
|
||||
if (flags & O_RDWR) {
|
||||
return -EACCES;
|
||||
}
|
||||
if (flags & O_WRONLY)
|
||||
{
|
||||
if (flags & O_WRONLY) {
|
||||
return -EACCES;
|
||||
}
|
||||
if (path[0] == '/')
|
||||
{
|
||||
if (path[0] == '/') {
|
||||
path++;
|
||||
}
|
||||
|
||||
tag = sys_read_info(SYS_PROT, &sys_info);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
umword_t size;
|
||||
int type;
|
||||
umword_t addr;
|
||||
int ret = cpio_find_file((umword_t)sys_info.bootfs_start_addr,
|
||||
(umword_t)(-1), path, &size, &type, &addr);
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -ENOENT;
|
||||
}
|
||||
int fd;
|
||||
// 找到指定文件
|
||||
file_desc_t *fdp = fd_alloc(addr, size, 0, &fd, type);
|
||||
|
||||
if (!fdp)
|
||||
{
|
||||
if (!fdp) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
strncpy(fdp->open_name, path, 32);
|
||||
@@ -136,20 +119,17 @@ int fs_svr_read(int fd, void *buf, size_t len)
|
||||
{
|
||||
file_desc_t *fdp = fd_get(fd);
|
||||
|
||||
if (!fdp)
|
||||
{
|
||||
if (!fdp) {
|
||||
return -ENOENT;
|
||||
}
|
||||
if (fdp->type != 0)
|
||||
{
|
||||
if (fdp->type != 0) {
|
||||
return -EACCES;
|
||||
}
|
||||
size_t remain_size = fdp->file_size - fdp->offset;
|
||||
size_t read_size = 0;
|
||||
|
||||
read_size = MIN(remain_size, len);
|
||||
if (read_size)
|
||||
{
|
||||
if (read_size) {
|
||||
memcpy(buf, (void *)(fdp->file_addr + fdp->offset), read_size);
|
||||
fdp->offset += read_size;
|
||||
}
|
||||
@@ -159,8 +139,7 @@ int fs_svr_write(int fd, void *buf, size_t len)
|
||||
{
|
||||
file_desc_t *fdp = fd_get(fd);
|
||||
|
||||
if (!fdp)
|
||||
{
|
||||
if (!fdp) {
|
||||
return -ENOENT;
|
||||
}
|
||||
return -EACCES;
|
||||
@@ -174,38 +153,29 @@ int fs_svr_lseek(int fd, int offs, int whence)
|
||||
file_desc_t *file = fd_get(fd);
|
||||
int new_offs = 0;
|
||||
|
||||
if (!file)
|
||||
{
|
||||
if (!file) {
|
||||
return -ENOENT;
|
||||
}
|
||||
if (file->type != 0)
|
||||
{
|
||||
if (file->type != 0) {
|
||||
return -EACCES;
|
||||
}
|
||||
switch (whence)
|
||||
{
|
||||
switch (whence) {
|
||||
case SEEK_SET:
|
||||
new_offs = offs;
|
||||
break;
|
||||
case SEEK_END:
|
||||
{
|
||||
case SEEK_END: {
|
||||
new_offs = file->file_size + offs;
|
||||
}
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
{
|
||||
} break;
|
||||
case SEEK_CUR: {
|
||||
new_offs = offs + file->offset;
|
||||
}
|
||||
break;
|
||||
} break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
if (new_offs > file->file_size)
|
||||
{
|
||||
if (new_offs > file->file_size) {
|
||||
new_offs = file->file_size;
|
||||
}
|
||||
if (new_offs < 0)
|
||||
{
|
||||
if (new_offs < 0) {
|
||||
new_offs = 0;
|
||||
}
|
||||
file->offset = new_offs;
|
||||
@@ -225,12 +195,10 @@ int fs_svr_readdir(int fd, dirent_t *dir)
|
||||
file_desc_t *file = fd_get(fd);
|
||||
int new_offs = 0;
|
||||
|
||||
if (!file)
|
||||
{
|
||||
if (!file) {
|
||||
return -ENOENT;
|
||||
}
|
||||
if (file->type != 1)
|
||||
{
|
||||
if (file->type != 1) {
|
||||
return -EACCES;
|
||||
}
|
||||
umword_t size;
|
||||
@@ -239,8 +207,7 @@ int fs_svr_readdir(int fd, dirent_t *dir)
|
||||
const char *next_path;
|
||||
int ret = cpio_find_next(file->file_addr, file->open_name, &size, &type, &next_addr, &next_path);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
if (ret < 0) {
|
||||
return -ENOENT;
|
||||
}
|
||||
file->file_addr = next_addr;
|
||||
@@ -267,8 +234,7 @@ int fs_svr_fstat(int fd, stat_t *stat)
|
||||
{
|
||||
file_desc_t *file = fd_get(fd);
|
||||
|
||||
if (!file)
|
||||
{
|
||||
if (!file) {
|
||||
return -ENOENT;
|
||||
}
|
||||
stat->st_size = file->file_size;
|
||||
|
||||
@@ -37,7 +37,7 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
|
||||
msg_tag_t tag;
|
||||
sys_info_t sys_info;
|
||||
|
||||
tag = sys_read_info(SYS_PROT, &sys_info);
|
||||
tag = sys_read_info(SYS_PROT, &sys_info, 0);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
printf("read info is errno.\n");
|
||||
|
||||
Reference in New Issue
Block a user