| /* Minimal 'stat' emulation: tells directories from files and | 
 |    gives length and mtime. | 
 |    Public domain by Guido van Rossum, CWI, Amsterdam (July 1987). | 
 |    Updated to give more info, August 1994. | 
 | */ | 
 |  | 
 | #include "macstat.h" | 
 | #include "macdefs.h" | 
 |  | 
 | /* Bits in ioFlAttrib: */ | 
 | #define LOCKBIT	(1<<0)		/* File locked */ | 
 | #define DIRBIT	(1<<4)		/* It's a directory */ | 
 |  | 
 | int | 
 | macstat(path, buf) | 
 | 	char *path; | 
 | 	struct macstat *buf; | 
 | { | 
 | 	union { | 
 | 		DirInfo d; | 
 | 		FileParam f; | 
 | 		HFileInfo hf; | 
 | 	} pb; | 
 | 	short err; | 
 | 	 | 
 | 	pb.d.ioNamePtr = (unsigned char *)Pstring(path); | 
 | 	pb.d.ioVRefNum = 0; | 
 | 	pb.d.ioFDirIndex = 0; | 
 | 	pb.d.ioDrDirID = 0; | 
 | 	pb.f.ioFVersNum = 0; /* Fix found by Timo! See Tech Note 102 */ | 
 | 	err = PBGetCatInfoSync((CInfoPBPtr)&pb); | 
 | 	if (err != noErr) { | 
 | 		errno = ENOENT; | 
 | 		return -1; | 
 | 	} | 
 | 	if (pb.d.ioFlAttrib & LOCKBIT) | 
 | 		buf->st_mode = 0444; | 
 | 	else | 
 | 		buf->st_mode = 0666; | 
 | 	if (pb.d.ioFlAttrib & DIRBIT) { | 
 | 		buf->st_mode |= 0111 | S_IFDIR; | 
 | 		buf->st_size = pb.d.ioDrNmFls; | 
 | 		buf->st_rsize = 0; | 
 | 	} | 
 | 	else { | 
 | 		buf->st_mode |= S_IFREG; | 
 | 		if (pb.f.ioFlFndrInfo.fdType == 'APPL') | 
 | 			buf->st_mode |= 0111; | 
 | 	} | 
 | 	buf->st_ino = pb.hf.ioDirID; | 
 | 	buf->st_nlink = 1; | 
 | 	buf->st_uid = 1; | 
 | 	buf->st_gid = 1; | 
 | 	buf->st_size = (buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlLgLen; | 
 | 	buf->st_mtime = buf->st_atime = pb.f.ioFlMdDat; | 
 | 	buf->st_ctime = pb.f.ioFlCrDat; | 
 | 	buf->st_rsize = (buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlRLgLen; | 
 | 	*(unsigned long *)buf->st_type = | 
 | 		(buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlFndrInfo.fdType; | 
 | 	*(unsigned long *)buf->st_creator = | 
 | 		(buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlFndrInfo.fdCreator; | 
 | 	return 0; | 
 | } |