Fix up of file open flags (XCC)
[akaros.git] / kern / include / ros / fs.h
1 #ifndef _ROS_INC_STAT_H
2 #define _ROS_INC_STAT_H
3
4 #include <sys/types.h>
5 #include <time.h>
6
7 /* Keep this 255 to stay in sync with glibc (expects d_name[256]) */
8 #define MAX_FILENAME_SZ 255
9 /* This will change once we have a decent readdir / getdents syscall, and
10  * send the strlen along with the d_name.  The sizes need rechecked too, since
11  * they are probably wrong. */
12 struct kdirent {
13         __ino64_t                                       d_ino;          /* inode number */
14         __off64_t                                       d_off;          /* offset to the next dirent */
15         unsigned short                          d_reclen;       /* length of this record */
16         unsigned char                           d_type;
17         char                                            d_name[MAX_FILENAME_SZ + 1];    /* filename */
18 } __attribute__((aligned(8)));
19
20 /* These stat sizes should match the types in stat.h and types.h and the sizes
21  * in typesizes in glibc (which we modified slightly).  While glibc has it's own
22  * stat, we have this here so that the kernel is exporting the interface it
23  * expects.  We #def stat for our own internal use at the end. */
24 struct kstat {
25         __dev_t                                         st_dev;         /* Device.  */
26         __ino64_t                                       st_ino;         /* File serial number.  */
27         __mode_t                                        st_mode;        /* File mode.  */
28         __nlink_t                                       st_nlink;       /* Link count.  */
29         __uid_t                                         st_uid;         /* User ID of the file's owner. */
30         __gid_t                                         st_gid;         /* Group ID of the file's group.*/
31         __dev_t                                         st_rdev;        /* Device number, if device.  */
32         __off64_t                                       st_size;        /* Size of file, in bytes.  */
33         __blksize_t                                     st_blksize;     /* Optimal block size for I/O.  */
34         __blkcnt64_t                            st_blocks;      /* Number 512-byte blocks allocated. */
35         struct timespec                         st_atime;       /* Time of last access.  */
36         struct timespec                         st_mtime;       /* Time of last modification.  */
37         struct timespec                         st_ctime;       /* Time of last status change.  */
38 };
39
40 /* There are a bunch of things that glibc expects, which are part of the kernel
41  * interface, but that we don't want to clobber or otherwise conflict with
42  * glibc. */
43 #ifdef ROS_KERNEL
44 #define stat kstat
45 #define dirent kdirent 
46
47 /* File access modes for open and fcntl. */
48 #define O_RDONLY                0x00            /* Open read-only */
49 #define O_WRONLY                0x01            /* Open write-only */
50 #define O_RDWR                  0x02            /* Open read/write */
51 #define O_EXEC                  0x04            /* Open for exec (unsupported) */
52 #define O_ACCMODE               0x07
53
54 /* Bits OR'd into the second argument to open */
55 #define O_CREAT                 00000100        /* not fcntl */
56 #define O_CREATE                O_CREAT         /* fucking saving space with the 'E'? */
57 #define O_EXCL                  00000200        /* not fcntl */
58 #define O_NOCTTY                00000400        /* not fcntl */
59 #define O_TRUNC                 00001000        /* not fcntl */
60 #define O_APPEND                00002000
61 #define O_NONBLOCK              00004000
62 #define O_SYNC                  00010000
63 #define O_FSYNC                 O_SYNC
64 #define O_ASYNC                 00020000
65 #define O_DIRECT                00040000        /* Direct disk access. */
66 #define O_DIRECTORY             00200000        /* Must be a directory. */
67 #define O_NOFOLLOW              00400000        /* Do not follow links. */
68 #define O_NOATIME               01000000        /* Do not set atime. */
69 #define O_CLOEXEC               02000000        /* Set close_on_exec. */
70 #define O_REMCLO                04000000        /* Remove on close (unsupported). */
71 #define O_CREAT_FLAGS (O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC)
72 #define O_FCNTL_FLAGS (O_APPEND | O_ASYNC | O_DIRECT | O_NOATIME | O_NONBLOCK)
73
74 /* Plan9 names for these flags */
75 #define OREAD                   O_RDONLY
76 #define OWRITE                  O_WRONLY
77 #define ORDWR                   O_RDWR
78 #define OEXEC                   O_EXEC
79 #define OTRUNC                  O_TRUNC
80 #define OCEXEC                  O_CLOEXEC
81 #define OEXCL                   O_EXCL
82 #define ORCLOSE                 O_REMCLO
83
84 /* File creation modes (access controls) */
85 #define S_IRWXU 00700   /* user (file owner) has read, write and execute perms */
86 #define S_IRUSR 00400   /* user has read permission */
87 #define S_IWUSR 00200   /* user has write permission */
88 #define S_IXUSR 00100   /* user has execute permission */
89 #define S_IRWXG 00070   /* group has read, write and execute permission */
90 #define S_IRGRP 00040   /* group has read permission */
91 #define S_IWGRP 00020   /* group has write permission */
92 #define S_IXGRP 00010   /* group has execute permission */
93 #define S_IRWXO 00007   /* others have read, write and execute permission */
94 #define S_IROTH 00004   /* others have read permission */
95 #define S_IWOTH 00002   /* others have write permission */
96 #define S_IXOTH 00001   /* others have execute permission */
97 #define S_PMASK 00777   /* mask for all perms */
98
99 /* fcntl flags that we support, keep in sync with glibc */
100 #define F_DUPFD         0       /* Duplicate file descriptor */
101 #define F_GETFD         1       /* Get file descriptor flags */
102 #define F_SETFD         2       /* Set file descriptor flags */
103 #define F_GETFL         3       /* Get file status flags */
104 #define F_SETFL         4       /* Set file status flags */
105 /* For F_[GET|SET]FD */
106 #define FD_CLOEXEC      1
107
108 /* File type is encoded in the file mode */
109 #define __S_IFMT        0170000 /* These bits determine file type */
110 /* File types */
111 #define __S_IFDIR       0040000 /* Directory */
112 #define __S_IFCHR       0020000 /* Character device */
113 #define __S_IFBLK       0060000 /* Block device */
114 #define __S_IFREG       0100000 /* Regular file */
115 #define __S_IFIFO       0010000 /* FIFO */
116 #define __S_IFLNK       0120000 /* Symbolic link */
117 #define __S_IFSOCK      0140000 /* Socket */
118 /* Protection bits */
119 #define __S_ISUID       04000   /* Set user ID on execution */
120 #define __S_ISGID       02000   /* Set group ID on execution */
121 #define __S_ISVTX       01000   /* Save swapped text after use (sticky) */
122 #define __S_IREAD       0400    /* Read by owner */
123 #define __S_IWRITE      0200    /* Write by owner */
124 #define __S_IEXEC       0100    /* Execute by owner */
125 /* Test macros for file types.  */
126 #define __S_ISTYPE(mode, mask)  (((mode) & __S_IFMT) == (mask))
127 #define S_ISDIR(mode)   __S_ISTYPE((mode), __S_IFDIR)
128 #define S_ISCHR(mode)   __S_ISTYPE((mode), __S_IFCHR)
129 #define S_ISBLK(mode)   __S_ISTYPE((mode), __S_IFBLK)
130 #define S_ISREG(mode)   __S_ISTYPE((mode), __S_IFREG)
131 #define S_ISFIFO(mode)  __S_ISTYPE((mode), __S_IFIFO)
132 #define S_ISLNK(mode)   __S_ISTYPE((mode), __S_IFLNK)
133
134 #endif /* ROS_KERNEL */
135
136 #endif /* _ROS_INC_STAT_H */