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

📄 fileio.c

📁 T-kernel 的extension源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_chmod err=%#x\n", err));	return err;}LOCAL ER _u_fchmod( FS *fs, CmdPkt *pkt ){	SF_FCHMOD_PARA	*para = pkt->cmd.para;	FDPkt		fdp;	ER		err;	/* Search of file descriptor */	fdp.fd = searchFileDescriptor(pkt->uxinfo, para->fd);	if (( fdp.fd == NULL )||( fdp.fd->fs != fs )) {		err = E_FD;		goto err_ret;	}	fdp.fdno = para->fd;	/* Check of file system */	if ( fs == (FS*)&STDIO_FS ) {		err = E_FD;		goto err_ret;	} else if ( fs == (FS*)&ROOT_FS ) {		err = E_RONLY;		goto err_ret;	}	/* Modification of file mode */	if ( fs == (FS*)&STD_FS ) {		err = sf_fchmod(&fdp, para->mode);	} else {		/* Writing access of file system */		if ( fs->rdonly != 0 ) {			err = E_RONLY;			goto err_ret;		}		err = (*fs->u_fchmod)(&fdp, para->mode);	}	if ( err < E_OK ) {		goto err_ret;	}	return err;err_ret:	DEBUG_PRINT(("_u_fchmod err=%#x\n", err));	return err;}/* * Creation of directory */LOCAL ER _u_mkdir( FS *fs, CmdPkt *pkt ){	SF_MKDIR_PARA	*para = pkt->cmd.para;	LPINF		*lp = pkt->exinf;	INODE		*inode = lp->inode;	mode_t		mode;	ER		err;	/* Check of file system */	if ( fs == (FS*)&STDIO_FS ) {		err = E_PAR;		goto err_ret;	} else if ( fs == (FS*)&ROOT_FS ) {		err = E_OBJ;		goto err_ret;	}	/* Existence of directory */	if ( inode->ino != NOEXS_INO ) {		err = E_OBJ;		goto err_ret;	}	/* File creation mode */	mode = (mode_t)para->mode & ~(pkt->uxinfo->cmask);	/* Directory creation */	if ( fs == (FS*)&STD_FS ) {		err = sf_mkdir(inode, lp->path, mode);		if ( err < E_OK ) {			goto err_ret;		}	} else {		/* Writing access of file system */		if ( fs->rdonly != 0 ) {			err = E_RONLY;			goto err_ret;		}		err = (*fs->u_mkdir)(fs, inode, lp->path, mode);		if ( err < E_OK ) {			goto err_ret;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Deletion of file reference node */	inode_Free(fs, inode);	return E_OK;err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_mkdir err = %#x\n", err));	return err;}/* * Deletion of directory */LOCAL ER _u_rmdir( FS *fs, CmdPkt *pkt ){	LPINF	*lp = pkt->exinf;	INODE	*inode = lp->inode;	B	*sp, *ep;	ER	err;	/* Check of file system */	if ( fs == (FS*)&STDIO_FS ) {		err = E_PAR;		goto err_ret;	} else if ( fs == (FS*)&ROOT_FS ) {		err = E_BUSY;		goto err_ret;	}	/* Existence of directory */	if ( inode->ino == NOEXS_INO ) {		err = E_NOEXS;		goto err_ret;	}	/* Check of file type */	if (( fs != (FS*)&STD_FS )&&( inode->type != DT_DIR )) {		err = toERUX(ENOTDIR);		goto err_ret;	}	/* Root directory of file system */	if ( fs != (FS*)&STD_FS ) {		if ( inode->ino == fs->rootino ) {			err = E_FACV;			goto err_ret;		}	} else {		if ( inode->ino == SROOT_INO ) {			err = E_FACV;			goto err_ret;		}	}	/* Check of file name */	sp = lp->path;	ep = strchr(sp, '/');	if ( ep == NULL ) {		ep = strchr(sp, '\0');	}	if (( ep == NULL )||	    (((ep - sp) == 1 )&&( strncmp(sp, ".", (size_t)1) == 0)) ||	    (((ep - sp) == TSD_FIO_VAL_2 )&&( strncmp(sp, "..", (size_t)TSD_FIO_SZT_2) == 0) )) {		err = E_PAR;		goto err_ret;	}	/* Check of the number of references */	if ( inode->refcnt > 0 ) {		err = E_BUSY;		goto err_ret;	}	/* Deletion of directory */	if ( fs == (FS*)&STD_FS ) {		err = sf_rmdir(inode);		if ( err < E_OK ) {			goto err_ret;		}	} else {		/* Writing access of file system */		if ( fs->rdonly != 0 ) {			err = E_RONLY;			goto err_ret;		}		err = (*fs->u_rmdir)(fs, inode);		if ( err < E_OK ) {			goto err_ret;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Deletion of file reference node */	inode_Free(fs, inode);	return E_OK;err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_rmdir err = %#x\n", err));	return err;}/* * Creation of file */LOCAL WER _u_creat( FS *fs, CmdPkt *pkt ){	SF_CREAT_PARA	*para = pkt->cmd.para;	LPINF		*lp = pkt->exinf;	INODE		*inode = lp->inode;	FDPkt		fdp;	mode_t		mode;	W		fildes;	ER		err;	/* Check of file system */	if ( fs == (FS*)&STDIO_FS ) {		err = E_PAR;		goto err_ret1;	} else if ( fs == (FS*)&ROOT_FS ) {		err = E_RONLY;		goto err_ret1;	}	/* Creation of file descriptor */	err = new_FileDescriptor(fs, &fdp, pkt->uxinfo);	if ( err < E_OK ) {		goto err_ret1;	}	/* File creation mode */	mode = (mode_t)para->mode & ~(pkt->uxinfo->cmask);	/* Creation of file */	fdp.fd->inode = inode;	if ( fs == (FS*)&STD_FS ) {		fildes = sf_open(&fdp, lp->path,				 (O_CREAT | O_WRONLY | O_TRUNC),				 mode);		if ( fildes < E_OK ) {			err = fildes;			goto err_ret2;		}	} else {		/* Writing access of file system */		if ( fs->rdonly != 0 ) {			err = E_RONLY;			goto err_ret2;		}		fildes = (*fs->u_open)(&fdp, lp->path,				       (O_CREAT | O_WRONLY | O_TRUNC),				       mode);		if ( fildes < E_OK ) {			err = fildes;			goto err_ret2;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret2;		}	}	/* Registration of file reference node */	inode_Register(fs, inode, O_WRONLY);	return fildes;err_ret2:	fdp.fd->inode = NULL;	(void)del_FileDescriptor(pkt->uxinfo, &fdp);err_ret1:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_creat err=%#x\n", err));	return err;}/* * Modification of access time and correction time */LOCAL ER _u_utimes( FS *fs, CmdPkt *pkt ){	SF_UTIMES_PARA	*para = pkt->cmd.para;	LPINF		*lp = pkt->exinf;	INODE		*inode = lp->inode;	ER		err;	/* Check of file system */	if ( fs == (FS*)&STDIO_FS ) {		err = E_PAR;		goto err_ret;	} else if ( fs == (FS*)&ROOT_FS ) {		err = E_RONLY;		goto err_ret;	}	if ( para->times != NULL ) {		/* Parameter check */		err = CheckSpaceRW((VP)para->times, sizeof(struct timeval) * TSD_UUT_VAL_2);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Existence of file */	if ( inode->ino == NOEXS_INO ) {		err = E_NOEXS;		goto err_ret;	}	/* Modification of time */	if ( fs == (FS*)&STD_FS ) {		err = sf_utimes(inode, para->times);		if ( err < E_OK ) {			goto err_ret;		}	} else {		/* Writing access of file system */		if ( fs->rdonly != 0 ) {			err = E_RONLY;			goto err_ret;		}		err = (*fs->u_utimes)(fs, inode, para->times);		if ( err < E_OK ) {			goto err_ret;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Deletion of file reference node */	inode_Free(fs, inode);	return E_OK;err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_utimes err=%#x\n", err));	return err;}/* * Configuration of file creation mask *	No calling from task */LOCAL WER _u_umask( FS *fs, CmdPkt *pkt ){	SF_UMASK_PARA	*para = pkt->cmd.para;	UXINFO		*uxinfo = pkt->uxinfo;	W		oldm;	oldm = (W)uxinfo->cmask;	uxinfo->cmask = para->cmask;	return oldm;}/* * Configure the file size to the designated length */LOCAL ER _u_truncate( FS *fs, CmdPkt *pkt ){	SF_TRUNCATE_PARA	*para = pkt->cmd.para;	LPINF			*lp = pkt->exinf;	INODE			*inode = lp->inode;	ER			err;	/* Check of file system */	if (( fs == (FS*)&ROOT_FS )||( fs == (FS*)&STDIO_FS )) {		err = E_PAR;		goto err_ret;	} else if ( fs == (FS*)&ROOT_FS ) {		err = toERUX(EISDIR);		goto err_ret;	}	/* Existence of file */	if ( inode->ino == NOEXS_INO ) {		err = E_NOEXS;		goto err_ret;	}	/* Check of file type */	if ( inode->type != DT_REG ) {		err = toERUX(EISDIR);		goto err_ret;	}	/* Configure the file size to the designated length */	if ( fs == (FS*)&STD_FS ) {		err = sf_truncate(inode, para->length);		if ( err < E_OK ) {			goto err_ret;		}	} else {		/* Writing access of file system */		if ( fs->rdonly != 0 ) {			err = E_RONLY;			goto err_ret;		}		err = (*fs->u_truncate)(fs, inode, para->length);		if ( err < E_OK ) {			goto err_ret;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Deletion of file reference node */	inode_Free(fs, inode);	return E_OK;err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_truncate err=%#x\n", err));	return err;}LOCAL ER _u_ftruncate( FS *fs, CmdPkt *pkt ){	SF_FTRUNCATE_PARA	*para = pkt->cmd.para;	FD			*fd;	FDPkt			fdp;	ER			err;	/* Search of file descriptor */	fd = searchFileDescriptor(pkt->uxinfo, para->fildes);	if (( fd == NULL )||( fd->fs != fs )) {		err = E_FD;		goto err_ret;	}	fdp.fd = fd;	fdp.fdno = para->fildes;	/* Check of file type */	if (( fs == (FS*)&ROOT_FS )||	    ((fd->inode != NULL )&&( fd->inode->type != DT_REG))) {		err = toERUX(EISDIR);		goto err_ret;	}	/* Check of open mode */	if ( (fd->omode & O_ACCMODE) ==  O_RDONLY ) {		err = E_FD;		goto err_ret;	}	/* Check of file system */	if ( fs == (FS*)&STDIO_FS ) {		err = E_FD;		goto err_ret;	}	/* Modification of file mode */	if ( fs == (FS*)&STD_FS ) {		err = sf_ftruncate(&fdp, para->length);	} else {		err = (*fs->u_ftruncate)(&fdp, para->length);	}	if ( err < E_OK ) {		goto err_ret;	}	return err;err_ret:	DEBUG_PRINT(("_u_ftruncate err=%#x\n", err));	return err;}/* * Synchronization of disk */LOCAL ER _u_sync( FS *fs, CmdPkt *pkt ){	ER	err;	if ( fs == (FS*)&STD_FS ) {		err = tkse_syn_fls();		if ( err < E_OK ) {			goto err_ret;		}	} else {		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	return E_OK;err_ret:	DEBUG_PRINT(("_u_sync err=%#x\n", err));	return err;}/* * Acquisition of file information */LOCAL ER _u_stat( FS *fs, CmdPkt *pkt ){	SF_STAT_PARA	*para = pkt->cmd.para;	LPINF		*lp = pkt->exinf;	INODE		*inode = lp->inode;	ER		err;	/* Parameter check */	err = CheckSpaceRW((VP)para->sb, sizeof(struct stat));	if ( err < E_OK ) {		goto err_ret;	}	/* Existence of file */	if (( fs != (FS*)&ROOT_FS )&&( fs != (FS*)&STDIO_FS )) {		if ( inode->ino == NOEXS_INO ) {			err = E_NOEXS;			goto err_ret;		}	}	/* Acquisition of file information */	if ( fs == (FS*)&STD_FS ) {		err = sf_stat(inode, para->sb);		if ( err < E_OK ) {			goto err_ret;		}	} else if ( fs == (FS*)&ROOT_FS ) {		err = rt_stat(para->sb);		if ( err < E_OK ) {			goto err_ret;		}	} else if ( fs == (FS*)&STDIO_FS ) {		err = E_NOSPT;		goto err_ret;	} else {		err = (*fs->u_stat)(fs, inode, para->sb);		if ( err < E_OK ) {			goto err_ret;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Deletion of file reference node */	inode_Free(fs, inode);	return E_OK;err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_stat err=%#x\n", err));	return err;}LOCAL ER _u_lstat( FS *fs, CmdPkt *pkt ){	SF_LSTAT_PARA	*para = pkt->cmd.para;	LPINF		*lp = pkt->exinf;	INODE		*inode = lp->inode;	ER		err;	/* Parameter check */	err = CheckSpaceRW((VP)para->sb, sizeof(struct stat));	if ( err < E_OK ) {		goto err_ret;	}	/* Existence of file */	if (( fs != (FS*)&ROOT_FS )&&( fs != (FS*)&STDIO_FS )) {		if ( inode->ino == NOEXS_INO ) {			err = E_NOEXS;			goto err_ret;		}	}	/* Acqusition of file information */	if ( fs == (FS*)&STD_FS ) {		err = sf_lstat(inode, para->sb);		if ( err < E_OK ) {			goto err_ret;		}	} else if ( fs == (FS*)&ROOT_FS ) {		err = rt_lstat(para->sb);		if ( err < E_OK ) {			goto err_ret;		}	} else if ( fs == (FS*)&STDIO_FS ) {		err = E_NOSPT;		goto err_ret;	} else {		err = (*fs->u_lstat)(fs, inode, para->sb);		if ( err < E_OK ) {			goto err_ret;		}		(void)SyncFS(fs->diskid, NULL);		err = CheckDiskError(fs, NULL);		if ( err < E_OK ) {			goto err_ret;		}	}	/* Deletion of file reference node */	inode_Free(fs, inode);	return E_OK;err_ret:	inode_Free(fs, inode);	DEBUG_PRINT(("_u_lstat err=%#x\n", err));	return err;}LOCAL ER _u_fstat( FS *fs, CmdPkt *pkt ){	SF_FSTAT_PARA	*para = pkt->cmd.para;	FDPkt		fdp;	ER		err;	/* Parameter check */	err = CheckSpaceRW((VP)para->sb, sizeof(struct stat));	if ( err < E_OK ) {		goto err_ret;	}	/* Search of file descriptor */	fdp.fd = searchFileDescriptor(pkt->uxinfo, para->fd);	if (( fdp.fd == NULL )||( fdp.fd->fs != fs )) {		err = E_FD;		goto err_ret;	}	fdp.fdno = para->fd;	/* Acquisition of file information */	if ( fs == (FS*)&STD_FS ) {		err = sf_fstat(&fdp, para->sb);	} else if ( fs == (FS*)&ROOT_FS ) {		err = rt_fstat(&fdp, para->sb);	} else if ( fs == (FS*)&STDIO_FS ) {		err = std_fstat(&fdp, para->sb);	} else {		err = (*fs->u_fstat)(&fdp, para->sb);	}	if ( err < E_OK ) {		goto err_ret;	}	return err;err_ret:	DEBUG_PRINT(("_u_fstat err=%#x\n", err));	return err;}/* * Acquisition of file system list */LOCAL ER _u_getfsstat( FS *fs, CmdPkt *pkt ){	SF_GETFSSTAT_PARA	*para = pkt->cmd.para;	W			fscnt;	ER			err;	if ( fs == (FS*)&STD_FS ) {		/* Standard file system		   In the case buffer is NULL, acquire the number of file systems only */		fscnt = sf_getfsstat(para->buf, para->bufsize, para->flags);		if ( fscnt < E_OK ) {			err = fscnt;			goto err_ret;		}	} else {		struct statfs	*sfs;		W		bufsz;		/* Other file systems		   In the case buffer is NULL, update only the number of file systems */		fscnt = pkt->cmd.ret;		/* Check of buffer size */		if ( para->buf != NULL ) {			/* Location to store file system */			sfs = para->buf + fscnt;			bufsz = para->bufsize - (fscnt * (W)sizeof(struct statfs));			/* Check of buffer size */			if ( bufsz < (W)sizeof(struct statfs) ) {				return fscnt;	/* buffer shortage */			}			/* Acquisition of file system information */			err = (*fs->u_getfsstat)(fs, sfs, para->flags);			if ( err < E_OK ) {				goto err_ret;			}		}		fscnt++;	}	return fscnt;err_ret:	DEBUG_PRINT(("_u_getfsstat err=%#x\n", err));	return err;}/* * Acquisition of file "LINK" */LOCAL ER _u_getlink( FS *fs, CmdPkt *pkt ){	SF_GETLINK_PARA	*para = pkt->cmd.para;	LPINF		*lp = pkt->exinf;

⌨️ 快捷键说明

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