1/*
2  Copyright (c) 1990-2005 Info-ZIP.  All rights reserved.
3
4  See the accompanying file LICENSE, version 2000-Apr-09 or later
5  (the contents of which are also included in zip.h) for terms of use.
6  If, for some reason, all these files are missing, the Info-ZIP license
7  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
8*/
9
10#ifndef __theos_stat_h
11#define __theos_stat_h
12
13/* extended stat structure for stat, fstat, chmod */
14/* Written by Jean-Michel Dubois */
15
16#pragma field word
17struct stat {
18    unsigned short  st_mode;        /* file attributes */
19        #define S_IFMT      0xf000      /* file type mask */
20        #define S_IFIFO     0x1000      /* pipe */
21        #define S_IFCHR     0x2000      /* char device */
22        #define S_IFSOCK    0x3000      /* socket */
23        #define S_IFDIR     0x4000      /* directory */
24        #define S_IFLIB     0x5000      /* library */
25        #define S_IFBLK     0x6000      /* block device */
26        #define S_IFREG     0x8000      /* regular file */
27        #define S_IFREL     0x9000      /* relative (direct) */
28        #define S_IFKEY     0xA000      /* keyed */
29        #define S_IFIND     0xB000      /* indexed */
30        #define S_IFRND     0xC000      /* ???? */
31        #define S_IFR16     0xD000      /* 16 bit real mode program */
32        #define S_IFP16     0xE000      /* 16 bit protected mode prog */
33        #define S_IFP32     0xF000      /* 32 bit protected mode prog */
34
35        #define S_ISUID     0x0800      /* meaningless */
36        #define S_ISGID     0x0400      /* meaningless */
37        #define S_ISVTX     0x0200      /* meaningless */
38
39        #define S_IMODF     0x0800      /* modified */
40        #define S_INHID     0x0400      /* not hidden */
41
42        #define S_IRWXU     0x03c0      /* read,write,execute: owner */
43        #define S_IEUSR     0x0200      /* erase permission: owner */
44        #define S_IRUSR     0x0100      /* read permission: owner */
45        #define S_IWUSR     0x0080      /* write permission: owner */
46        #define S_IXUSR     0x0040      /* execute permission: owner */
47    /* group permissions */
48        #define S_IRWXG     0x0238
49        #define S_IEGRP     0x0200
50        #define S_IRGRP     0x0020
51        #define S_IWGRP     0x0010
52        #define S_IXGRP     0x0008
53    /* other never has erase permission */
54        #define S_IRWXO     0x0207      /* read,write,execute: other */
55        #define S_IROTH     0x0004      /* read permission: other */
56        #define S_IWOTH     0x0002      /* write permission: other */
57        #define S_IXOTH     0x0001      /* execute permission: other */
58
59        #define S_IREAD     0x0100      /* read permission, owner */
60        #define S_IEXEC     0x0040      /* execute permission, owner */
61        #define S_IWRITE    0x0080      /* write permission, owner */
62    short           st_ino;         /* not used */
63    short           st_dev;         /* not used */
64    short           st_rdev;        /* not used */
65    short           st_nlink;       /* not used */
66    short           st_uid;         /* owner id */
67    short           st_gid;         /* not used */
68    unsigned long   st_size;        /* size of file */
69    unsigned long   st_atime;       /* not used */
70    unsigned long   st_mtime;       /* date & time last modified */
71    unsigned long   st_ctime;       /* not used */
72    unsigned long   st_blksize;     /* buffer size */
73    unsigned short  st_org;         /* organization */
74    unsigned short  st_rlen;        /* record size */
75    unsigned short  st_klen;        /* key size */
76    char            st_grow;        /* growing factor */
77    char            st_protect;     /* native protections */
78};
79#pragma field
80
81#define S_ISREG(m)      (((m) & S_IFMT) >= S_IFREG)
82#define S_ISLIB(m)      (((m) & S_IFMT) == S_IFLIB)
83#define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)
84#define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)
85#define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)
86
87#define S_ISSEQ(m)      (((m) & S_IFMT) == S_IFREG)
88#define S_ISREL(m)      (((m) & S_IFMT) == S_IFREL)
89#define S_ISKEY(m)      (((m) & S_IFMT) == S_IFKEY)
90#define S_ISIND(m)      (((m) & S_IFMT) == S_IFIND)
91#define S_ISPRG(m)      (((m) & S_IFMT) >= S_IFP16)
92#define S_ISLNK(m)      0
93
94/* avoid conflict with original THEOS functions */
95
96#define stat(a,b)       _stat(a,b)
97#define fstat(a,b)      _fstat(a,b)
98#define chmod(a,b)      _chmod(a,b)
99
100extern int _stat(const char *file, struct stat *statptr);
101extern int _fstat(int fd, struct stat *statptr);
102extern int _chmod(const char *file, short mask);
103
104#define _chstat(a,b)    ((int) _sc_168(a,'p',(size_t)(b)))
105extern unsigned short   _sc_168(const char _far *fn, int cmd, size_t value);
106
107#endif /* !__theos_stat_h */
108