diff --git a/examples/readfile/readfile.q b/examples/readfile/readfile.q new file mode 100644 index 0000000..8488cc1 --- /dev/null +++ b/examples/readfile/readfile.q @@ -0,0 +1,13 @@ +import fs +import sys + +main() { + show("/proc/sys/kernel/ostype") + show("/proc/sys/kernel/osrelease") + show("/proc/sys/kernel/arch") +} + +show(path []byte) { + contents, length := fs.readFile(path) + sys.write(1, contents, length) +} \ No newline at end of file diff --git a/lib/fs/fs.q b/lib/fs/fs.q new file mode 100644 index 0000000..c0e3c5c --- /dev/null +++ b/lib/fs/fs.q @@ -0,0 +1,27 @@ +import mem +import sys + +readFile(path []byte) -> (*byte, int) { + stat := new(sys.file_stat) + + if sys.stat(path, stat) < 0 { + return 0, 0 + } + + size := stat.st_size + + if size < 512 { + size = 512 + } + + file := sys.open(path, 0, 0) + + if file < 0 { + return 0, 0 + } + + contents := mem.alloc(size) + length := sys.read(file, contents, size) + sys.close(file) + return contents, length +} \ No newline at end of file diff --git a/lib/sys/struct_linux.q b/lib/sys/struct_linux.q index e07b9dd..ce76851 100644 --- a/lib/sys/struct_linux.q +++ b/lib/sys/struct_linux.q @@ -5,6 +5,29 @@ sockaddr_in { sin_zero int64 } +file_stat { + st_dev uint64 + st_ino uint64 + st_nlink uint64 + st_mode uint32 + st_uid uint32 + st_gid uint32 + _ uint32 + st_rdev uint64 + st_size int64 + st_blksize int64 + st_blocks int64 + st_atime int64 + st_atime_nsec int64 + st_mtime int64 + st_mtime_nsec int64 + st_ctime int64 + st_ctime_nsec int64 + _ int64 + _ int64 + _ int64 +} + timespec { seconds int64 nanoseconds int64 diff --git a/lib/sys/sys_linux.q b/lib/sys/sys_linux.q index 3c89ebf..c536d7f 100644 --- a/lib/sys/sys_linux.q +++ b/lib/sys/sys_linux.q @@ -22,6 +22,10 @@ close(fd int) -> int { return syscall(n.close, fd) } +stat(path *any, stat *file_stat) -> int { + return syscall(n.newfstatat, -100, path, stat, 0) +} + clone(flags uint, stack *any, parent *int, child *int, tls uint) -> int { return syscall(n.clone, flags, stack, parent, child, tls) } diff --git a/lib/sys/sys_linux_arm.q b/lib/sys/sys_linux_arm.q index b8c8e39..df6c67a 100644 --- a/lib/sys/sys_linux_arm.q +++ b/lib/sys/sys_linux_arm.q @@ -6,6 +6,7 @@ const { munmap 215 openat 56 close 57 + newfstatat 79 clone 220 execve 221 exit 93 diff --git a/lib/sys/sys_linux_x86.q b/lib/sys/sys_linux_x86.q index 02266a7..6b5817c 100644 --- a/lib/sys/sys_linux_x86.q +++ b/lib/sys/sys_linux_x86.q @@ -6,6 +6,7 @@ const { munmap 11 openat 257 close 3 + newfstatat 262 clone 56 execve 59 exit 60