diff -r 000000000000 -r bde4ae8d615e os/ossrv/genericopenlibs/openenvcore/libc/src/opendir.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/genericopenlibs/openenvcore/libc/src/opendir.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,161 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +// + +#include <unistd.h> +#include <errno.h> +#include "sysreent.h" +#include <dirent.h> +#include <utf.h> +#include <stddef.h> +#include <string.h> +#include <stdlib.h> +#include <wchar.h> +#include <sys/errno.h> +#include "sysif.h" + +#define MAXPATHLEN 260 /* E32STD.H: KMaxFullName + 4 to avoid data loss */ + +extern "C" { +/* +Opens a directory. +*/ +EXPORT_C DIR* opendir(const char* _path) + { + wchar_t _wpath[MAXPATHLEN+1]; + + if (mbstowcs(_wpath, _path, MAXPATHLEN) == (size_t)-1) + { + errno = EILSEQ; + return 0; + } + return _opendir_r(&errno, _wpath); + } + +/* +A wide-character version of opendir() +*/ +EXPORT_C WDIR* wopendir(const wchar_t* _wpath) + { + if (!_wpath) + { + errno = ENOENT; + return NULL; + } + return (WDIR*)_opendir_r(&errno, _wpath); + } + +EXPORT_C struct dirent* readdir(DIR* dp) + { + return _readdir_r(&errno, dp); + } + +EXPORT_C struct wdirent* wreaddir(WDIR* wdp) + { + if (!wdp) + { + errno = EBADF; + return NULL; + } + return _wreaddir_r(wdp); + } + +/* +Sets the position (associated with the directory stream that dirp points to) +to the beginning of the directory. +Additionally, it causes the directory stream to refer to the current state of +the corresponding directory. +*/ +EXPORT_C void wrewinddir(WDIR* wdp) + { + _wrewinddir_r(wdp); + } + +EXPORT_C void rewinddir(DIR* dp) + { + WDIR* wdp = (__EPOC32_DIR*)dp; + wrewinddir(wdp); + } + +/* +closes the directory stream that dirp refers to. +The memory associated with the directory stream is released. +When this function returns, the value of dirp no longer point to +an accessible object of type DIR +*/ + +EXPORT_C int wclosedir(WDIR* wdp) + { + return _wclosedir_r(&errno,wdp); + } + +EXPORT_C int closedir(DIR* dp) + { + if (!dp) + { + errno = EBADF; + return -1; + } + + WDIR* wdp = (__EPOC32_DIR*)dp; + return wclosedir(wdp); + } + +/* +sets the position of the next readdir() operation on the directory +stream specified by dp to the position specified by index. +*/ + +EXPORT_C void wseekdir(WDIR* wdp, off_t index) + { + if(!wdp) + { + errno = EFAULT ; + return ; + } + wdp->iIndex = index; + } + +EXPORT_C void seekdir(DIR* dp, long index) + { + WDIR* wdp = (__EPOC32_DIR*)dp; + wseekdir(wdp, index); + } + + +EXPORT_C off_t wtelldir(const WDIR* wdp) + { + if(!wdp) + { + errno = EFAULT ; + return -1 ; + } + if(wdp->iCount < 0 ) + { + return -1; + } + return wdp->iIndex; + } + +/* +Returns the current location associated with the directory stream dir. +*/ +EXPORT_C long telldir(DIR* dp) + { + WDIR* wdp = (__EPOC32_DIR*)dp; + return (long)wtelldir(wdp); + } + +}// extern "C"