2023-12-02 00:27:57 +08:00
|
|
|
#include "cons_cli.h"
|
2025-01-08 20:21:09 +08:00
|
|
|
#include "ff.h"
|
|
|
|
|
#include "fs_svr.h"
|
2025-01-21 22:04:29 +08:00
|
|
|
#include "kstat.h"
|
2025-01-08 20:21:09 +08:00
|
|
|
#include "rpc_prot.h"
|
2023-10-02 00:22:13 +08:00
|
|
|
#include "u_env.h"
|
2025-01-08 20:21:09 +08:00
|
|
|
#include "u_log.h"
|
|
|
|
|
#include "u_rpc.h"
|
|
|
|
|
#include "u_rpc_svr.h"
|
|
|
|
|
#include "u_sig.h"
|
2025-03-02 23:31:22 +08:00
|
|
|
#include "pm_cli.h"
|
2023-12-02 22:02:56 +08:00
|
|
|
#include <assert.h>
|
2025-01-08 20:21:09 +08:00
|
|
|
#include <errno.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <stdio.h>
|
2023-12-02 23:15:33 +08:00
|
|
|
#include <string.h>
|
2025-03-03 23:03:28 +08:00
|
|
|
#include <u_malloc.h>
|
|
|
|
|
#include "fd.h"
|
2025-03-14 09:34:40 +08:00
|
|
|
#include "u_path.h"
|
|
|
|
|
|
2023-09-24 01:26:07 +08:00
|
|
|
static fs_t fs;
|
2023-12-16 23:08:43 +08:00
|
|
|
static int fs_sig_call_back(pid_t pid, umword_t sig_val);
|
2025-01-21 22:04:29 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
typedef struct file_desc_priv
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
|
|
|
|
union
|
|
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
FIL fp;
|
|
|
|
|
FATFS_DIR dir;
|
|
|
|
|
};
|
|
|
|
|
uint8_t type; //!< 0:file 1:dir
|
2025-03-03 23:03:28 +08:00
|
|
|
} file_desc_priv_t;
|
2023-09-24 01:26:07 +08:00
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
void fs_svr_close(int fd);
|
2023-11-12 00:25:47 +08:00
|
|
|
static int fatfs_err_conv(FRESULT res)
|
|
|
|
|
{
|
2025-03-02 23:31:22 +08:00
|
|
|
switch (res)
|
|
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
case FR_OK:
|
|
|
|
|
return 0;
|
|
|
|
|
case FR_DISK_ERR:
|
|
|
|
|
return -EIO;
|
|
|
|
|
case FR_NO_FILE:
|
|
|
|
|
return -ENOENT;
|
|
|
|
|
case FR_NO_PATH:
|
|
|
|
|
return -ENOENT;
|
|
|
|
|
case FR_INVALID_NAME:
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
case FR_DENIED:
|
|
|
|
|
return -EPERM;
|
|
|
|
|
case FR_EXIST:
|
|
|
|
|
return -EEXIST;
|
|
|
|
|
case FR_WRITE_PROTECTED:
|
|
|
|
|
return -EIO;
|
|
|
|
|
case FR_TIMEOUT:
|
|
|
|
|
return -ETIMEDOUT;
|
|
|
|
|
case FR_NOT_ENOUGH_CORE:
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
case FR_INVALID_PARAMETER:
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
default:
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-09-24 01:26:07 +08:00
|
|
|
int fs_svr_open(const char *path, int flags, int mode)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
2023-12-16 23:08:43 +08:00
|
|
|
pid_t pid = thread_get_src_pid();
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_priv_t *file = NULL;
|
2023-09-24 01:26:07 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
file = u_malloc(sizeof(*file));
|
|
|
|
|
if (file == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-09-24 01:26:07 +08:00
|
|
|
return -ENOMEM;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
|
|
|
|
|
fd = file_desc_alloc(pid, file, fs_svr_close);
|
|
|
|
|
|
|
|
|
|
if (fd < 0)
|
|
|
|
|
{
|
|
|
|
|
u_free(file);
|
|
|
|
|
return fd;
|
|
|
|
|
}
|
2023-10-02 00:22:13 +08:00
|
|
|
int new_mode = 0;
|
|
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
switch (flags & O_ACCMODE)
|
|
|
|
|
{
|
2023-10-02 00:22:13 +08:00
|
|
|
case O_RDWR:
|
|
|
|
|
new_mode |= FA_READ;
|
|
|
|
|
new_mode |= FA_WRITE;
|
|
|
|
|
break;
|
|
|
|
|
case O_RDONLY:
|
|
|
|
|
new_mode |= FA_READ;
|
|
|
|
|
break;
|
|
|
|
|
case O_WRONLY:
|
|
|
|
|
new_mode |= FA_WRITE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-03-02 23:31:22 +08:00
|
|
|
if ((flags & O_CREAT) && (flags & O_EXCL))
|
|
|
|
|
{
|
2023-10-02 00:22:13 +08:00
|
|
|
new_mode |= FA_CREATE_NEW;
|
2025-03-02 23:31:22 +08:00
|
|
|
}
|
|
|
|
|
else if ((flags & O_CREAT))
|
|
|
|
|
{
|
2023-10-02 00:22:13 +08:00
|
|
|
new_mode |= FA_OPEN_ALWAYS;
|
|
|
|
|
}
|
2025-03-02 23:31:22 +08:00
|
|
|
if (flags & O_APPEND)
|
|
|
|
|
{
|
2023-10-02 00:22:13 +08:00
|
|
|
new_mode |= FA_OPEN_APPEND;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FRESULT ret = f_open(&file->fp, path, new_mode);
|
2023-09-24 01:26:07 +08:00
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK)
|
|
|
|
|
{
|
|
|
|
|
if (ret == FR_NO_FILE || ret == FR_INVALID_NAME)
|
|
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
// 打开的是一个目录,则作为一个目录打开
|
|
|
|
|
ret = f_opendir(&file->dir, path);
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK)
|
|
|
|
|
{
|
2023-12-02 00:27:57 +08:00
|
|
|
cons_write_str("open fail..\n");
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_free(fd);
|
|
|
|
|
u_free(file);
|
2023-11-12 00:25:47 +08:00
|
|
|
return fatfs_err_conv(ret);
|
|
|
|
|
}
|
|
|
|
|
file->type = 1;
|
2023-12-02 23:15:33 +08:00
|
|
|
// cons_write_str("open dir..\n");
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2025-03-02 23:31:22 +08:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
file->type = 0;
|
2023-12-02 22:02:56 +08:00
|
|
|
// cons_write_str("open file..\n");
|
2023-09-24 01:26:07 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK)
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_free(fd);
|
|
|
|
|
u_free(file);
|
2023-12-08 23:55:00 +08:00
|
|
|
return fatfs_err_conv(ret);
|
|
|
|
|
}
|
2023-12-23 16:17:15 +08:00
|
|
|
#ifdef CONFIG_USING_SIG
|
2023-12-16 23:08:43 +08:00
|
|
|
int w_ret = pm_sig_watch(pid, 0 /*TODO:现在只有kill */);
|
2025-03-02 23:31:22 +08:00
|
|
|
if (w_ret < 0)
|
|
|
|
|
{
|
2023-12-16 23:08:43 +08:00
|
|
|
printf("pm wath pid %d err.\n", w_ret);
|
|
|
|
|
}
|
2023-12-23 16:17:15 +08:00
|
|
|
#endif
|
2023-12-08 23:55:00 +08:00
|
|
|
return fd;
|
2023-09-24 01:26:07 +08:00
|
|
|
}
|
|
|
|
|
|
2023-09-24 19:26:05 +08:00
|
|
|
int fs_svr_read(int fd, void *buf, size_t len)
|
|
|
|
|
{
|
|
|
|
|
UINT br;
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2023-09-24 19:26:05 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-09-24 19:26:05 +08:00
|
|
|
return -ENOENT;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
|
|
|
|
if (file_priv->type != 0)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return -EACCES;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
FRESULT ret = f_read(&file_priv->fp, buf, len, &br);
|
2023-09-24 19:26:05 +08:00
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK)
|
|
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return fatfs_err_conv(ret);
|
2023-09-24 19:26:05 +08:00
|
|
|
}
|
|
|
|
|
return br;
|
|
|
|
|
}
|
|
|
|
|
int fs_svr_write(int fd, void *buf, size_t len)
|
|
|
|
|
{
|
|
|
|
|
UINT bw;
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2023-09-24 19:26:05 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-09-24 19:26:05 +08:00
|
|
|
return -ENOENT;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
|
|
|
|
if (file_priv->type != 0)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return -EACCES;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
FRESULT ret = f_write(&file_priv->fp, buf, len, &bw);
|
2023-09-24 19:26:05 +08:00
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK)
|
|
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return fatfs_err_conv(ret);
|
2023-09-24 19:26:05 +08:00
|
|
|
}
|
|
|
|
|
return bw;
|
|
|
|
|
}
|
|
|
|
|
void fs_svr_close(int fd)
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2023-09-24 19:26:05 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-09-24 19:26:05 +08:00
|
|
|
return;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
|
|
|
|
|
|
|
|
|
switch (file_priv->type)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
case 0:
|
2025-03-03 23:03:28 +08:00
|
|
|
f_close(&file_priv->fp);
|
2023-11-12 00:25:47 +08:00
|
|
|
break;
|
|
|
|
|
case 1:
|
2025-03-03 23:03:28 +08:00
|
|
|
f_closedir(&file_priv->dir);
|
2023-11-12 00:25:47 +08:00
|
|
|
break;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv->fp.obj.fs = NULL;
|
|
|
|
|
file_desc_free_unlock(fd);
|
|
|
|
|
u_free(file_priv);
|
2023-09-24 19:26:05 +08:00
|
|
|
}
|
2024-09-12 14:16:30 +08:00
|
|
|
int fs_svr_readdir(int fd, dirent_t *dir)
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2024-09-12 14:16:30 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
return -ENOENT;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
2024-09-12 14:16:30 +08:00
|
|
|
FILINFO info;
|
2025-03-03 23:03:28 +08:00
|
|
|
FRESULT ret = f_readdir(&file_priv->dir, &info);
|
2024-09-12 14:16:30 +08:00
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK || info.fname[0] == 0)
|
|
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
return -ENOENT;
|
|
|
|
|
}
|
|
|
|
|
strncpy(dir->d_name, info.fname, sizeof(dir->d_name));
|
|
|
|
|
dir->d_name[sizeof(dir->d_name) - 1] = 0;
|
|
|
|
|
dir->d_reclen = sizeof(*dir);
|
|
|
|
|
dir->d_off = 0;
|
2025-03-02 23:31:22 +08:00
|
|
|
if (info.fattrib & AM_DIR)
|
|
|
|
|
{ /* Directory */
|
2024-09-12 14:16:30 +08:00
|
|
|
dir->d_type = DT_DIR;
|
2025-03-02 23:31:22 +08:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ /* File */
|
2024-09-12 14:16:30 +08:00
|
|
|
dir->d_type = DT_CHR;
|
|
|
|
|
}
|
|
|
|
|
return sizeof(*dir);
|
|
|
|
|
}
|
2023-09-24 19:26:05 +08:00
|
|
|
int fs_svr_lseek(int fd, int offs, int whence)
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
|
|
|
|
|
2023-09-24 19:26:05 +08:00
|
|
|
int new_offs = 0;
|
|
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-09-24 19:26:05 +08:00
|
|
|
return -ENOENT;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
|
|
|
|
|
|
|
|
|
if (file_priv->type != 0)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return -EACCES;
|
|
|
|
|
}
|
2025-03-02 23:31:22 +08:00
|
|
|
switch (whence)
|
|
|
|
|
{
|
2023-09-24 19:26:05 +08:00
|
|
|
case SEEK_SET:
|
|
|
|
|
new_offs = offs;
|
|
|
|
|
break;
|
2025-03-02 23:31:22 +08:00
|
|
|
case SEEK_END:
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
new_offs = f_size(&file_priv->fp) + offs;
|
2025-03-02 23:31:22 +08:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SEEK_CUR:
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
new_offs = offs + f_tell(&file_priv->fp);
|
2025-03-02 23:31:22 +08:00
|
|
|
}
|
|
|
|
|
break;
|
2023-09-24 19:26:05 +08:00
|
|
|
default:
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
2025-01-21 22:04:29 +08:00
|
|
|
#if 0
|
2025-03-03 23:03:28 +08:00
|
|
|
if (new_offs > f_size(&file_priv->fp)) {
|
|
|
|
|
new_offs = f_size(&file_priv->fp);
|
2023-09-24 19:26:05 +08:00
|
|
|
}
|
2025-01-21 22:04:29 +08:00
|
|
|
#endif
|
2025-03-02 23:31:22 +08:00
|
|
|
if (new_offs < 0)
|
|
|
|
|
{
|
2023-09-24 19:26:05 +08:00
|
|
|
new_offs = 0;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
FRESULT ret = f_lseek(&file_priv->fp, new_offs);
|
2023-09-24 19:26:05 +08:00
|
|
|
|
2023-11-12 00:25:47 +08:00
|
|
|
return fatfs_err_conv(ret);
|
2023-09-24 19:26:05 +08:00
|
|
|
}
|
2023-11-12 00:25:47 +08:00
|
|
|
int fs_svr_ftruncate(int fd, off_t off)
|
|
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2023-11-12 00:25:47 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return -ENOENT;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
|
|
|
|
if (file_priv->type != 0)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2023-11-12 00:25:47 +08:00
|
|
|
return -EACCES;
|
|
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
FRESULT ret = f_truncate(&file_priv->fp);
|
2023-11-12 00:25:47 +08:00
|
|
|
|
|
|
|
|
return fatfs_err_conv(ret);
|
|
|
|
|
}
|
2025-01-08 20:21:09 +08:00
|
|
|
int fs_svr_fstat(int fd, void *_stat)
|
2023-11-12 00:25:47 +08:00
|
|
|
{
|
2025-01-08 20:21:09 +08:00
|
|
|
struct kstat *stat = _stat;
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2023-11-12 00:25:47 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
return -ENOENT;
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
2024-09-12 14:16:30 +08:00
|
|
|
memset(stat, 0, sizeof(*stat));
|
2025-03-03 23:03:28 +08:00
|
|
|
stat->st_size = file_priv->type == 1 ? 0 : f_size(&file_priv->fp);
|
|
|
|
|
stat->st_mode = file_priv->type == 1 ? S_IFDIR : S_IFREG;
|
2024-09-12 14:16:30 +08:00
|
|
|
stat->st_blksize = 0;
|
|
|
|
|
return 0;
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2024-09-12 14:16:30 +08:00
|
|
|
int fs_svr_ioctl(int fd, int req, void *arg)
|
|
|
|
|
{
|
2025-01-08 20:21:09 +08:00
|
|
|
return 0; /*TODO:*/
|
2024-09-12 14:16:30 +08:00
|
|
|
}
|
|
|
|
|
int fs_svr_fsync(int fd)
|
2023-11-12 00:25:47 +08:00
|
|
|
{
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_t *file = file_desc_get(fd);
|
|
|
|
|
file_desc_priv_t *file_priv = NULL;
|
2023-11-12 00:25:47 +08:00
|
|
|
|
2025-03-03 23:03:28 +08:00
|
|
|
if (!file || file->priv == NULL)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
return -EBADFD;
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
file_priv = file->priv;
|
|
|
|
|
if (file_priv->type != 0)
|
2025-03-02 23:31:22 +08:00
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
return -EBADFD;
|
2023-12-02 23:15:33 +08:00
|
|
|
}
|
2025-03-03 23:03:28 +08:00
|
|
|
f_sync(&file_priv->fp);
|
2024-09-12 14:16:30 +08:00
|
|
|
return 0;
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2024-09-12 14:16:30 +08:00
|
|
|
int fs_svr_unlink(const char *path)
|
2023-11-12 00:25:47 +08:00
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
FRESULT ret = f_unlink(path);
|
2024-08-27 23:02:54 +08:00
|
|
|
|
|
|
|
|
return fatfs_err_conv(ret);
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2024-09-12 14:16:30 +08:00
|
|
|
int fs_svr_symlink(const char *existing, const char *new)
|
2023-11-12 00:25:47 +08:00
|
|
|
{
|
2024-09-12 14:16:30 +08:00
|
|
|
return -ENOSYS;
|
|
|
|
|
}
|
|
|
|
|
int fs_svr_mkdir(char *path)
|
|
|
|
|
{
|
|
|
|
|
FRESULT ret = f_mkdir(path);
|
2024-08-27 23:02:54 +08:00
|
|
|
|
|
|
|
|
return fatfs_err_conv(ret);
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2024-09-12 14:16:30 +08:00
|
|
|
int fs_svr_rmdir(char *path)
|
|
|
|
|
{
|
|
|
|
|
return -ENOSYS;
|
|
|
|
|
}
|
|
|
|
|
int fs_svr_rename(char *oldname, char *newname)
|
2023-11-12 00:25:47 +08:00
|
|
|
{
|
2024-08-27 23:02:54 +08:00
|
|
|
return fatfs_err_conv(f_rename(oldname, newname));
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2025-01-08 20:21:09 +08:00
|
|
|
int fs_svr_stat(const char *path, void *_buf)
|
2023-11-12 00:25:47 +08:00
|
|
|
{
|
2025-01-08 20:21:09 +08:00
|
|
|
FILINFO INFO;
|
|
|
|
|
FRESULT ret;
|
2025-01-21 22:04:29 +08:00
|
|
|
struct kstat *buf = (struct kstat *)_buf;
|
2025-01-08 20:21:09 +08:00
|
|
|
|
2025-03-02 23:31:22 +08:00
|
|
|
if (u_is_root_path(path))
|
|
|
|
|
{
|
|
|
|
|
buf->st_size = 0;
|
|
|
|
|
buf->st_mode = S_IFDIR;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2025-01-08 20:21:09 +08:00
|
|
|
ret = f_stat(path, &INFO);
|
2025-03-02 23:31:22 +08:00
|
|
|
if (ret != FR_OK)
|
|
|
|
|
{
|
2025-01-08 20:21:09 +08:00
|
|
|
return fatfs_err_conv(ret);
|
|
|
|
|
}
|
|
|
|
|
memset(buf, 0, sizeof(*buf));
|
|
|
|
|
buf->st_size = INFO.fsize;
|
|
|
|
|
buf->st_mode = (INFO.fattrib & AM_DIR) ? S_IFDIR : S_IFREG;
|
|
|
|
|
return 0;
|
2024-09-12 14:16:30 +08:00
|
|
|
}
|
|
|
|
|
ssize_t fs_svr_readlink(const char *path, char *buf, size_t bufsize)
|
|
|
|
|
{
|
|
|
|
|
return -ENOSYS;
|
2023-11-12 00:25:47 +08:00
|
|
|
}
|
2024-09-12 14:16:30 +08:00
|
|
|
|
|
|
|
|
int fs_svr_statfs(const char *path, struct statfs *buf)
|
2023-12-10 23:51:39 +08:00
|
|
|
{
|
|
|
|
|
return -ENOSYS;
|
|
|
|
|
}
|
2025-01-21 22:04:29 +08:00
|
|
|
static const fs_operations_t ops =
|
|
|
|
|
{
|
|
|
|
|
.fs_svr_open = fs_svr_open,
|
|
|
|
|
.fs_svr_read = fs_svr_read,
|
|
|
|
|
.fs_svr_write = fs_svr_write,
|
|
|
|
|
.fs_svr_close = fs_svr_close,
|
|
|
|
|
.fs_svr_readdir = fs_svr_readdir,
|
|
|
|
|
.fs_svr_lseek = fs_svr_lseek,
|
|
|
|
|
.fs_svr_ftruncate = fs_svr_ftruncate,
|
|
|
|
|
.fs_svr_fstat = fs_svr_fstat,
|
|
|
|
|
.fs_svr_ioctl = fs_svr_ioctl,
|
|
|
|
|
// .fs_svr_fcntl = fs_svr_fcntl,
|
|
|
|
|
.fs_svr_fsync = fs_svr_fsync,
|
|
|
|
|
.fs_svr_unlink = fs_svr_unlink,
|
|
|
|
|
.fs_svr_symlink = fs_svr_symlink,
|
|
|
|
|
.fs_svr_mkdir = fs_svr_mkdir,
|
|
|
|
|
.fs_svr_rmdir = fs_svr_rmdir,
|
|
|
|
|
.fs_svr_rename = fs_svr_rename,
|
|
|
|
|
.fs_svr_stat = fs_svr_stat,
|
|
|
|
|
.fs_svr_readlink = fs_svr_readlink,
|
|
|
|
|
};
|
|
|
|
|
void fs_svr_init(void)
|
|
|
|
|
{
|
|
|
|
|
fs_init(&fs, &ops);
|
|
|
|
|
meta_reg_svr_obj(&fs.svr, FS_PROT);
|
2025-03-03 23:03:28 +08:00
|
|
|
file_desc_init();
|
2025-01-21 22:04:29 +08:00
|
|
|
}
|