[File system] Read/Write
#include "include/linux/fs.h"
// fs/read_write.c
mm_segment_t gSavedKernFS;
struct file* gFileKernFS;
loff_t gPosKernFS;
struct file* kernFS_open(char* pFilename, int readOnly)
{
if(! pFilename) return NULL;
// struct timeval tv;
// do_gettimeofday(&tv);
// pFilename = "/tmp/test_file";
gSavedKernFS = get_fs();
set_fs(KERNEL_DS);
if(readOnly) {
gFileKernFS = filp_open(pFilename, O_RDONLY, 0644);
} else {
gFileKernFS = filp_open(pFilename, O_APPEND | O_RDWR | O_CREAT, 0644);
}
if(IS_ERR(gFileKernFS))
{
printk("%s[%d] kernFS_open(%s) fail\n", __func__, __LINE__, pFilename);
goto fail_rollback;
}
gPosKernFS = 0;
return gFileKernFS;
fail_rollback:
set_fs(gSavedKernFS);
return NULL;
}
int kernFS_close()
{
if(gFileKernFS) {
filp_close(gFileKernFS, NULL);
gFileKernFS = NULL;
}
set_fs(gSavedKernFS);
memset(&gSavedKernFS, 0x00, sizeog(gSavedKernFS));
gPosKernFS = 0;
return 0;
}
// ssize_t vfs_write(struct file *file, const char __user *p, size_t count, loff_t *pos)
ssize_t kernFS_write(char* pBuff, size_t count)
{
if(! gFileKernFS) return -1;
if(! pBuff) return -1;
if(count < 1) return -1;
gPosKernFS = gFileKernFS->f_pos;
return vfs_write(gFileKernFS, pBuff, count, &gPosKernFS);
}
// ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
ssize_t kernFS_read(char* pBuff, size_t buffLen)
{
if(! pBuff) return -1;
if(! gFileKernFS) return -1;
return vfs_read(gFileKernFS, pBuff, buffLen, &gPosKernFS);
}