fsrpc代码调整

This commit is contained in:
zhangzheng
2025-01-21 22:04:29 +08:00
parent a8dcccfd7b
commit 12eac3edf8
10 changed files with 589 additions and 613 deletions

View File

@@ -1,14 +1,37 @@
#pragma once
#include "u_rpc.h"
#include "u_rpc_svr.h"
#include "u_types.h"
#include "u_rpc.h"
typedef struct fs
{
typedef struct fs_operations {
int (*fs_svr_open)(const char *path, int flags, int mode);
int (*fs_svr_read)(int fd, void *buf, size_t len);
int (*fs_svr_write)(int fd, void *buf, size_t len);
void (*fs_svr_close)(int fd);
int (*fs_svr_readdir)(int fd, dirent_t *dir);
int (*fs_svr_lseek)(int fd, int offs, int whence);
int (*fs_svr_ftruncate)(int fd, off_t off);
int (*fs_svr_fstat)(int fd, void *buf);
int (*fs_svr_ioctl)(int fd, int req, void *arg);
int (*fs_svr_fcntl)(int fd, int cmd, void *arg);
int (*fs_svr_fsync)(int fd);
int (*fs_svr_unlink)(const char *path);
int (*fs_svr_symlink)(const char *existing, const char *new);
int (*fs_svr_mkdir)(char *path);
int (*fs_svr_rmdir)(char *path);
int (*fs_svr_rename)(char *old, char *new);
int (*fs_svr_stat)(const char *path, void *buf);
ssize_t (*fs_svr_readlink)(const char *path, char *buf, size_t bufsize);
int (*fs_svr_statfs)(const char *path, struct statfs *buf);
} fs_operations_t;
typedef struct fs {
rpc_svr_obj_t svr;
const fs_operations_t *op;
} fs_t;
void fs_init(fs_t *fs);
void fs_init(fs_t *fs, const fs_operations_t *op);
int fs_svr_open(const char *path, int flags, int mode);
int fs_svr_read(int fd, void *buf, size_t len);

View File

@@ -1,13 +1,12 @@
#include "fs_svr.h"
#include "fs_types.h"
#include "kstat.h"
#include "rpc_prot.h"
#include "u_hd_man.h"
#include "u_rpc.h"
#include "u_rpc_svr.h"
#include "u_hd_man.h"
#include "fs_svr.h"
#include "u_rpc.h"
#include "fs_types.h"
#include <stdio.h>
#include <sys/stat.h>
#include "kstat.h"
typedef struct kstat kstat_t;
RPC_TYPE_DEF_ALL(kstat_t)
/*open*/
@@ -17,7 +16,10 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_OPEN, open,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mode)
{
path->data[path->len - 1] = 0;
int ret = fs_svr_open((char *)(path->data), flags->data, mode->data);
if (!obj->op->fs_svr_open) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_open((char *)(path->data), flags->data, mode->data);
return ret;
}
@@ -29,7 +31,10 @@ RPC_GENERATION_DISPATCH3(fs_t, FS_PROT, FS_OPEN, open,
RPC_GENERATION_OP1(fs_t, FS_PROT, FS_CLOSE, close,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd)
{
fs_svr_close(fd->data);
if (!obj->op->fs_svr_close) {
return -ENOSYS;
}
obj->op->fs_svr_close(fd->data);
return 0;
}
@@ -42,10 +47,12 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_READ, read,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
{
int ret = fs_svr_read(fd->data, buf->data, len->data);
if (!obj->op->fs_svr_read) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_read(fd->data, buf->data, len->data);
if (ret >= 0)
{
if (ret >= 0) {
buf->len = ret;
}
return ret;
@@ -62,7 +69,10 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_WRITE, write,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, len)
{
int ret = fs_svr_write(fd->data, buf->data, len->data);
if (!obj->op->fs_svr_write) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_write(fd->data, buf->data, len->data);
return ret;
}
RPC_GENERATION_DISPATCH3(fs_t, FS_PROT, FS_WRITE, write,
@@ -75,7 +85,10 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_READDIR, readdir,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_dirent_t_t, rpc_dirent_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, dir)
{
return fs_svr_readdir(fd->data, &dir->data);
if (!obj->op->fs_svr_readdir) {
return -ENOSYS;
}
return obj->op->fs_svr_readdir(fd->data, &dir->data);
}
RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_READDIR, readdir,
@@ -88,7 +101,10 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_LSEEK, lseek,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, offs,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, whence)
{
int ret = fs_svr_lseek(fd->data, offs->data, whence->data);
if (!obj->op->fs_svr_lseek) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_lseek(fd->data, offs->data, whence->data);
return ret;
}
@@ -102,7 +118,10 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_FTRUNCATE, ftruncate,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_int64_t_t, rpc_int64_t_t, RPC_DIR_IN, RPC_TYPE_DATA, offs)
{
int ret = fs_svr_ftruncate(fd->data, offs->data);
if (!obj->op->fs_svr_ftruncate) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_ftruncate(fd->data, offs->data);
return ret;
}
@@ -114,7 +133,10 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_FSTAT, fstat,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd,
rpc_kstat_t_t, rpc_kstat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, statbuf)
{
int ret = fs_svr_fstat(fd->data, &statbuf->data);
if (!obj->op->fs_svr_fstat) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_fstat(fd->data, &statbuf->data);
return ret;
}
RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_FSTAT, fstat,
@@ -128,11 +150,14 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_IOCTL, ioctl,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, arg)
{
int ret = fs_svr_ioctl(fd->data, req->data, (void *)arg->data /*TODO:可能传递的内存指针*/);
if (!obj->op->fs_svr_ioctl) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_ioctl(fd->data, req->data, (void *)arg->data /*TODO:可能传递的内存指针*/);
return ret;
}
__attribute__((__weak__)) int fs_svr_ioctl(int fd, int req, void *arg)
__attribute__((__weak__)) int fs_svr_ioctl(int fd, int req, void *arg)
{
printf("%s is not support.\n", __func__);
return -ENOSYS;
@@ -148,7 +173,10 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_FCNTL, fcntl,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, cmd,
rpc_umword_t_t, rpc_umword_t_t, RPC_DIR_IN, RPC_TYPE_DATA, arg)
{
int ret = fs_svr_fcntl(fd->data, cmd->data, (void *)arg->data /*TODO:可能传递的内存指针*/);
if (!obj->op->fs_svr_fcntl) {
return -ENOSYS;
}
int ret = obj->op->fs_svr_fcntl(fd->data, cmd->data, (void *)arg->data /*TODO:可能传递的内存指针*/);
return ret;
}
@@ -161,7 +189,10 @@ RPC_GENERATION_DISPATCH3(fs_t, FS_PROT, FS_FCNTL, fcntl,
RPC_GENERATION_OP1(fs_t, FS_PROT, FS_FSYNC, fsync,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, fd)
{
return fs_svr_fsync(fd->data);
if (!obj->op->fs_svr_fsync) {
return -ENOSYS;
}
return obj->op->fs_svr_fsync(fd->data);
}
RPC_GENERATION_DISPATCH1(fs_t, FS_PROT, FS_FSYNC, fsync,
@@ -170,8 +201,11 @@ RPC_GENERATION_DISPATCH1(fs_t, FS_PROT, FS_FSYNC, fsync,
RPC_GENERATION_OP1(fs_t, FS_PROT, FS_UNLINK, unlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path)
{
if (!obj->op->fs_svr_unlink) {
return -ENOSYS;
}
path->data[path->len - 1] = 0;
return fs_svr_unlink(path->data);
return obj->op->fs_svr_unlink(path->data);
}
RPC_GENERATION_DISPATCH1(fs_t, FS_PROT, FS_UNLINK, unlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path)
@@ -180,10 +214,13 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_SYMLINK, symlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, src,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dst)
{
if (!obj->op->fs_svr_symlink) {
return -ENOSYS;
}
src->data[src->len - 1] = 0;
dst->data[dst->len - 1] = 0;
return fs_svr_symlink(src->data, src->data);
return obj->op->fs_svr_symlink(src->data, src->data);
}
RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_SYMLINK, symlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, src,
@@ -193,8 +230,11 @@ RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_SYMLINK, symlink,
RPC_GENERATION_OP1(fs_t, FS_PROT, FS_MKDIR, mkdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
{
if (!obj->op->fs_svr_mkdir) {
return -ENOSYS;
}
dir->data[dir->len - 1] = 0;
return fs_svr_mkdir(dir->data);
return obj->op->fs_svr_mkdir(dir->data);
}
RPC_GENERATION_DISPATCH1(fs_t, FS_PROT, FS_MKDIR, mkdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
@@ -202,8 +242,11 @@ RPC_GENERATION_DISPATCH1(fs_t, FS_PROT, FS_MKDIR, mkdir,
RPC_GENERATION_OP1(fs_t, FS_PROT, FS_RMDIR, rmdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
{
if (!obj->op->fs_svr_rmdir) {
return -ENOSYS;
}
dir->data[dir->len - 1] = 0;
return fs_svr_rmdir(dir->data);
return obj->op->fs_svr_rmdir(dir->data);
}
RPC_GENERATION_DISPATCH1(fs_t, FS_PROT, FS_RMDIR, rmdir,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, dir)
@@ -213,10 +256,13 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_RENAME, rename,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, old,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, new)
{
if (!obj->op->fs_svr_rename) {
return -ENOSYS;
}
old->data[old->len - 1] = 0;
new->data[new->len - 1] = 0;
return fs_svr_rename(old->data, new->data);
return obj->op->fs_svr_rename(old->data, new->data);
}
RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_RENAME, rename,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, old,
@@ -227,8 +273,11 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_STAT, stat,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_kstat_t_t, rpc_kstat_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf)
{
if (!obj->op->fs_svr_stat) {
return -ENOSYS;
}
path->data[path->len - 1] = 0;
return fs_svr_stat(path->data, &buf->data);
return obj->op->fs_svr_stat(path->data, &buf->data);
}
RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_STAT, stat,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
@@ -240,10 +289,13 @@ RPC_GENERATION_OP3(fs_t, FS_PROT, FS_READLINK, readlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, bufsize)
{
if (!obj->op->fs_svr_readlink) {
return -ENOSYS;
}
path->data[path->len - 1] = 0;
// buf->data[buf->len - 1] = 0;
return fs_svr_readlink(path->data, buf->data, MIN(bufsize->data, buf->len));
return obj->op->fs_svr_readlink(path->data, buf->data, MIN(bufsize->data, buf->len));
}
RPC_GENERATION_DISPATCH3(fs_t, FS_PROT, FS_READLINK, readlink,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
@@ -255,8 +307,11 @@ RPC_GENERATION_OP2(fs_t, FS_PROT, FS_STATFS, statfs,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_statfs_t_t, rpc_statfs_t_t, RPC_DIR_OUT, RPC_TYPE_DATA, buf)
{
if (!obj->op->fs_svr_statfs) {
return -ENOSYS;
}
path->data[path->len - 1] = 0;
return fs_svr_statfs(path->data, &buf->data);
return obj->op->fs_svr_statfs(path->data, &buf->data);
}
RPC_GENERATION_DISPATCH2(fs_t, FS_PROT, FS_STATFS, statfs,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
@@ -270,7 +325,8 @@ RPC_DISPATCH18(fs_t, FS_PROT, typeof(FS_OPEN), FS_OPEN, open, FS_READ, read,
FS_RMDIR, rmdir, FS_STAT, stat,
FS_READLINK, readlink, FS_STATFS, statfs, FS_IOCTL, ioctl)
void fs_init(fs_t *fs)
void fs_init(fs_t *fs, const fs_operations_t *op)
{
fs->op = op;
rpc_svr_obj_init(&fs->svr, rpc_fs_t_dispatch, FS_PROT);
}