📄 filedes.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 + -