#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
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 */