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

📄 dir.cxx

📁 eCos操作系统源码
💻 CXX
字号:
//==========================================================================////      dir.cxx////      Fileio directory support////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):           nickg// Contributors:        nickg// Date:                2000-05-25// Purpose:             Fileio directory support// Description:         Support for directory operations.//                      //              //              ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/hal.h>#include <pkgconf/io_fileio.h>#include <cyg/infra/cyg_trac.h>        // tracing macros#include <cyg/infra/cyg_ass.h>         // assertion macros#include <stdarg.h>                     // for fcntl()#include "fio.h"                       // Private header#include <dirent.h>                    // struct dirent//==========================================================================#define DIROPEN_RETURN_ERR( err )               \CYG_MACRO_START                                 \    errno = err;                                \    CYG_REPORT_RETVAL( NULL );                  \    return NULL;                                \CYG_MACRO_END//==========================================================================// Implement filesystem locking protocol. #define LOCK_FS( _mte_ )  {                             \   CYG_ASSERT(_mte_ != NULL, "Bad mount table entry");  \   cyg_fs_lock( _mte_, (_mte_)->fs->syncmode);          \}#define UNLOCK_FS( _mte_ ) cyg_fs_unlock( _mte_, (_mte_)->fs->syncmode)//==========================================================================// Open a directory for readingextern DIR *opendir( const char *dirname ){    FILEIO_ENTRY();    CYG_CANCELLATION_POINT;    int ret = 0;    int fd;    cyg_file *file;    cyg_mtab_entry *mte = cyg_cdir_mtab_entry;    cyg_dir dir = cyg_cdir_dir;    const char *name = dirname;    fd = cyg_fd_alloc(1); // Never return fd 0    if( fd < 0 )        DIROPEN_RETURN_ERR(EMFILE);        file = cyg_file_alloc();    if( file == NULL )    {        cyg_fd_free(fd);        DIROPEN_RETURN_ERR(ENFILE);    }        ret = cyg_mtab_lookup( &dir, &name, &mte );        if( 0 != ret )    {        cyg_fd_free(fd);        cyg_file_free(file);        DIROPEN_RETURN_ERR(ENOENT);    }    LOCK_FS( mte );        ret = mte->fs->opendir( mte, dir, name, file );        UNLOCK_FS( mte );        if( 0 != ret )    {        cyg_fd_free(fd);        cyg_file_free(file);        DIROPEN_RETURN_ERR(ret);    }    file->f_flag |= CYG_FDIR|CYG_FREAD;    file->f_mte = mte;    file->f_syncmode = mte->fs->syncmode;        cyg_fd_assign( fd, file );    DIR *dirp = (DIR *)fd;        FILEIO_RETURN_VALUE(dirp);}//==========================================================================// Read a directory entry.// This is the thread-unsafe version that uses a static result buffer.// It just calls the thread-safe version to do the work.extern struct dirent *readdir( DIR *dirp ){    FILEIO_ENTRY();        static struct dirent ent;    struct dirent *result;    int err;    err = readdir_r( dirp, &ent, &result );    if( err != 0 )    {        errno = err;        FILEIO_RETURN_VALUE( NULL );    }        FILEIO_RETURN_VALUE( result );}//==========================================================================extern int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result ){    FILEIO_ENTRY();    int fd = (int)dirp;        ssize_t res;    *result = NULL;    if( NULL == dirp )    {        FILEIO_RETURN_VALUE( EBADF );    }    res = read( fd, (void *)entry, sizeof(struct dirent));    if( res < 0 )    {        FILEIO_RETURN_VALUE( errno );    }        if( res > 0 )        *result = entry;        FILEIO_RETURN( ENOERR );}//==========================================================================extern void rewinddir( DIR *dirp ){    FILEIO_ENTRY();    int fd = (int)dirp;    lseek( fd, 0, SEEK_SET );        FILEIO_RETURN_VOID();}//==========================================================================extern int closedir( DIR *dirp ){    FILEIO_ENTRY();    int fd = (int)dirp;    int err = close( fd );    FILEIO_RETURN_VALUE( err );}// -------------------------------------------------------------------------// EOF dir.cxx

⌨️ 快捷键说明

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