which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			141 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
#include    <Errors.h>
 | 
						|
#include    <Files.h>
 | 
						|
#ifndef THINK_C
 | 
						|
#include    <Strings.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef FSFCBLen
 | 
						|
#define FSFCBLen    (*(short *)0x3F6)
 | 
						|
#endif
 | 
						|
 | 
						|
#include    <errno.h>
 | 
						|
#include    <stdlib.h>
 | 
						|
#include    <string.h>
 | 
						|
 | 
						|
#include    "macdir.h"
 | 
						|
 | 
						|
int closedir(dPtr) DIR *dPtr; {
 | 
						|
    free(dPtr);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
DIR *opendir(dirName) char *dirName; {
 | 
						|
    int fullPath, pathLen;
 | 
						|
    char *s, pName[256];
 | 
						|
    HParamBlockRec hPB;
 | 
						|
    CInfoPBRec cPB;
 | 
						|
    DIR *dPtr;
 | 
						|
    OSErr err;
 | 
						|
 | 
						|
    if (dirName == NULL || *dirName == '\0' || (pathLen = strlen(dirName)) > 255) {
 | 
						|
        errno = EINVAL;
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    if (FSFCBLen <= 0) {
 | 
						|
        errno = ENOTDIR;
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    /* Get information about volume. */
 | 
						|
 | 
						|
    memset(&hPB, '\0', sizeof(hPB));
 | 
						|
 | 
						|
    strcpy(pName, dirName);
 | 
						|
 | 
						|
    if (((s = strchr(pName, ':')) == NULL) || (*pName == ':')) {
 | 
						|
        fullPath = false;
 | 
						|
    } else {
 | 
						|
        *(s + 1) = '\0';
 | 
						|
        c2pstr(pName);
 | 
						|
        hPB.volumeParam.ioVolIndex = -1;
 | 
						|
        fullPath = true;
 | 
						|
    }
 | 
						|
 | 
						|
    hPB.volumeParam.ioNamePtr = (StringPtr)pName;
 | 
						|
 | 
						|
    err = PBHGetVInfo(&hPB, 0);
 | 
						|
 | 
						|
    if ((err != noErr) || (hPB.volumeParam.ioVFSID != 0)) {
 | 
						|
        errno = ENOENT;
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    /* Get information about file. */
 | 
						|
 | 
						|
    memset(&cPB, '\0', sizeof(cPB));
 | 
						|
 | 
						|
    strcpy(pName, dirName);
 | 
						|
    c2pstr(pName);
 | 
						|
 | 
						|
    if (fullPath)
 | 
						|
        cPB.hFileInfo.ioVRefNum = hPB.volumeParam.ioVRefNum;
 | 
						|
 | 
						|
    cPB.hFileInfo.ioNamePtr = (StringPtr)pName;
 | 
						|
 | 
						|
    err = PBGetCatInfo(&cPB, false);
 | 
						|
 | 
						|
    if (err != noErr) {
 | 
						|
        errno = (err == fnfErr) ? ENOENT : EIO;
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!(cPB.hFileInfo.ioFlAttrib & ioDirMask)) {
 | 
						|
        errno = ENOTDIR;
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    /* Get space for, and fill in, DIR structure. */
 | 
						|
 | 
						|
    if ((dPtr = (DIR *)malloc(sizeof(DIR))) == NULL) {
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    dPtr->ioVRefNum = cPB.dirInfo.ioVRefNum;
 | 
						|
    dPtr->ioDrDirID = cPB.dirInfo.ioDrDirID;
 | 
						|
    dPtr->ioFDirIndex = 1;
 | 
						|
    dPtr->flags = 0;
 | 
						|
 | 
						|
    return dPtr;
 | 
						|
}
 | 
						|
 | 
						|
struct dirent *readdir(dPtr) DIR *dPtr; {
 | 
						|
    struct dirent *dirPtr;
 | 
						|
    CInfoPBRec cPB;
 | 
						|
    char name[32];
 | 
						|
    OSErr err;
 | 
						|
 | 
						|
    if (dPtr->flags) {
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    /* Get information about file. */
 | 
						|
 | 
						|
    memset(&cPB, '\0', sizeof(cPB));
 | 
						|
 | 
						|
    cPB.hFileInfo.ioNamePtr = (StringPtr)name;
 | 
						|
    cPB.hFileInfo.ioFDirIndex = dPtr->ioFDirIndex;
 | 
						|
    cPB.hFileInfo.ioVRefNum = dPtr->ioVRefNum;
 | 
						|
    cPB.hFileInfo.ioDirID = dPtr->ioDrDirID;
 | 
						|
 | 
						|
    err = PBGetCatInfo(&cPB, false);
 | 
						|
 | 
						|
    if (err != noErr) {
 | 
						|
        dPtr->flags = 0xff;
 | 
						|
        errno = (err == fnfErr) ? ENOENT : EIO;
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    p2cstr((StringPtr)name);
 | 
						|
 | 
						|
    dirPtr = &dPtr->currEntry;
 | 
						|
 | 
						|
    dirPtr->d_fileno = dPtr->ioFDirIndex++;
 | 
						|
    dirPtr->d_namlen = strlen(name);
 | 
						|
    strcpy(dirPtr->d_name, name);
 | 
						|
    dirPtr->d_reclen = sizeof(struct dirent) - sizeof(dirPtr->d_name) + dirPtr->d_namlen;
 | 
						|
 | 
						|
    return dirPtr;
 | 
						|
}
 |