Bläddra i källkod

Print the contents of motd.txt on boot.

Andreas Kling 6 år sedan
förälder
incheckning
39fa1eb2c2
5 ändrade filer med 28 tillägg och 8 borttagningar
  1. 1 1
      Kernel/Boot/boot.asm
  2. 2 1
      Kernel/Makefile
  3. 8 5
      Kernel/StdLib.cpp
  4. 11 0
      Kernel/init.cpp
  5. 6 1
      VirtualFileSystem/FileHandle.cpp

+ 1 - 1
Kernel/Boot/boot.asm

@@ -42,7 +42,7 @@ boot:
 
     inc word [cur_lba]
     mov cx, word [cur_lba]
-    cmp cx, 300
+    cmp cx, 400
     jz .sector_loop_end
 
     mov bx, es

+ 2 - 1
Kernel/Makefile

@@ -30,7 +30,8 @@ VFS_OBJS = \
     ../VirtualFileSystem/DiskBackedFileSystem.o \
     ../VirtualFileSystem/Ext2FileSystem.o \
     ../VirtualFileSystem/InodeIdentifier.o \
-    ../VirtualFileSystem/VirtualFileSystem.o
+    ../VirtualFileSystem/VirtualFileSystem.o \
+    ../VirtualFileSystem/FileHandle.o
 
 AK_OBJS = \
     ../AK/String.o \

+ 8 - 5
Kernel/StdLib.cpp

@@ -1,6 +1,7 @@
 #include "types.h"
 #include "Assertions.h"
 #include "kmalloc.h"
+#include <AK/Types.h>
 
 void memcpy(void *dest, const void *src, DWORD n)
 {
@@ -51,11 +52,13 @@ char* strdup(const char *str)
 
 int memcmp(const void* v1, const void* v2, size_t n)
 {
-    size_t m;
-    const char* s1 = (const char*)v1;
-    const char* s2 = (const char*)v2;
-    for (m = 0; m < n && *s1 == *s2; ++s1, ++s2);
-    return m == n ? 0 : -1;
+    auto* s1 = (const byte*)v1;
+    auto* s2 = (const byte*)v2;
+    while (n-- > 0) {
+        if (*s1++ != *s2++)
+            return s1[-1] < s2[-1] ? -1 : 1;
+    }
+    return 0;
 }
 
 extern "C" void __cxa_pure_virtual()

+ 11 - 0
Kernel/init.cpp

@@ -20,6 +20,7 @@
 #include <VirtualFileSystem/RandomDevice.h>
 #include <VirtualFileSystem/Ext2FileSystem.h>
 #include <VirtualFileSystem/VirtualFileSystem.h>
+#include <VirtualFileSystem/FileHandle.h>
 #include <AK/OwnPtr.h>
 
 #if 0
@@ -154,6 +155,16 @@ void init()
 
     vfs->listDirectory("/");
 
+    {
+        auto motdFile = vfs->open("/motd.txt");
+        ASSERT(motdFile);
+        auto motdData = motdFile->readEntireFile();
+
+        for (unsigned i = 0; i < motdData.size(); ++i) {
+            kprintf("%c", motdData[i]);
+        }
+    }
+
     // The idle task will spend its eternity here for now.
     for (;;) {
         asm("hlt");

+ 6 - 1
VirtualFileSystem/FileHandle.cpp

@@ -5,7 +5,7 @@
 #include "UnixTypes.h"
 
 FileHandle::FileHandle(RetainPtr<VirtualFileSystem::Node>&& vnode)
-    : m_vnode(std::move(vnode))
+    : m_vnode(move(vnode))
 {
 }
 
@@ -13,12 +13,14 @@ FileHandle::~FileHandle()
 {
 }
 
+#ifndef SERENITY_KERNEL
 bool additionWouldOverflow(Unix::off_t a, Unix::off_t b)
 {
     ASSERT(a > 0);
     uint64_t ua = a;
     return (ua + b) > maxFileOffset;
 }
+#endif
 
 int FileHandle::stat(Unix::stat* buffer)
 {
@@ -67,14 +69,17 @@ Unix::off_t FileHandle::seek(Unix::off_t offset, int whence)
         break;
     case SEEK_CUR:
         newOffset = m_currentOffset + offset;
+#ifndef SERENITY_KERNEL
         if (additionWouldOverflow(m_currentOffset, offset))
             return -EOVERFLOW;
+#endif
         if (newOffset < 0)
             return -EINVAL;
         break;
     case SEEK_END:
         // FIXME: Implement!
         notImplemented();
+        newOffset = 0;
         break;
     default:
         return -EINVAL;