OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [io/] [fileio/] [current/] [src/] [dir.cxx] - Rev 851

Go to most recent revision | Compare with Previous | Blame | View Log

//==========================================================================
//
//      dir.cxx
//
//      Fileio directory support
//
//==========================================================================
// ####ECOSGPLCOPYRIGHTBEGIN####                                            
// -------------------------------------------                              
// This file is part of eCos, the Embedded Configurable Operating System.   
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, 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.,    
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 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 v2.                                               
//
// This exception does not invalidate any other reasons why a work based    
// on this file might be covered by the GNU General Public 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 reading
 
extern 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 );
    }
 
#ifdef CYGPKG_FILEIO_DIRENT_DTYPE
    // d_type is only supposed by a few filesystems, so make sure other
    // filesystems return a sane value;
    entry->d_type = 0;
#endif
 
    res = read( fd, (void *)entry, sizeof(struct dirent));
 
    if( res < 0 )
    {
        FILEIO_RETURN_VALUE( errno );
    }
 
    if( res > 0 )
        *result = entry;
 
#ifdef CYGPKG_FILEIO_DIRENT_DTYPE
    // Only the lower bits contain the type of file, so and those out.
    entry->d_type &= S_IFMT;
#endif
 
 
    FILEIO_RETURN( ENOERR );
}
 
//==========================================================================
 
extern void rewinddir( DIR *dirp )
{
    FILEIO_ENTRY_VOID();
 
    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
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.