/*--------------------------------------------------------------------*/ /* ndir.c for MS-DOS by Samuel Lam , June/87 */ /* ndir.c for MS-OS2 by Drew Derbyshire (help@kendra.kew.com>, */ /* April/91 */ /* ndir.c for Windows/NT by Tom Loebach (loebach@mips.com), */ /* April/92 */ /* ndir.c for NT extended to include timestamp information by */ /* Dave Watt, April/93 */ /* */ /* Berkeley-style directory reading routine on Windows NT */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Changes Copyright (c) 1990-1993 by Kendra Electronic */ /* Wonderworks. */ /* */ /* All rights reserved except those explicitly granted by the */ /* UUPC/extended license agreement. */ /*--------------------------------------------------------------------*/ /* * $Id: NDIRNT.C 1.4 1993/04/11 00:33:38 dmwatt Exp $ * * $Log: NDIRNT.C $ * Revision 1.4 1993/04/11 00:33:38 dmwatt * Global edits for year, TEXT, etc. * * Revision 1.3 1993/04/10 21:22:29 dmwatt * Windows/NT fixes * * Revision 1.2 1993/01/01 01:21:29 dmwatt * Add currentfile() to support strpool memory handling * * Revision 1.2 1993/01/01 01:21:29 dmwatt * Add currentfile() to support strpool memory handling * */ #include #include #include #include #include /*--------------------------------------------------------------------*/ /* Windows/NT include files */ /*--------------------------------------------------------------------*/ #define INCL_BASE #include /*--------------------------------------------------------------------*/ /* UUPC/extended include files */ /*--------------------------------------------------------------------*/ #include "lib.h" #include "uundir.h" #include "dos2unix.h" static char *pathname = NULL; static HANDLE dirHandle; static WIN32_FIND_DATA dirData; currentfile(); /*--------------------------------------------------------------------*/ /* o p e n d i r */ /* */ /* Open a directory */ /*--------------------------------------------------------------------*/ extern DIR *opendirx( const char *dirname, char *pattern) { DIR *dirp; pathname = malloc( strlen( dirname ) + strlen( pattern ) + 2 ); strcpy(pathname, dirname); if ((*pattern != '\\') || (dirname[ strlen(dirname) - 1] != '\\')) strcat(pathname,"\\"); strcat(pathname,pattern); printmsg(5,"opendir: Opening directory %s", pathname ); /*--------------------------------------------------------------------*/ /* Read the first file in the directory */ /*--------------------------------------------------------------------*/ dirHandle = FindFirstFile(pathname, &dirData); printmsg(5, "dirhandle = %d\n",dirHandle); printmsg(5, "file, = %s\n", dirData.cFileName); if ((int)dirHandle == -1) { printmsg(2,"opendir: Error on directory %s",pathname ); return NULL; } else { dirp = malloc( sizeof( DIR )); dirp->dirfirst = 1; strcpy(dirp->dirid, "DIR"); return dirp; } } /*opendir*/ /*--------------------------------------------------------------------*/ /* r e a d d i r */ /* */ /* Get next entry in a directory */ /*--------------------------------------------------------------------*/ struct direct *readdir(DIR *dirp) { BOOL rc; assert(strcmp(dirp->dirid, "DIR") == 0); if (dirp->dirfirst) { printmsg(5,"readdir: Opening directory %s", pathname ); dirp->dirfirst = 0; } else { printmsg(5, "dirhandle = %d\n",dirHandle); rc = FindNextFile(dirHandle, &dirData); } if (!strcmp(dirData.cFileName,".")) rc = FindNextFile(dirHandle, &dirData); printmsg(9, "readdir: file = %s\n", dirData.cFileName); if (!strcmp(dirData.cFileName,"..")) rc = FindNextFile(dirHandle, &dirData); printmsg(9, "file = %s\n", dirData.cFileName); if ( rc ) { printmsg(9, "file = %s\n", dirData.cFileName); dirp->dirent.d_ino = -1; /* no inode information */ strlwr(strcpy(dirp->dirent.d_name, dirData.cFileName)); dirp->dirent.d_namlen = strlen(dirData.cFileName); printmsg(9, "%d \n",dirp->dirent.d_namlen); dirp->dirent.d_modified = nt2unix(&dirData.ftLastWriteTime); if (dirData.nFileSizeHigh > 0) { printmsg(0, "readdir: File %s larger than 2^32 bits?!", dirData.cFileName); panic(); } dirp->dirent.d_size = dirData.nFileSizeLow; dirp->dirent.d_reclen = sizeof(struct direct) - (MAXNAMLEN + 1) + ((((dirp->dirent.d_namlen + 1) + 3) / 4) * 4); return &(dirp->dirent); } else { printmsg(5,"readdir: Error on directory %s",pathname ); return NULL; } } /*readdir*/ /*--------------------------------------------------------------------*/ /* c l o s e d i r */ /* */ /* Close a directory */ /*--------------------------------------------------------------------*/ void closedir(DIR *dirp) { BOOL rc; assert(strcmp(dirp->dirid, "DIR") == 0); printmsg(5,"closedir: Closing directory %s", pathname ); rc = FindClose(dirHandle); if (rc == 0) printmsg(0,"closedir: Error %d on directory %s", (int) rc, pathname ); free( dirp ); dirp = NULL; free( pathname ); pathname = NULL; } /*closedir*/