blob: a1265afbd7fcb53fe5ce8b2d69504f917e71f168 [file] [log] [blame]
Guido van Rossume7834441994-08-26 09:09:48 +00001/* Minimal 'stat' emulation: tells directories from files and
2 gives length and mtime.
3 Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
Guido van Rossum739267b1994-08-29 08:42:37 +00004 Updated to give more info, August 1994.
Guido van Rossume7834441994-08-26 09:09:48 +00005*/
6
Guido van Rossum739267b1994-08-29 08:42:37 +00007#include "macstat.h"
Guido van Rossume7834441994-08-26 09:09:48 +00008#include "macdefs.h"
9
10/* Bits in ioFlAttrib: */
11#define LOCKBIT (1<<0) /* File locked */
12#define DIRBIT (1<<4) /* It's a directory */
13
14int
Guido van Rossum739267b1994-08-29 08:42:37 +000015macstat(path, buf)
Guido van Rossume7834441994-08-26 09:09:48 +000016 char *path;
Guido van Rossum739267b1994-08-29 08:42:37 +000017 struct macstat *buf;
Guido van Rossume7834441994-08-26 09:09:48 +000018{
19 union {
20 DirInfo d;
21 FileParam f;
22 HFileInfo hf;
23 } pb;
Guido van Rossume7834441994-08-26 09:09:48 +000024 short err;
25
Jack Jansen67132b31995-01-18 13:55:41 +000026 pb.d.ioNamePtr = (unsigned char *)Pstring(path);
Guido van Rossum739267b1994-08-29 08:42:37 +000027 pb.d.ioVRefNum = 0;
28 pb.d.ioFDirIndex = 0;
29 pb.d.ioDrDirID = 0;
30 pb.f.ioFVersNum = 0; /* Fix found by Timo! See Tech Note 102 */
Guido van Rossume7834441994-08-26 09:09:48 +000031 if (hfsrunning())
Guido van Rossum739267b1994-08-29 08:42:37 +000032 err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
Guido van Rossume7834441994-08-26 09:09:48 +000033 else
Guido van Rossum739267b1994-08-29 08:42:37 +000034 err = PBGetFInfo((ParmBlkPtr)&pb, FALSE);
Guido van Rossume7834441994-08-26 09:09:48 +000035 if (err != noErr) {
36 errno = ENOENT;
37 return -1;
38 }
39 if (pb.d.ioFlAttrib & LOCKBIT)
Guido van Rossum739267b1994-08-29 08:42:37 +000040 buf->st_mode = 0444;
Guido van Rossume7834441994-08-26 09:09:48 +000041 else
Guido van Rossum739267b1994-08-29 08:42:37 +000042 buf->st_mode = 0666;
Guido van Rossume7834441994-08-26 09:09:48 +000043 if (pb.d.ioFlAttrib & DIRBIT) {
44 buf->st_mode |= 0111 | S_IFDIR;
Guido van Rossum739267b1994-08-29 08:42:37 +000045 buf->st_size = pb.d.ioDrNmFls;
46 buf->st_rsize = 0;
Guido van Rossume7834441994-08-26 09:09:48 +000047 }
48 else {
49 buf->st_mode |= S_IFREG;
50 if (pb.f.ioFlFndrInfo.fdType == 'APPL')
51 buf->st_mode |= 0111;
Guido van Rossume7834441994-08-26 09:09:48 +000052 }
Guido van Rossum739267b1994-08-29 08:42:37 +000053 buf->st_ino = pb.hf.ioDirID;
54 buf->st_nlink = 1;
55 buf->st_uid = 1;
56 buf->st_gid = 1;
Guido van Rossum08d20711995-08-08 14:09:33 +000057 buf->st_size = (buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlLgLen;
Guido van Rossum739267b1994-08-29 08:42:37 +000058 buf->st_mtime = buf->st_atime = pb.f.ioFlMdDat;
59 buf->st_ctime = pb.f.ioFlCrDat;
Guido van Rossum08d20711995-08-08 14:09:33 +000060 buf->st_rsize = (buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlRLgLen;
61 *(unsigned long *)buf->st_type =
62 (buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlFndrInfo.fdType;
63 *(unsigned long *)buf->st_creator =
64 (buf->st_mode & S_IFDIR) ? 0 : pb.f.ioFlFndrInfo.fdCreator;
Guido van Rossume7834441994-08-26 09:09:48 +000065 return 0;
66}