diff options
Diffstat (limited to 'Mac/Compat/macstat.c')
-rw-r--r-- | Mac/Compat/macstat.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/Mac/Compat/macstat.c b/Mac/Compat/macstat.c new file mode 100644 index 0000000..e645050 --- /dev/null +++ b/Mac/Compat/macstat.c @@ -0,0 +1,57 @@ +/* Minimal 'stat' emulation: tells directories from files and + gives length and mtime. + Public domain by Guido van Rossum, CWI, Amsterdam (July 1987). +*/ + +#include "stat.h" +#include "macdefs.h" + +/* Bits in ioFlAttrib: */ +#define LOCKBIT (1<<0) /* File locked */ +#define DIRBIT (1<<4) /* It's a directory */ + +int +stat(path, buf) + char *path; + struct stat *buf; +{ + union { + DirInfo d; + FileParam f; + HFileInfo hf; + } pb; + char name[256]; + short err; + + pb.d.ioNamePtr= (unsigned char *)c2pstr(strcpy(name, 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= PBGetCatInfo((CInfoPBPtr)&pb, FALSE); + else + err= PBGetFInfo((ParmBlkPtr)&pb, FALSE); + 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_size= pb.f.ioFlLgLen; + buf->st_rsize= pb.f.ioFlRLgLen; + } + buf->st_mtime= pb.f.ioFlMdDat - TIMEDIFF; + return 0; +} |