108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* lt__dirent.c -- internal directory entry scanning interface
 | ||
|  | 
 | ||
|  |    Copyright (C) 2001, 2004 Free Software Foundation, Inc. | ||
|  |    Written by Bob Friesenhahn, 2001 | ||
|  | 
 | ||
|  |    NOTE: The canonical source of this file is maintained with the | ||
|  |    GNU Libtool package.  Report bugs to bug-libtool@gnu.org. | ||
|  | 
 | ||
|  | GNU Libltdl is free software; you can redistribute it and/or | ||
|  | modify it under the terms of the GNU Lesser General Public | ||
|  | License as published by the Free Software Foundation; either | ||
|  | version 2 of the License, or (at your option) any later version. | ||
|  | 
 | ||
|  | As a special exception to the GNU Lesser General Public License, | ||
|  | if you distribute this file as part of a program or library that | ||
|  | is built using GNU Libtool, you may include this file under the | ||
|  | same distribution terms that you use for the rest of that program. | ||
|  | 
 | ||
|  | GNU Libltdl 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 Lesser General Public License for more details. | ||
|  | 
 | ||
|  | You should have received a copy of the GNU Lesser General Public | ||
|  | License along with GNU Libltdl; see the file COPYING.LIB.  If not, a | ||
|  | copy can be downloaded from  http://www.gnu.org/licenses/lgpl.html,
 | ||
|  | or obtained by writing to the Free Software Foundation, Inc., | ||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
|  | */ | ||
|  | 
 | ||
|  | #include "lt__private.h"
 | ||
|  | 
 | ||
|  | #include <assert.h>
 | ||
|  | #include <stddef.h>
 | ||
|  | 
 | ||
|  | #include "lt__dirent.h"
 | ||
|  | 
 | ||
|  | #if defined(__WINDOWS__)
 | ||
|  | 
 | ||
|  | void | ||
|  | closedir (DIR *entry) | ||
|  | { | ||
|  |   assert (entry != (DIR *) NULL); | ||
|  |   FindClose (entry->hSearch); | ||
|  |   free ((void *) entry); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | DIR * | ||
|  | opendir (const char *path) | ||
|  | { | ||
|  |   char file_spec[LT_FILENAME_MAX]; | ||
|  |   DIR *entry; | ||
|  | 
 | ||
|  |   assert (path != (char *) 0); | ||
|  |   if (lt_strlcpy (file_spec, path, sizeof file_spec) >= sizeof file_spec | ||
|  |       || lt_strlcat (file_spec, "\\", sizeof file_spec) >= sizeof file_spec) | ||
|  |     return (DIR *) 0; | ||
|  |   entry = (DIR *) malloc (sizeof(DIR)); | ||
|  |   if (entry != (DIR *) 0) | ||
|  |     { | ||
|  |       entry->firsttime = TRUE; | ||
|  |       entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData); | ||
|  | 
 | ||
|  |       if (entry->hSearch == INVALID_HANDLE_VALUE) | ||
|  | 	{ | ||
|  | 	  if (lt_strlcat (file_spec, "\\*.*", sizeof file_spec) < sizeof file_spec) | ||
|  | 	    { | ||
|  | 	      entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData); | ||
|  | 	    } | ||
|  | 
 | ||
|  | 	  if (entry->hSearch == INVALID_HANDLE_VALUE) | ||
|  | 	    { | ||
|  | 	      entry = (free (entry), (DIR *) 0); | ||
|  | 	    } | ||
|  | 	} | ||
|  |     } | ||
|  | 
 | ||
|  |   return entry; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | struct dirent * | ||
|  | readdir (DIR *entry) | ||
|  | { | ||
|  |   int status; | ||
|  | 
 | ||
|  |   if (entry == (DIR *) 0) | ||
|  |     return (struct dirent *) 0; | ||
|  | 
 | ||
|  |   if (!entry->firsttime) | ||
|  |     { | ||
|  |       status = FindNextFile (entry->hSearch, &entry->Win32FindData); | ||
|  |       if (status == 0) | ||
|  |         return (struct dirent *) 0; | ||
|  |     } | ||
|  | 
 | ||
|  |   entry->firsttime = FALSE; | ||
|  |   if (lt_strlcpy (entry->file_info.d_name, entry->Win32FindData.cFileName, | ||
|  | 	sizeof entry->file_info.d_name) >= sizeof entry->file_info.d_name) | ||
|  |     return (struct dirent *) 0; | ||
|  |   entry->file_info.d_namlen = strlen (entry->file_info.d_name); | ||
|  | 
 | ||
|  |   return &entry->file_info; | ||
|  | } | ||
|  | 
 | ||
|  | #endif /*defined(__WINDOWS__)*/
 |