Beispiel #1
0
/*
 *  ファイルマップ関数(mmap)
 */
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
{
	struct StdFileIndex *ps;
	StorageDevice_t     *psdev;

	if((ps = fdcheck(fd)) == 0)
		return (void*)-1;
	psdev = ps->sdmdev;
	if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_mmap != 0)
		return psdev->pdevff->_sdevff_mmap(start, length, prot, flags, ps->sdmfd, offset);
	else
		return (void*)-1;
}
Beispiel #2
0
static bool fdcheck()
{
	if(!fdfind_first())
	{
		if(fdexpand())
		{
			return fdcheck();
		}
		return false;
	}

	return true;
}
Beispiel #3
0
/*
 *  標準ファイルインターフェイス関数(write)
 */
long write(int fd, const void *buf, long count)
{
	struct StdFileIndex *ps;
	StorageDevice_t     *psdev;

	if((ps = fdcheck(fd)) == 0)
		return -1;
	psdev = ps->sdmdev;
	if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_write != 0)
		return psdev->pdevff->_sdevff_write(ps->sdmfd, buf, count);
	else
		return 0;
}
Beispiel #4
0
/*
 *  標準ファイルインターフェイス関数(lseek)
 */
off_t lseek(int fd, off_t offset, int whence)
{
	struct StdFileIndex *ps;
	StorageDevice_t     *psdev;

	if((ps = fdcheck(fd)) == 0)
		return -1;
	psdev = ps->sdmdev;
	if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_lseek != 0)
		return psdev->pdevff->_sdevff_lseek(ps->sdmfd, offset, whence);
	else
		return -1;
}
Beispiel #5
0
/*
 *  標準ファイルインターフェイス関数(fstat)
 */
int fstat(int fd, struct stat *buf)
{
	struct StdFileIndex *ps;
	StorageDevice_t     *psdev;

	if((ps = fdcheck(fd)) == 0)
		return -1;
	psdev = ps->sdmdev;
	if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_fstat != 0)
		return psdev->pdevff->_sdevff_fstat(ps->sdmfd, buf);
	else
		return -1;
}
Beispiel #6
0
/*
 *  標準ファイルインターフェイス関数(close)
 */
int close(int fd)
{
	struct StdFileIndex *ps;
	StorageDevice_t     *psdev;
	int             result;

	if((ps = fdcheck(fd)) == 0)
		return -1;
	wai_sem(SEM_STDFILE);
	psdev = ps->sdmdev;
	if(psdev->pdevff != 0 && psdev->pdevff->_sdevff_close != 0)
		result = psdev->pdevff->_sdevff_close(ps->sdmfd);
	else
		result = -1;
	ps->sdmfd = -1;
	sig_sem(SEM_STDFILE);
	return result;
}
Beispiel #7
0
uint32_t k_fopen(const char *path, uint32_t mode)
{
	file_t *file = NULL;
	file = k_malloc(sizeof(file_t));
	k_memset(file, 0, sizeof(file_t));

	if(!file)
		return 0;

	if(mode & FILE_OPEN_IN_VFS)
	{
		/* get file desc in vfs */
		if(!k_vfs_open_file(file, path, mode))
			goto failed;
	}

	if(!file->open)
		goto failed;

	if(!file->open(path, mode, file))
		goto failed;

	file->flags = mode;
	/* check next file descriptor is present */
	/* if not - fd array is full, and relocation failed */
	if(!fdcheck())
		goto failed;
	/* setup next file descriptor */
	fdt.fdarray[fdt.fdcounter] = file;
	file->fd = fdt.fdcounter;
	return fdt.fdcounter;

failed:
	k_free(file);
	return 0;
}
Beispiel #8
0
/*
 *  標準入出力ファイルの設定
 */
int _setupstd_file(FILE *st, int fd)
{
	struct StdFileIndex *ps;

	if(st == NULL)
		return 0;

	st->_func_in    = local_getc;
	st->_func_ins   = local_gets;
	st->_func_out   = local_putc;
	st->_func_outs  = local_puts;
	st->_func_flush = local_flush;

	if((ps = fdcheck(fd)) == 0){
		st->_file = -1;
		st->_dev  = 0;
		return 0;
	}
	else{
		st->_file       = ps->sdmfd;
		st->_dev        = ps->sdmdev;
		return 1;
	}
}