diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 5a995f7d..958bf951 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -37,6 +37,7 @@ set(SOURCES src/sys/stat.cpp src/sys/chdir.cpp src/sys/link.cpp + src/sys/uname.cpp src/fs/VFS.cpp src/fs/tmpfs/FileSystem.cpp src/fs/devices/DeviceRegistry.cpp diff --git a/kernel/src/sys/uname.cpp b/kernel/src/sys/uname.cpp new file mode 100644 index 00000000..2d9288d9 --- /dev/null +++ b/kernel/src/sys/uname.cpp @@ -0,0 +1,25 @@ +#include "arch/CPU.h" +#include "memory/MemoryManager.h" +#include "sys/Syscall.h" +#include +#include + +Result sys_uname(Registers*, SyscallArgs args) +{ + utsname* buf = (utsname*)args[0]; + + utsname result; + + strncpy(result.sysname, "moon", _UTSNAME_LENGTH); + strncpy(result.nodename, "lunar", _UTSNAME_LENGTH); + + // FIXME: Hardcode these at build time instead of in code. + strncpy(result.release, "0.1", _UTSNAME_LENGTH); + strncpy(result.version, "alpha", _UTSNAME_LENGTH); + + strncpy(result.machine, CPU::platform_string(), _UTSNAME_LENGTH); + + if (!MemoryManager::copy_to_user_typed(buf, &result)) return err(EFAULT); + + return 0; +} diff --git a/libc/include/bits/struct_utsname.h b/libc/include/bits/struct_utsname.h new file mode 100644 index 00000000..03a79f71 --- /dev/null +++ b/libc/include/bits/struct_utsname.h @@ -0,0 +1,17 @@ +/* bits/struct_utsname.h: The utsname structure. */ + +#ifndef _BITS_STRUCT_UTSNAME_H +#define _BITS_STRUCT_UTSNAME_H + +#define _UTSNAME_LENGTH 256 + +struct utsname +{ + char sysname[_UTSNAME_LENGTH]; + char nodename[_UTSNAME_LENGTH]; + char release[_UTSNAME_LENGTH]; + char version[_UTSNAME_LENGTH]; + char machine[_UTSNAME_LENGTH]; +}; + +#endif diff --git a/libc/include/sys/utsname.h b/libc/include/sys/utsname.h new file mode 100644 index 00000000..fa2842c3 --- /dev/null +++ b/libc/include/sys/utsname.h @@ -0,0 +1,20 @@ +/* sys/utsname.h: Kernel name and information. */ + +#ifndef _SYS_UTSNAME_H +#define _SYS_UTSNAME_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Get kernel name and information. */ + int uname(struct utsname* buf); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libluna/include/luna/Syscall.h b/libluna/include/luna/Syscall.h index 18834c7f..60299092 100644 --- a/libluna/include/luna/Syscall.h +++ b/libluna/include/luna/Syscall.h @@ -4,7 +4,7 @@ _e(exit) _e(clock_gettime) _e(mmap) _e(munmap) _e(usleep) _e(openat) _e(close) _e(read) _e(getpid) _e(write) \ _e(lseek) _e(mkdir) _e(execve) _e(mknod) _e(fork) _e(waitpid) _e(getppid) _e(fcntl) _e(getdents) _e(getuid) \ _e(geteuid) _e(getgid) _e(getegid) _e(setuid) _e(setgid) _e(seteuid) _e(setegid) _e(chmod) _e(chown) \ - _e(ioctl) _e(fstatat) _e(chdir) _e(getcwd) _e(unlinkat) + _e(ioctl) _e(fstatat) _e(chdir) _e(getcwd) _e(unlinkat) _e(uname) enum Syscalls {