primitiveDirectoryEntry(void) { sqInt createDate; sqInt dirFlag; char entryName[256]; sqInt entryNameSize; squeakFileOffsetType fileSize; sqInt modifiedDate; sqInt okToList; sqInt pathName; char *pathNameIndex; sqInt pathNameSize; char *reqNameIndex; sqInt reqNameSize; sqInt requestedName; sqInt status; requestedName = interpreterProxy->stackValue(0); pathName = interpreterProxy->stackValue(1); if (!(interpreterProxy->isBytes(pathName))) { return interpreterProxy->primitiveFail(); } pathNameIndex = interpreterProxy->firstIndexableField(pathName); pathNameSize = interpreterProxy->byteSizeOf(pathName); reqNameIndex = interpreterProxy->firstIndexableField(requestedName); /* If the security plugin can be loaded, use it to check for permission. If not, assume it's ok */ reqNameSize = interpreterProxy->byteSizeOf(requestedName); if (sCLPfn != 0) { okToList = ((sqInt (*)(char *, sqInt))sCLPfn)(pathNameIndex, pathNameSize); } else { okToList = 1; } if (okToList) { status = dir_EntryLookup(pathNameIndex, pathNameSize, reqNameIndex, reqNameSize, entryName, &entryNameSize, &createDate, &modifiedDate, &dirFlag, &fileSize); } else { status = DirNoMoreEntries; } if (interpreterProxy->failed()) { return null; } if (status == DirNoMoreEntries) { interpreterProxy->popthenPush(3, interpreterProxy->nilObject()); return null; } if (status == DirBadPath) { return interpreterProxy->primitiveFail(); } interpreterProxy->popthenPush(3, makeDirEntryNamesizecreateDatemodDateisDirfileSize(entryName, entryNameSize, createDate, modifiedDate, dirFlag, fileSize)); }
primitiveDirectoryEntry(void) { // FilePlugin>>#primitiveDirectoryEntry sqInt createDate; sqInt dirFlag; char entryName[256]; sqInt entryNameSize; squeakFileOffsetType fileSize; sqInt modifiedDate; sqInt okToList; sqInt pathName; char *pathNameIndex; sqInt pathNameSize; sqInt posixPermissions; char *reqNameIndex; sqInt reqNameSize; sqInt requestedName; sqInt status; sqInt symlinkFlag; requestedName = stackValue(0); pathName = stackValue(1); if (!(isBytes(pathName))) { return primitiveFail(); } pathNameIndex = firstIndexableField(pathName); pathNameSize = byteSizeOf(pathName); reqNameIndex = firstIndexableField(requestedName); /* If the security plugin can be loaded, use it to check for permission. If not, assume it's ok */ reqNameSize = byteSizeOf(requestedName); if (sCLPfn != 0) { okToList = ((sqInt (*)(char *, sqInt))sCLPfn)(pathNameIndex, pathNameSize); } else { okToList = 1; } if (okToList) { status = dir_EntryLookup( pathNameIndex, pathNameSize, reqNameIndex, reqNameSize, entryName, &entryNameSize, &createDate, &modifiedDate, &dirFlag, &fileSize, &posixPermissions, &symlinkFlag); } else { status = DirNoMoreEntries; } if (failed()) { return null; } if (status == DirNoMoreEntries) { /* no entry; return nil */ /* pop pathName, index, rcvr */ popthenPush(3, nilObject()); return null; } if (status == DirBadPath) { return primitiveFail(); } popthenPush(3, makeDirEntryNamesizecreateDatemodDateisDirfileSizeposixPermissionsisSymlink(entryName, entryNameSize, createDate, modifiedDate, dirFlag, fileSize, posixPermissions, symlinkFlag)); }