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

📄 filedes.c

📁 T-kernel 的extension源代码
💻 C
字号:
/* *---------------------------------------------------------------------- *    T-Kernel / Standard Extension * *    Copyright (C) 2006 by Ken Sakamura. All rights reserved. *    T-Kernel / Standard Extension is distributed  *      under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * *    Version:   1.00.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* *	filedes.c (file) * *	File management *	Manage the file descriptor. */#include "filedes.h"#define fdtInfop	(&fmInfo.fdtInfo)#define ENTER		LockFD()#define EXIT		{ UnlockFD(); return; }#define RETURN(arg)	{ UnlockFD(); return (arg); }/* * Initialize the file descriptor. */EXPORT ER fmInitFileDescriptorTable( void ){	FDT	*fdt;	W	i;	ER	err;	/* Create the lock for exclusive access. */	err = CreateLock(&fdtInfop->lock, (UB*)"FDes");	if ( err != E_OK ) {		goto err_ret1;	}	/* Initialize the queue of free list. */	QueInit(&fdtInfop->freeFD);	/* Reserve the memory for the file descriptor table. */	fdt = (FDT*)Vmalloc((size_t)SizeOfFDT);	if ( fdt == NULL ) {		err = E_SYSMEM;		goto err_ret2;	}	memset(fdt, 0, (size_t)SizeOfFDT);	fdtInfop->fdt = fdt;	/* Register all entries in free list. */	for ( i = 0; i < MaxOpenFile; ++i ) {		QueInsert(&(*fdt)[i].q, &fdtInfop->freeFD);	}	return E_OK;	/*	 * Error processing	 */err_ret2:	DeleteLock(&fdtInfop->lock);err_ret1:	DEBUG_PRINT(("fmInitFileDescriptorTable err = %d\n", err));	return err;}/* * Delete the file descriptor table. */EXPORT void fmDeleteFileDescriptorTable( void ){	Vfree((VB*)fdtInfop->fdt);	fdtInfop->fdt = NULL;	DeleteLock(&fdtInfop->lock);}/* * Retrieve the file descriptor. */EXPORT FD* fmGetFD( W no, PINFO *pinfo ){	FD	*fd;	ENTER;	if ( !checkFDno(no) ) {		RETURN (NULL);	}	fd = getFDp(no);	if ( (fd->fs == NULL) || (fd->pinfo != pinfo) ) {		/* It is a FD of different process or unused entry. */		RETURN (NULL);	}	RETURN (fd);}/* * Open (Initialize) the file descriptor. */EXPORT FD* fmpOpenFD( PINFO *pinfo, UW omode, OFCB *ofcb, ER *err ){	FD	*fd;	ENTER;	/* Obtain a free descriptor. */	fd = (FD*)QueRemoveNext(&fdtInfop->freeFD);	if ( fd == NULL ) {		*err = E_LIMIT;		goto err_ret1;	}	/* Initialize the descriptor. */	fd->fs      = ofcb->fsinfo;	fd->pinfo   = pinfo;	fd->ofcb    = ofcb;	fd->omode   = omode;	fd->waitReq = NULL;	QueInit(&fd->mcbq);	/* Register in OFCB. */	*err = fmpOpenOFCB(ofcb, omode);	if ( *err < E_OK ) {		goto err_ret2;	}	/* Define the current record as the first record. */	fd->crcb = fmpSetCurRCB(FirstRCB(ofcb), ofcb);	/* Register in the process. */	LOCK_PINFO_SECTION( QueInsert(&fd->q, &pinfo->file.fdList); );	RETURN (fd);err_ret2:	/* Return to the descriptor free list. */	fd->fs = NULL;	QueInsert(&fd->q, &fdtInfop->freeFD);err_ret1:	DEBUG_PRINT(("fmpOpenFD err = %d\n", *err));	RETURN (NULL);}/* * Close the file descriptor. */EXPORT void fmpCloseFD( FD *fd ){	ENTER;	/* Release the current record. */	fmpClearCurRCB(fd->crcb, fd->ofcb);	/* Deregister from the process. */	LOCK_PINFO_SECTION( QueRemove(&fd->q); );	/* Deregister from OFCB. */	fmpCloseOFCB(fd->ofcb, fd->omode);	/* Return to the descriptor free list. */	fd->fs = NULL;	QueInsert(&fd->q, &fdtInfop->freeFD);	EXIT;}/* * Check the file open mode. */EXPORT ER fmpCheckFileOpenMode( FD *fd, UW omode ){	if ( (fd->omode & omode) != omode ) {		return E_FD;	}	if ( (omode & F_WRITE) != 0U ) {		if ( isNoWriteFS(fd->fs) != 0 ) {			return E_RONLY;		}	}	return E_OK;}/* * Move the current record. */EXPORT void fmpMoveCurRecord( FD *fd, RCB *new ){	fmpClearCurRCB(fd->crcb, fd->ofcb);	fd->crcb = fmpSetCurRCB(new, fd->ofcb);}

⌨️ 快捷键说明

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