xref: /haiku/headers/posix/sys/stat.h (revision 746cac055adc6ac3308c7bc2d29040fb95689cc9)
1 /*
2  * Copyright 2002-2008, Haiku Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _SYS_STAT_H_
6 #define _SYS_STAT_H_
7 
8 
9 #include <sys/types.h>
10 
11 
12 struct stat {
13 	dev_t			st_dev;			/* "device" that this file resides on */
14 	ino_t			st_ino;			/* this file's inode #, unique per device */
15 	mode_t			st_mode;		/* mode bits (rwx for user, group, etc) */
16 	nlink_t			st_nlink;		/* number of hard links to this file */
17 	uid_t			st_uid;			/* user id of the owner of this file */
18 	gid_t			st_gid;			/* group id of the owner of this file */
19 	off_t			st_size;		/* size in bytes of this file */
20 	dev_t			st_rdev;		/* device type (not used) */
21 	size_t			st_blksize;		/* preferred block size for i/o */
22 	time_t			st_atime;		/* last access time */
23 	time_t			st_mtime;		/* last modification time */
24 	time_t			st_ctime;		/* last change time, not creation time */
25 	time_t			st_crtime;		/* creation time */
26 
27 	/* Haiku extensions:
28 	 * TODO: we might also define special types for files and TTYs
29 	 * TODO: we should find another solution for this, as BStatable::GetStat()
30 	 *		can only retrieve the R5 stat structure */
31 	unsigned int	st_type;		/* attribute/index type */
32 };
33 
34 /* extended file types */
35 #define S_ATTR_DIR			01000000000	/* attribute directory */
36 #define S_ATTR				02000000000	/* attribute */
37 #define S_INDEX_DIR			04000000000	/* index (or index directory) */
38 #define S_STR_INDEX			00100000000	/* string index */
39 #define S_INT_INDEX			00200000000	/* int32 index */
40 #define S_UINT_INDEX		00400000000	/* uint32 index */
41 #define S_LONG_LONG_INDEX	00010000000	/* int64 index */
42 #define S_ULONG_LONG_INDEX	00020000000	/* uint64 index */
43 #define S_FLOAT_INDEX		00040000000	/* float index */
44 #define S_DOUBLE_INDEX		00001000000	/* double index */
45 #define S_ALLOW_DUPS		00002000000	/* allow duplicate entries (currently unused) */
46 
47 /* link types */
48 #define	S_LINK_SELF_HEALING	00001000000	/* link will be updated if you move its target */
49 #define S_LINK_AUTO_DELETE	00002000000	/* link will be deleted if you delete its target */
50 
51 /* standard file types */
52 #define S_IFMT				00000170000 /* type of file */
53 #define	S_IFSOCK			00000140000 /* socket */
54 #define	S_IFLNK				00000120000 /* symbolic link */
55 #define S_IFREG 			00000100000 /* regular */
56 #define S_IFBLK 			00000060000 /* block special */
57 #define S_IFDIR 			00000040000 /* directory */
58 #define S_IFCHR 			00000020000 /* character special */
59 #define S_IFIFO 			00000010000 /* fifo */
60 
61 #define S_ISREG(mode)		(((mode) & S_IFMT) == S_IFREG)
62 #define S_ISLNK(mode)		(((mode) & S_IFMT) == S_IFLNK)
63 #define S_ISBLK(mode)		(((mode) & S_IFMT) == S_IFBLK)
64 #define S_ISDIR(mode)		(((mode) & S_IFMT) == S_IFDIR)
65 #define S_ISCHR(mode)		(((mode) & S_IFMT) == S_IFCHR)
66 #define S_ISFIFO(mode)		(((mode) & S_IFMT) == S_IFIFO)
67 #define S_ISSOCK(mode)		(((mode) & S_IFMT) == S_IFSOCK)
68 #define S_ISINDEX(mode)		(((mode) & S_INDEX_DIR) == S_INDEX_DIR)
69 
70 #define	S_IUMSK 07777		/* user settable bits */
71 
72 #define S_ISUID 04000       /* set user id on execution */
73 #define S_ISGID 02000       /* set group id on execution */
74 
75 #define S_ISVTX 01000       /* save swapped text even after use (sticky bit) */
76 
77 #define S_IRWXU 00700       /* read, write, execute: owner */
78 #define S_IRUSR 00400       /* read permission: owner */
79 #define S_IWUSR 00200       /* write permission: owner */
80 #define S_IXUSR 00100       /* execute permission: owner */
81 #define S_IRWXG 00070       /* read, write, execute: group */
82 #define S_IRGRP 00040       /* read permission: group */
83 #define S_IWGRP 00020       /* write permission: group */
84 #define S_IXGRP 00010       /* execute permission: group */
85 #define S_IRWXO 00007       /* read, write, execute: other */
86 #define S_IROTH 00004       /* read permission: other */
87 #define S_IWOTH 00002       /* write permission: other */
88 #define S_IXOTH 00001       /* execute permission: other */
89 
90 /* BSD extensions */
91 #define S_IREAD		S_IRUSR
92 #define S_IWRITE	S_IWUSR
93 #define S_IEXEC		S_IXUSR
94 
95 #define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO)
96 #define ALLPERMS    (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
97 #define	DEFFILEMODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
98 	/* default file mode, everyone can read/write */
99 
100 #ifdef __cplusplus
101 extern "C" {
102 #endif
103 
104 extern int    chmod(const char *path, mode_t mode);
105 extern int 	  fchmod(int fd, mode_t mode);
106 extern int    _stat(const char *path, struct stat *st, size_t statSize);
107 extern int    _fstat(int fd, struct stat *st, size_t statSize);
108 extern int    _lstat(const char *path, struct stat *st, size_t statSize);
109 extern int    mkdir(const char *path, mode_t mode);
110 extern int    mkfifo(const char *path, mode_t mode);
111 extern mode_t umask(mode_t cmask);
112 
113 /* This achieves backwards compatibility with R5 */
114 #if 0 /* def HAIKU_TARGET_PLATFORM_HAIKU */
115 #define stat(fd, st) _stat(fd, st, sizeof(struct stat))
116 #define fstat(fd, st) _fstat(fd, st, sizeof(struct stat))
117 #define lstat(fd, st) _lstat(fd, st, sizeof(struct stat))
118 #else
119 /* ... and this fixes the build for R5 for now */
120 extern int    stat(const char *path, struct stat *st);
121 extern int    fstat(int fd, struct stat *st);
122 extern int    lstat(const char *path, struct stat *st);
123 #endif
124 
125 #ifdef __cplusplus
126 }
127 #endif
128 
129 #endif	/* _SYS_STAT_H_ */
130