Add back the plan 9 system calls
[akaros.git] / kern / include / ros / fs.h
index 5abe81f..e01f039 100644 (file)
@@ -2,18 +2,20 @@
 #define _ROS_INC_STAT_H
 
 #include <sys/types.h>
-#include <timing.h>
+#include <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. */
 struct kdirent {
-       ino_t                                   d_ino;       /* inode number */
-       off_t                                   d_off;       /* offset to the next dirent */
-       unsigned short                          d_reclen;    /* length of this record */
-       char                                    d_name[MAX_FILENAME_SZ + 1]; /* filename */
-};
+       __ino64_t                                       d_ino;          /* inode number */
+       __off64_t                                       d_off;          /* offset to the next dirent */
+       unsigned short                          d_reclen;       /* length of this record */
+       unsigned char                           d_type;
+       char                                            d_name[MAX_FILENAME_SZ + 1];    /* filename */
+} __attribute__((aligned(8)));
 
 /* These stat sizes should match the types in stat.h and types.h and the sizes
  * in typesizes in glibc (which we modified slightly).  While glibc has it's own
@@ -35,9 +37,100 @@ struct kstat {
        struct timespec                         st_ctime;       /* Time of last status change.  */
 };
 
+/* There are a bunch of things that glibc expects, which are part of the kernel
+ * interface, but that we don't want to clobber or otherwise conflict with
+ * glibc. */
 #ifdef ROS_KERNEL
 #define stat kstat
 #define dirent kdirent 
-#endif
+
+/* File access modes for open and fcntl. */
+#define O_RDONLY               0x00            /* Open read-only */
+#define O_WRONLY               0x01            /* Open write-only */
+#define O_RDWR                 0x02            /* Open read/write */
+#define O_EXEC                 0x04            /* Open for exec (unsupported) */
+#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_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). */
+#define O_CREAT_FLAGS (O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC)
+#define O_FCNTL_FLAGS (O_APPEND | O_ASYNC | O_DIRECT | O_NOATIME | O_NONBLOCK)
+
+/* Plan9 names for these flags */
+#define OREAD                  O_RDONLY
+#define OWRITE                 O_WRONLY
+#define ORDWR                  O_RDWR
+#define OEXEC                  O_EXEC
+#define OTRUNC                 O_TRUNC
+#define OCEXEC                 O_CLOEXEC
+#define OEXCL                  O_EXCL
+#define ORCLOSE                        O_REMCLO
+
+/* 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 */
+
+/* fcntl flags that we support, keep in sync with glibc */
+#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 */
+/* For F_[GET|SET]FD */
+#define FD_CLOEXEC     1
+
+/* File type is encoded in the file mode */
+#define __S_IFMT       0170000 /* These bits determine file type */
+/* File types */
+#define __S_IFDIR      0040000 /* Directory */
+#define __S_IFCHR      0020000 /* Character device */
+#define __S_IFBLK      0060000 /* Block device */
+#define __S_IFREG      0100000 /* Regular file */
+#define __S_IFIFO      0010000 /* FIFO */
+#define __S_IFLNK      0120000 /* Symbolic link */
+#define __S_IFSOCK     0140000 /* Socket */
+/* Protection bits */
+#define __S_ISUID      04000   /* Set user ID on execution */
+#define __S_ISGID      02000   /* Set group ID on execution */
+#define __S_ISVTX      01000   /* Save swapped text after use (sticky) */
+#define __S_IREAD      0400    /* Read by owner */
+#define __S_IWRITE     0200    /* Write by owner */
+#define __S_IEXEC      0100    /* 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 */
 
 #endif /* _ROS_INC_STAT_H */