diff --git a/sortix/Makefile b/sortix/Makefile index fa94b66d..cadd2f8f 100644 --- a/sortix/Makefile +++ b/sortix/Makefile @@ -96,6 +96,7 @@ fs/kram.o \ fs/null.o \ fs/user.o \ fs/util.o \ +fs/zero.o \ identity.o \ initrd.o \ inode.o \ diff --git a/sortix/fs/zero.cpp b/sortix/fs/zero.cpp new file mode 100644 index 00000000..a50435cf --- /dev/null +++ b/sortix/fs/zero.cpp @@ -0,0 +1,102 @@ +/******************************************************************************* + + 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/zero.cpp + Bit bucket special device. + +*******************************************************************************/ + +#include + +#include +#include + +#include + +#include +#include + +#include "zero.h" + +namespace Sortix { + +Zero::Zero(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; +} + +Zero::~Zero() +{ +} + +int Zero::truncate(ioctx_t* /*ctx*/, off_t /*length*/) +{ + return 0; +} + +off_t Zero::lseek(ioctx_t* /*ctx*/, off_t offset, int /*whence*/) +{ + return offset; +} + +ssize_t Zero::read(ioctx_t* ctx, uint8_t* buf, size_t count) +{ + const size_t ZERO_MEM_SIZE = 128; + uint8_t zero_mem[ZERO_MEM_SIZE]; + memset(zero_mem, 0, ZERO_MEM_SIZE); + size_t sofar = 0; + while ( sofar < count ) + { + size_t left = count - sofar; + size_t amount = left < ZERO_MEM_SIZE ? left : ZERO_MEM_SIZE; + ctx->copy_to_dest(buf + sofar, zero_mem, amount); + sofar += amount; + } + return (ssize_t) sofar; +} + +ssize_t Zero::pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t /*off*/) +{ + return read(ctx, buf, count); +} + +ssize_t Zero::write(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, size_t count) +{ + return count; +} + +ssize_t Zero::pwrite(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, size_t count, + off_t /*off*/) +{ + return count; +} + +} // namespace Sortix diff --git a/sortix/fs/zero.h b/sortix/fs/zero.h new file mode 100644 index 00000000..400b413e --- /dev/null +++ b/sortix/fs/zero.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/zero.h + Bit bucket special device. + +*******************************************************************************/ + +#ifndef SORTIX_FS_ZERO_H +#define SORTIX_FS_ZERO_H + +#include + +namespace Sortix { + +class Zero : public AbstractInode +{ +public: + Zero(dev_t dev, ino_t ino, uid_t owner, gid_t group, mode_t mode); + virtual ~Zero(); + 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 16912075..bb6f1e0f 100644 --- a/sortix/kernel.cpp +++ b/sortix/kernel.cpp @@ -75,6 +75,7 @@ #include "fs/kram.h" #include "fs/null.h" #include "fs/user.h" +#include "fs/zero.h" #include "identity.h" #include "initrd.h" #include "io.h" @@ -538,6 +539,14 @@ static void BootThread(void* /*user*/) if ( LinkInodeInDir(&ctx, slashdev, "null", null_device) != 0 ) Panic("Unable to link /dev/null to the null device."); + // Register the zero device as /dev/zero. + Ref zero_device(new Zero(slashdev->dev, (ino_t) 0, (uid_t) 0, + (gid_t) 0, (mode_t) 0666)); + if ( !zero_device ) + Panic("Could not allocate a zero device"); + if ( LinkInodeInDir(&ctx, slashdev, "zero", zero_device) != 0 ) + Panic("Unable to link /dev/zero to the zero device."); + // Initialize the COM ports. COM::Init("/dev", slashdev);