From caa1b7455cbe00260cc2157c53cfaf09749d1566 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 2 Nov 2013 22:46:55 +0100 Subject: [PATCH] Add /dev/full. --- sortix/Makefile | 1 + sortix/fs/full.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++++ sortix/fs/full.h | 48 +++++++++++++++++++++ sortix/kernel.cpp | 9 ++++ 4 files changed, 161 insertions(+) create mode 100644 sortix/fs/full.cpp create mode 100644 sortix/fs/full.h diff --git a/sortix/Makefile b/sortix/Makefile index cadd2f8f..dec7d020 100644 --- a/sortix/Makefile +++ b/sortix/Makefile @@ -92,6 +92,7 @@ dtable.o \ elf.o \ fcache.o \ fsfunc.o \ +fs/full.o \ fs/kram.o \ fs/null.o \ fs/user.o \ diff --git a/sortix/fs/full.cpp b/sortix/fs/full.cpp new file mode 100644 index 00000000..15b6ec83 --- /dev/null +++ b/sortix/fs/full.cpp @@ -0,0 +1,103 @@ +/******************************************************************************* + + 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/full.cpp + Bit bucket special device. + +*******************************************************************************/ + +#include + +#include +#include +#include + +#include + +#include +#include + +#include "full.h" + +namespace Sortix { + +Full::Full(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; +} + +Full::~Full() +{ +} + +int Full::truncate(ioctx_t* /*ctx*/, off_t /*length*/) +{ + return 0; +} + +off_t Full::lseek(ioctx_t* /*ctx*/, off_t offset, int /*whence*/) +{ + return offset; +} + +ssize_t Full::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 Full::pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t /*off*/) +{ + return read(ctx, buf, count); +} + +ssize_t Full::write(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, size_t count) +{ + return count ? (errno = ENOSPC, -1) : 0; +} + +ssize_t Full::pwrite(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, size_t count, + off_t /*off*/) +{ + return count ? (errno = ENOSPC, -1) : 0; +} + +} // namespace Sortix diff --git a/sortix/fs/full.h b/sortix/fs/full.h new file mode 100644 index 00000000..8651dfba --- /dev/null +++ b/sortix/fs/full.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/full.h + Bit bucket special device. + +*******************************************************************************/ + +#ifndef SORTIX_FS_FULL_H +#define SORTIX_FS_FULL_H + +#include + +namespace Sortix { + +class Full : public AbstractInode +{ +public: + Full(dev_t dev, ino_t ino, uid_t owner, gid_t group, mode_t mode); + virtual ~Full(); + 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 bb6f1e0f..9d6467aa 100644 --- a/sortix/kernel.cpp +++ b/sortix/kernel.cpp @@ -72,6 +72,7 @@ #include "com.h" #include "dispmsg.h" #include "elf.h" +#include "fs/full.h" #include "fs/kram.h" #include "fs/null.h" #include "fs/user.h" @@ -547,6 +548,14 @@ static void BootThread(void* /*user*/) if ( LinkInodeInDir(&ctx, slashdev, "zero", zero_device) != 0 ) Panic("Unable to link /dev/zero to the zero device."); + // Register the full device as /dev/full. + Ref full_device(new Full(slashdev->dev, (ino_t) 0, (uid_t) 0, + (gid_t) 0, (mode_t) 0666)); + if ( !full_device ) + Panic("Could not allocate a full device"); + if ( LinkInodeInDir(&ctx, slashdev, "full", full_device) != 0 ) + Panic("Unable to link /dev/full to the full device."); + // Initialize the COM ports. COM::Init("/dev", slashdev);