x86: Rename VPD (XCC)
[akaros.git] / kern / include / ros / fs.h
index 9865553..c2debed 100644 (file)
@@ -1,11 +1,9 @@
-#ifndef _ROS_INC_STAT_H
-#define _ROS_INC_STAT_H
+#pragma once
 
 #include <sys/types.h>
-#include <timing.h>
+#include <ros/limits.h>
+#include <ros/time.h>
 
-/* Keep this 255 to stay in sync with glibc (expects d_name[256]) */
-#define MAX_FILENAME_SZ 255
 /* This will change once we have a decent readdir / getdents syscall, and
  * send the strlen along with the d_name.  The sizes need rechecked too, since
  * they are probably wrong. */
@@ -31,15 +29,114 @@ struct kstat {
        __dev_t                                         st_rdev;        /* Device number, if device.  */
        __off64_t                                       st_size;        /* Size of file, in bytes.  */
        __blksize_t                                     st_blksize;     /* Optimal block size for I/O.  */
-       __blkcnt64_t                            st_blocks;      /* Number 512-byte blocks allocated. */
-       struct timespec                         st_atime;       /* Time of last access.  */
-       struct timespec                         st_mtime;       /* Time of last modification.  */
-       struct timespec                         st_ctime;       /* Time of last status change.  */
+       __blkcnt64_t                            st_blocks;      /* Number 512-byte blocks allocd. */
+       struct timespec                         st_atim       /* Time of last access.  */
+       struct timespec                         st_mtim       /* Time of last modification.  */
+       struct timespec                         st_ctim       /* Time of last status change.  */
 };
 
+/* File access modes for open and fcntl. */
+#define O_READ                 0x01            /* Open for reading */
+#define O_WRITE                        0x02            /* Open for writing */
+#define O_EXEC                 0x04            /* Open for exec */
+#define O_RDONLY               O_READ          /* Open read-only */
+#define O_WRONLY               O_WRITE         /* Open write-only */
+#define O_RDWR                 (O_READ | O_WRITE)              /* Open read/write */
+#define O_ACCMODE              0x07
+
+/* Bits OR'd into the second argument to open */
+#define O_CREAT                        00000100        /* not fcntl */
+#define O_CREATE               O_CREAT         /* fucking saving space with the 'E'? */
+#define O_EXCL                 00000200        /* not fcntl */
+#define O_NOCTTY               00000400        /* not fcntl */
+#define O_TRUNC                        00001000        /* not fcntl */
+#define O_APPEND               00002000
+#define O_NONBLOCK             00004000
+#define O_SYNC                 00010000
+#define O_FSYNC                        O_SYNC
+#define O_ASYNC                        00020000
+#define O_DIRECT               00040000        /* Direct disk access. */
+#define O_PATH                 00100000        /* Path only, no I/O */
+#define O_DIRECTORY            00200000        /* Must be a directory. */
+#define O_NOFOLLOW             00400000        /* Do not follow links. */
+#define O_NOATIME              01000000        /* Do not set atime. */
+#define O_CLOEXEC              02000000        /* Set close_on_exec. */
+#define O_REMCLO               04000000        /* Remove on close (unsupported). */
+
+/* Keep this value in sync with glibc (io/fcntl.h) */
+#define AT_FDCWD       -100
+
+#define F_DUPFD                0       /* Duplicate file descriptor */
+#define F_GETFD                1       /* Get file descriptor flags */
+#define F_SETFD                2       /* Set file descriptor flags */
+#define F_GETFL                3       /* Get file status flags */
+#define F_SETFL                4       /* Set file status flags */
+#define F_SYNC         101     /* fsync() */
+#define F_ADVISE       102     /* posix_fadvise{,64}() */
+/* For F_[GET|SET]FD */
+#define FD_CLOEXEC     1
+/* Advise to `posix_fadvise'.  */
+#define POSIX_FADV_NORMAL              0       /* No further special treatment */
+#define POSIX_FADV_RANDOM              1       /* Expect random page references */
+#define POSIX_FADV_SEQUENTIAL  2       /* Expect sequential page references */
+#define POSIX_FADV_WILLNEED            3       /* Will need these pages */
+#define POSIX_FADV_DONTNEED            4       /* Don't need these pages */
+#define POSIX_FADV_NOREUSE             5       /* Data will be accessed once */
+
+/* TODO: have userpsace use our stuff from bits/stats.h */
 #ifdef ROS_KERNEL
 #define stat kstat
-#define dirent kdirent 
-#endif
+#define dirent kdirent
+
+/* File creation modes (access controls) */
+#define S_IRWXU 00700  /* user (file owner) has read, write and execute perms */
+#define S_IRUSR 00400  /* user has read permission */
+#define S_IWUSR 00200  /* user has write permission */
+#define S_IXUSR 00100  /* user has execute permission */
+#define S_IRWXG 00070  /* group has read, write and execute permission */
+#define S_IRGRP 00040  /* group has read permission */
+#define S_IWGRP 00020  /* group has write permission */
+#define S_IXGRP 00010  /* group has execute permission */
+#define S_IRWXO 00007  /* others have read, write and execute permission */
+#define S_IROTH 00004  /* others have read permission */
+#define S_IWOTH 00002  /* others have write permission */
+#define S_IXOTH 00001  /* others have execute permission */
+#define S_PMASK 00777  /* mask for all perms */
+
+/* File type is encoded in the file mode */
+#define __S_IFMT               000170000       /* These bits determine file type */
+/* File types */
+#define __S_IFDIR              000040000       /* Directory */
+#define __S_IFCHR              000020000       /* Character device */
+#define __S_IFBLK              000060000       /* Block device */
+#define __S_IFREG              000100000       /* Regular file */
+#define __S_IFIFO              000010000       /* FIFO */
+#define __S_IFLNK              000120000       /* Symbolic link */
+#define __S_IFSOCK             000140000       /* Socket */
+/* Protection bits */
+#define __S_ISUID              000004000       /* Set user ID on execution */
+#define __S_ISGID              000002000       /* Set group ID on execution */
+#define __S_ISVTX              000001000       /* Save swapped text after use (sticky) */
+#define __S_IREAD              000000400       /* Read by owner */
+#define __S_IWRITE             000000200       /* Write by owner */
+#define __S_IEXEC              000000100       /* Execute by owner */
+
+/* Test macros for file types */
+#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
+#define S_ISDIR(mode)  __S_ISTYPE((mode), __S_IFDIR)
+#define S_ISCHR(mode)  __S_ISTYPE((mode), __S_IFCHR)
+#define S_ISBLK(mode)  __S_ISTYPE((mode), __S_IFBLK)
+#define S_ISREG(mode)  __S_ISTYPE((mode), __S_IFREG)
+#define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO)
+#define S_ISLNK(mode)  __S_ISTYPE((mode), __S_IFLNK)
+
+#endif /* ROS_KERNEL */
+
+/* Non-standard bits */
+#define __S_NONSTD             077000000       /* Magic Akaros bits */
+#define __S_READABLE   001000000       /* File is readable */
+#define __S_WRITABLE   002000000       /* File is writable */
 
-#endif /* _ROS_INC_STAT_H */
+/* Test macros for non-standard bits */
+#define S_READABLE(mode)       (((mode) & __S_READABLE) != 0)
+#define S_WRITABLE(mode)       (((mode) & __S_WRITABLE) != 0)