1 | /* $Id: stat.c,v 1.1 1999-12-10 17:11:28 ansari Exp $ */
|
---|
2 |
|
---|
3 | /*
|
---|
4 | * Minimal 'stat' emulation: tells directories from files and
|
---|
5 | * gives length and mtime.
|
---|
6 | *
|
---|
7 | * Largely based on code written by Guido van Rossum, CWI, Amsterdam
|
---|
8 | * and placed by him in the public domain --
|
---|
9 | * retrieved by anonymous FTP from ftp.cwi.nl
|
---|
10 | */
|
---|
11 |
|
---|
12 | #include <string.h>
|
---|
13 | #include <errno.h>
|
---|
14 | #include <sys/stat.h>
|
---|
15 | #include "unixmac.h"
|
---|
16 |
|
---|
17 | int sys_nerr = 0;
|
---|
18 | char *sys_errlist[] = {""};
|
---|
19 | char *myenviron[] = {NULL};
|
---|
20 | char **environ = myenviron;
|
---|
21 | extern int __uid, __gid;
|
---|
22 | int Stat(char*, long, struct stat*);
|
---|
23 |
|
---|
24 | int __uid = 0;
|
---|
25 | int __gid = 0;
|
---|
26 |
|
---|
27 | /* Bits in ioFlAttrib: */
|
---|
28 | #define LOCKBIT (1<<0) /* File locked */
|
---|
29 | #define DIRBIT (1<<4) /* It's a directory */
|
---|
30 |
|
---|
31 | /*
|
---|
32 | * Mac-ky "stat" in which filename is given relative to a directory,
|
---|
33 | * specified by long DirID.
|
---|
34 | */
|
---|
35 |
|
---|
36 | int
|
---|
37 | Stat(name, DirID, buf)
|
---|
38 | char *name;
|
---|
39 | long DirID;
|
---|
40 | struct stat *buf;
|
---|
41 | {
|
---|
42 | CInfoPBRec cipbr;
|
---|
43 | HFileInfo *fpb = (HFileInfo*)&cipbr;
|
---|
44 | DirInfo *dpb = (DirInfo*)&cipbr;
|
---|
45 | unsigned char pname[256];
|
---|
46 | short err;
|
---|
47 |
|
---|
48 | strcpy((char*)pname, name);
|
---|
49 | c2pstr((char*)pname);
|
---|
50 |
|
---|
51 | dpb->ioDrDirID = DirID;
|
---|
52 | fpb->ioNamePtr = pname;
|
---|
53 | fpb->ioVRefNum = 0;
|
---|
54 | fpb->ioFDirIndex = 0;
|
---|
55 | fpb->ioFVersNum = 0;
|
---|
56 | err = PBGetCatInfo(&cipbr, FALSE);
|
---|
57 | if (err != noErr) {
|
---|
58 | errno = ENOENT;
|
---|
59 | return -1;
|
---|
60 | }
|
---|
61 | if (fpb->ioFlAttrib & LOCKBIT)
|
---|
62 | buf->st_mode= 0444;
|
---|
63 | else
|
---|
64 | buf->st_mode= 0666;
|
---|
65 | if (fpb->ioFlAttrib & DIRBIT) {
|
---|
66 | buf->st_mode |= 0111 | S_IFDIR;
|
---|
67 | buf->st_size= dpb->ioDrNmFls;
|
---|
68 | buf->st_rsize= 0;
|
---|
69 | }
|
---|
70 | else {
|
---|
71 | buf->st_mode |= S_IFREG;
|
---|
72 | if (fpb->ioFlFndrInfo.fdType == 'APPL')
|
---|
73 | buf->st_mode |= 0111;
|
---|
74 | buf->st_size= fpb->ioFlLgLen;
|
---|
75 | buf->st_rsize= fpb->ioFlRLgLen;
|
---|
76 | }
|
---|
77 | buf->st_mtime= fpb->ioFlMdDat;
|
---|
78 | buf->st_ctime= fpb->ioFlCrDat;
|
---|
79 | buf->st_ino= (unsigned short)fpb->ioDirID;
|
---|
80 | buf->st_uid= __uid;
|
---|
81 | buf->st_gid= __gid;
|
---|
82 | return 0;
|
---|
83 | }
|
---|
84 |
|
---|
85 | int
|
---|
86 | stat(path, buf)
|
---|
87 | const char *path;
|
---|
88 | struct stat *buf;
|
---|
89 | {
|
---|
90 | return Stat(path, 0L, buf);
|
---|
91 | }
|
---|
92 |
|
---|
93 |
|
---|
94 | #if 0
|
---|
95 | int
|
---|
96 | fstat(fd, buf)
|
---|
97 | int fd;
|
---|
98 | struct stat *buf;
|
---|
99 | {
|
---|
100 | FCBPBRec fcb;
|
---|
101 | unsigned char pname[256];
|
---|
102 | long DirID;
|
---|
103 | short err;
|
---|
104 |
|
---|
105 | /*
|
---|
106 | * fdopen() gives FILE entry with name of file,
|
---|
107 | * as well as RefNum of containing directory
|
---|
108 | */
|
---|
109 |
|
---|
110 | FILE *fp = fdopen(fd, "");
|
---|
111 |
|
---|
112 | /*
|
---|
113 | * PBGetFCBInfo() converts short RefNum to long DirID
|
---|
114 | */
|
---|
115 |
|
---|
116 | fcb.ioRefNum= fp->refnum;
|
---|
117 | fcb.ioVRefNum= 0;
|
---|
118 | fcb.ioFCBIndx= 0;
|
---|
119 | fcb.ioNamePtr= pname;
|
---|
120 | err= PBGetFCBInfo(&fcb, FALSE);
|
---|
121 | if (err != noErr) {
|
---|
122 | errno = ENOENT;
|
---|
123 | return -1;
|
---|
124 | }
|
---|
125 | DirID = fcb.ioFCBParID;
|
---|
126 |
|
---|
127 | p2cstr(pname);
|
---|
128 | return Stat((char*)pname, DirID, buf);
|
---|
129 | }
|
---|
130 |
|
---|
131 | #endif |
---|