From 616ef6c9638dd25e559dd4980393caf1965517f5 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Tue, 29 Oct 2013 01:03:57 +0100 Subject: [PATCH] Add /dev/null. --- sortix/Makefile | 1 + sortix/fs/null.cpp | 90 ++++++++++++++++++++++++++++++++++++++++++++++ sortix/fs/null.h | 48 +++++++++++++++++++++++++ sortix/kernel.cpp | 9 +++++ 4 files changed, 148 insertions(+) create mode 100644 sortix/fs/null.cpp create mode 100644 sortix/fs/null.h diff --git a/sortix/Makefile b/sortix/Makefile index cf313a79..fa94b66d 100644 --- a/sortix/Makefile +++ b/sortix/Makefile @@ -93,6 +93,7 @@ elf.o \ fcache.o \ fsfunc.o \ fs/kram.o \ +fs/null.o \ fs/user.o \ fs/util.o \ identity.o \ diff --git a/sortix/fs/null.cpp b/sortix/fs/null.cpp new file mode 100644 index 00000000..f3eb3037 --- /dev/null +++ b/sortix/fs/null.cpp @@ -0,0 +1,90 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License along with + Sortix. If not, see . + + fs/null.cpp + Bit bucket special device. + +*******************************************************************************/ + +#include + +#include + +#include + +#include + +#include "null.h" + +namespace Sortix { + +Null::Null(dev_t dev, ino_t ino, uid_t owner, gid_t group, mode_t mode) +{ + inode_type = INODE_TYPE_STREAM; + if ( !dev ) + dev = (dev_t) this; + if ( !ino ) + ino = (ino_t) this; + this->type = S_IFCHR; + this->stat_uid = owner; + this->stat_gid = group; + this->stat_mode = (mode & S_SETABLE) | this->type; + this->stat_size = 0; + this->stat_blksize = 1; + this->dev = dev; + this->ino = ino; +} + +Null::~Null() +{ +} + +int Null::truncate(ioctx_t* /*ctx*/, off_t /*length*/) +{ + return 0; +} + +off_t Null::lseek(ioctx_t* /*ctx*/, off_t offset, int /*whence*/) +{ + return offset; +} + +ssize_t Null::read(ioctx_t* /*ctx*/, uint8_t* /*buf*/, size_t /*count*/) +{ + return 0; +} + +ssize_t Null::pread(ioctx_t* /*ctx*/, uint8_t* /*buf*/, size_t /*count*/, + off_t /*off*/) +{ + return 0; +} + +ssize_t Null::write(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, size_t count) +{ + return count; +} + +ssize_t Null::pwrite(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, size_t count, + off_t /*off*/) +{ + return count; +} + +} // namespace Sortix diff --git a/sortix/fs/null.h b/sortix/fs/null.h new file mode 100644 index 00000000..767e3640 --- /dev/null +++ b/sortix/fs/null.h @@ -0,0 +1,48 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License along with + Sortix. If not, see . + + fs/null.h + Bit bucket special device. + +*******************************************************************************/ + +#ifndef SORTIX_FS_NULL_H +#define SORTIX_FS_NULL_H + +#include + +namespace Sortix { + +class Null : public AbstractInode +{ +public: + Null(dev_t dev, ino_t ino, uid_t owner, gid_t group, mode_t mode); + virtual ~Null(); + virtual int truncate(ioctx_t* ctx, off_t length); + virtual off_t lseek(ioctx_t* ctx, off_t offset, int whence); + virtual ssize_t read(ioctx_t* ctx, uint8_t* buf, size_t count); + virtual ssize_t pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t off); + virtual ssize_t write(ioctx_t* ctx, const uint8_t* buf, size_t count); + virtual ssize_t pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, + off_t off); +}; + +} // namespace Sortix + +#endif diff --git a/sortix/kernel.cpp b/sortix/kernel.cpp index 29f1edc7..16912075 100644 --- a/sortix/kernel.cpp +++ b/sortix/kernel.cpp @@ -73,6 +73,7 @@ #include "dispmsg.h" #include "elf.h" #include "fs/kram.h" +#include "fs/null.h" #include "fs/user.h" #include "identity.h" #include "initrd.h" @@ -529,6 +530,14 @@ static void BootThread(void* /*user*/) if ( LinkInodeInDir(&ctx, slashdev, "tty", tty) != 0 ) Panic("Unable to link /dev/tty to kernel terminal."); + // Register the null device as /dev/null. + Ref null_device(new Null(slashdev->dev, (ino_t) 0, (uid_t) 0, + (gid_t) 0, (mode_t) 0666)); + if ( !null_device ) + Panic("Could not allocate a null device"); + if ( LinkInodeInDir(&ctx, slashdev, "null", null_device) != 0 ) + Panic("Unable to link /dev/null to the null device."); + // Initialize the COM ports. COM::Init("/dev", slashdev);