⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fslib.c

📁 微内核软实时操作系统
💻 C
字号:
/* * Copyright (c) 2007, Kohsuke Ohtani * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the author nor the names of any co-contributors  *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *//* * fslib.c - file system access libarary. */#include <prex/prex.h>#include <server/fs.h>#include <string.h>#include <stdarg.h>#include <errno.h>#include "fslib.h"static object_t __file_server;/* * Init */int fslib_init(void){	struct msg m;	int i, err;	__file_server = NULL;	thread_yield();	/*	 * Wait for server loading. timeout is 2 sec.	 */	for (i = 0; i < 200; i++) {		/* Look up file system server */		err = object_lookup(OBJNAME_FS, &__file_server);		if (err == 0)			break;		/* Wait 10msec */		timer_sleep(10, 0);		thread_yield();	}	if (err)		panic("fslib: can not find object");	/*	 * Register this task to fs server.	 */	m.hdr.code = FS_BOOT;	msg_send(__file_server, &m, sizeof(m));	if (m.hdr.status)		panic("fslib: can not register to fs");	return 0;}/* * Mount file system. */int fslib_mount(const char *dev, const char *dir, const char *fs,	  int flags, const void *data){	struct mount_msg m;	int err;	/*	 * Build mount message. No length check...	 */	strlcpy(m.dev, (char *)dev, PATH_MAX);	strlcpy(m.dir, (char *)dir, PATH_MAX);	strlcpy(m.fs, (char *)fs, 16);	if (data != NULL)		strlcpy(m.data, (char *)data, 64);	m.flags = flags;	/*	 * Request mount() for file server.	 */	do {		m.hdr.code = FS_MOUNT;		err = msg_send(__file_server, &m, sizeof(m));	} while (err == EINTR);	if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	return 0;}/* * File open */int fslib_open(char *path, int flags, ...){	struct open_msg m;	int err;	va_list args;	mode_t mode;	va_start(args, flags);	mode = va_arg(args, int);	va_end(args);	m.flags = flags;	m.mode = mode;	strlcpy(m.path, (char *)path, PATH_MAX);	do {		m.hdr.code = FS_OPEN;		err = msg_send(__file_server, &m, sizeof(m));	} while (err == EINTR);	if (err) {		errno = err;		return -1;	}	if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	return m.fd;}/* * File close */int fslib_close(int fd){	struct msg m;	int err;	m.hdr.code = FS_CLOSE;	m.data[0] = fd;	err = msg_send(__file_server, &m, sizeof(m));	if (err == EINTR)		errno = EINTR;	else if (err)		errno = ENOSYS;	else if (m.hdr.status)		errno = m.hdr.status;	else		return 0;	return -1;}/* * File stat */int fslib_fstat(int fd, struct stat *st){	struct stat_msg m;	int err;	do {		m.hdr.code = FS_FSTAT;		m.fd = fd;		err = msg_send(__file_server, &m, sizeof(m));	} while (err == EINTR);	if (err) {		errno = ENOSYS;		return -1;	} else if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	memcpy(st, &m.st, sizeof(struct stat));	return 0;}/* * File read */int fslib_read(int fd, void *buf, size_t len){	struct io_msg m;	int err;	m.hdr.code = FS_READ;	m.fd = fd;	m.buf = buf;	m.size = len;	err = msg_send(__file_server, &m, sizeof(m));	if (err) {		errno = err;		return -1;	}	if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	return m.size;}/* * File write */int fslib_write(int fd, void *buf, size_t len){	struct io_msg m;	int err;	m.hdr.code = FS_WRITE;	m.fd = fd;	m.buf = buf;	m.size = len;	err = msg_send(__file_server, &m, sizeof(m));	if (err) {		errno = err;		return -1;	}	if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	return m.size;}/* * Lseek */int fslib_lseek(int fd, off_t offset, int whence){	struct msg m;	int err;	do {		m.hdr.code = FS_LSEEK;		m.data[0] = fd;		m.data[1] = offset;		m.data[2] = whence;		err = msg_send(__file_server, &m, sizeof(m));	} while (err == EINTR);	if (err) {		errno = ENOSYS;		return -1;	} else if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	return m.data[0];}/* * Create directory */int fslib_mkdir(const char *path, mode_t mode){	struct open_msg m;	int err;	m.flags = 0;	m.mode = mode;	strlcpy(m.path, (char *)path, PATH_MAX);	do {		m.hdr.code = FS_MKDIR;		err = msg_send(__file_server, &m, sizeof(m));	} while (err == EINTR);	if (err) {		errno = err;		return -1;	}	if (m.hdr.status) {		errno = m.hdr.status;		return -1;	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -