mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Macintosh version of UNIX directory access package
 | 
						|
 * (opendir, readdir, closedir).
 | 
						|
 * Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
 | 
						|
 */
 | 
						|
 | 
						|
#include "dirent.h"
 | 
						|
#include "macdefs.h"
 | 
						|
 | 
						|
static DIR opened;
 | 
						|
 | 
						|
/*
 | 
						|
 * Open a directory.  This means calling PBOpenWD.
 | 
						|
 * The value returned is always the address of opened, or NULL.
 | 
						|
 * (I have as yet no use for multiple open directories; this could
 | 
						|
 * be implemented by allocating memory dynamically.)
 | 
						|
 */
 | 
						|
 | 
						|
DIR *
 | 
						|
opendir(path)
 | 
						|
	char *path;
 | 
						|
{
 | 
						|
	union {
 | 
						|
		WDPBRec d;
 | 
						|
		VolumeParam v;
 | 
						|
	} pb;
 | 
						|
	char ppath[MAXPATH];
 | 
						|
	short err;
 | 
						|
	
 | 
						|
	if (opened.nextfile != 0) {
 | 
						|
		errno = EBUSY;
 | 
						|
		return NULL; /* A directory is already open. */
 | 
						|
	}
 | 
						|
	strncpy(ppath+1, path, ppath[0]= strlen(path));
 | 
						|
	pb.d.ioNamePtr= (unsigned char *)ppath;
 | 
						|
	pb.d.ioVRefNum= 0;
 | 
						|
	if (hfsrunning()) {
 | 
						|
		pb.d.ioWDProcID= 0;
 | 
						|
		pb.d.ioWDDirID= 0;
 | 
						|
		err= PBOpenWD((WDPBPtr)&pb, FALSE);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		pb.v.ioVolIndex= 0;
 | 
						|
		err= PBGetVInfo((ParmBlkPtr)&pb, FALSE);
 | 
						|
	}
 | 
						|
	if (err != noErr) {
 | 
						|
		errno = ENOENT;
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	opened.dirid= pb.d.ioVRefNum;
 | 
						|
	opened.nextfile= 1;
 | 
						|
	return &opened;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Close a directory.
 | 
						|
 */
 | 
						|
 | 
						|
void
 | 
						|
closedir(dirp)
 | 
						|
	DIR *dirp;
 | 
						|
{
 | 
						|
	if (hfsrunning()) {
 | 
						|
		WDPBRec pb;
 | 
						|
		
 | 
						|
		pb.ioVRefNum= dirp->dirid;
 | 
						|
		(void) PBCloseWD(&pb, FALSE);
 | 
						|
	}
 | 
						|
	dirp->dirid= 0;
 | 
						|
	dirp->nextfile= 0;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Read the next directory entry.
 | 
						|
 */
 | 
						|
 | 
						|
struct dirent *
 | 
						|
readdir(dp)
 | 
						|
	DIR *dp;
 | 
						|
{
 | 
						|
	union {
 | 
						|
		DirInfo d;
 | 
						|
		FileParam f;
 | 
						|
		HFileInfo hf;
 | 
						|
	} pb;
 | 
						|
	short err;
 | 
						|
	static struct dirent dir;
 | 
						|
	
 | 
						|
	dir.d_name[0]= 0;
 | 
						|
	pb.d.ioNamePtr= (unsigned char *)dir.d_name;
 | 
						|
	pb.d.ioVRefNum= dp->dirid;
 | 
						|
	pb.d.ioFDirIndex= dp->nextfile++;
 | 
						|
	pb.d.ioDrDirID= 0;
 | 
						|
	if (hfsrunning())
 | 
						|
		err= PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
 | 
						|
	else
 | 
						|
		err= PBGetFInfo((ParmBlkPtr)&pb, FALSE);
 | 
						|
	if (err != noErr) {
 | 
						|
		errno = EIO;
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
	(void) p2cstr((unsigned char *)dir.d_name);
 | 
						|
	return &dir;
 | 
						|
}
 |