summaryrefslogtreecommitdiffstats
path: root/Mac/Compat/macstat.c
blob: 8c67994525612a4b840ce3e2196c1275087c5fff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/* 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;
}