1 //==========================================================================
5 // Fileio directory support
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
44 // Contributors: nickg
46 // Purpose: Fileio directory support
47 // Description: Support for directory operations.
52 //####DESCRIPTIONEND####
54 //==========================================================================
56 #include <pkgconf/hal.h>
57 #include <pkgconf/io_fileio.h>
59 #include <cyg/infra/cyg_trac.h> // tracing macros
60 #include <cyg/infra/cyg_ass.h> // assertion macros
62 #include <stdarg.h> // for fcntl()
64 #include "fio.h" // Private header
66 #include <dirent.h> // struct dirent
68 //==========================================================================
70 #define DIROPEN_RETURN_ERR( err ) \
73 CYG_REPORT_RETVAL( NULL ); \
77 //==========================================================================
78 // Implement filesystem locking protocol.
80 #define LOCK_FS( _mte_ ) { \
81 CYG_ASSERT(_mte_ != NULL, "Bad mount table entry"); \
82 cyg_fs_lock( _mte_, (_mte_)->fs->syncmode); \
85 #define UNLOCK_FS( _mte_ ) cyg_fs_unlock( _mte_, (_mte_)->fs->syncmode)
87 //==========================================================================
88 // Open a directory for reading
90 extern DIR *opendir( const char *dirname )
94 CYG_CANCELLATION_POINT;
99 cyg_mtab_entry *mte = cyg_cdir_mtab_entry;
100 cyg_dir dir = cyg_cdir_dir;
101 const char *name = dirname;
103 fd = cyg_fd_alloc(1); // Never return fd 0
106 DIROPEN_RETURN_ERR(EMFILE);
108 file = cyg_file_alloc();
113 DIROPEN_RETURN_ERR(ENFILE);
116 ret = cyg_mtab_lookup( &dir, &name, &mte );
122 DIROPEN_RETURN_ERR(ENOENT);
127 ret = mte->fs->opendir( mte, dir, name, file );
135 DIROPEN_RETURN_ERR(ret);
138 file->f_flag |= CYG_FDIR|CYG_FREAD;
140 file->f_syncmode = mte->fs->syncmode;
142 cyg_fd_assign( fd, file );
144 DIR *dirp = (DIR *)fd;
146 FILEIO_RETURN_VALUE(dirp);
149 //==========================================================================
150 // Read a directory entry.
151 // This is the thread-unsafe version that uses a static result buffer.
152 // It just calls the thread-safe version to do the work.
154 extern struct dirent *readdir( DIR *dirp )
158 static struct dirent ent;
159 struct dirent *result;
162 err = readdir_r( dirp, &ent, &result );
167 FILEIO_RETURN_VALUE( NULL );
170 FILEIO_RETURN_VALUE( result );
173 //==========================================================================
175 extern int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result )
186 FILEIO_RETURN_VALUE( EBADF );
189 res = read( fd, (void *)entry, sizeof(struct dirent));
193 FILEIO_RETURN_VALUE( errno );
199 FILEIO_RETURN( ENOERR );
202 //==========================================================================
204 extern void rewinddir( DIR *dirp )
210 lseek( fd, 0, SEEK_SET );
212 FILEIO_RETURN_VOID();
215 //==========================================================================
217 extern int closedir( DIR *dirp )
222 int err = close( fd );
224 FILEIO_RETURN_VALUE( err );
227 // -------------------------------------------------------------------------