| 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 | 
|---|