/* 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 */ if (hfsrunning()) err = PBGetCatInfoSync((CInfoPBPtr)&pb); else err = PBGetFInfoSync((ParmBlkPtr)&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; }