Add user-space filesystem API.

This commit is contained in:
Jonas 'Sortie' Termansen 2013-01-30 20:33:13 +01:00
parent 500d853f77
commit e76073cc4f
17 changed files with 1875 additions and 2 deletions

View File

@ -151,6 +151,14 @@ fdio.o \
fileno.o \
fork.o \
fpipe.o \
fsm_bootstraprootfd.o \
fsm_closechannel.o \
fsm_closeserver.o \
fsm_fsbind.o \
fsm_listen.o \
fsm_mkserver.o \
fsm_recv.o \
fsm_send.o \
fstatat.o \
fstat.o \
ftruncate.o \

View File

@ -0,0 +1,38 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_bootstraprootfd.cpp
Creates a root file descriptor associated with a user-space filesystem.
*******************************************************************************/
#include <fcntl.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <fsmarshall.h>
extern "C" int fsm_bootstraprootfd(int server, ino_t ino, int open_flags,
mode_t mode)
{
char name[sizeof(uintmax_t)*3];
snprintf(name, sizeof(name), "%ju", (uintmax_t) ino);
return openat(server, name, open_flags, mode);
}

32
libc/fsm_closechannel.cpp Normal file
View File

@ -0,0 +1,32 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_closechannel.cpp
Closes a user-space filesystem communication channel.
*******************************************************************************/
#include <unistd.h>
#include <fsmarshall.h>
extern "C" int fsm_closechannel(int /*server*/, int channel)
{
return close(channel);
}

32
libc/fsm_closeserver.cpp Normal file
View File

@ -0,0 +1,32 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_closeserver.cpp
Destroys a user-space filesystem server.
*******************************************************************************/
#include <unistd.h>
#include <fsmarshall.h>
extern "C" int fsm_closeserver(int server)
{
return close(server);
}

36
libc/fsm_fsbind.cpp Normal file
View File

@ -0,0 +1,36 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_fsbind.cpp
Binds a user-space filesystem inode at a mount point.
*******************************************************************************/
#include <sys/syscall.h>
#include <errno.h>
#include <fsmarshall.h>
DEFN_SYSCALL3(int, sys_fsm_fsbind, SYSCALL_FSM_FSBIND, int, int, int);
extern "C" int fsm_fsbind(int rootfd, int mountpoint, int flags)
{
return sys_fsm_fsbind(rootfd, mountpoint, flags);
}

32
libc/fsm_listen.cpp Normal file
View File

@ -0,0 +1,32 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_listen.cpp
Listens for a new channel on a given filesystem server.
*******************************************************************************/
#include <fcntl.h>
#include <fsmarshall.h>
extern "C" int fsm_listen(int server)
{
return openat(server, "listen", O_RDWR);
}

32
libc/fsm_mkserver.cpp Normal file
View File

@ -0,0 +1,32 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_mkserver.cpp
Creates a user-space filesystem server.
*******************************************************************************/
#include <fcntl.h>
#include <fsmarshall.h>
extern "C" int fsm_mkserver()
{
return open("/dev/fs/new", O_RDWR | O_CREAT, 0666);
}

32
libc/fsm_recv.cpp Normal file
View File

@ -0,0 +1,32 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_recv.cpp
Reads a message from a filesystem communication channel.
*******************************************************************************/
#include <unistd.h>
#include <fsmarshall.h>
extern "C" ssize_t fsm_recv(int /*server*/, int channel, void* ptr, size_t count)
{
return read(channel, ptr, count);
}

33
libc/fsm_send.cpp Normal file
View File

@ -0,0 +1,33 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsm_send.cpp
Send a message to a filesystem communication channel.
*******************************************************************************/
#include <unistd.h>
#include <fsmarshall.h>
extern "C" ssize_t fsm_send(int /*server*/, int channel, const void* ptr,
size_t count)
{
return write(channel, ptr, count);
}

View File

@ -0,0 +1,310 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2013.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsmarshall-msg.h
User-space filesystem API.
*******************************************************************************/
#ifndef INCLUDE_FSMARSHALL_MSG_H
#define INCLUDE_FSMARSHALL_MSG_H
#include <stddef.h>
#include <sortix/stat.h>
#include <sortix/termios.h>
#include <sortix/timespec.h>
#if defined(__cplusplus)
extern "C" {
#endif
struct fsm_msg_header
{
size_t msgtype;
size_t msgsize;
};
#define FSM_RESP_ERROR 0
struct fsm_resp_error
{
int errnum;
};
#define FSM_RESP_SUCCESS 1
struct fsm_resp_success
{
};
#define FSM_REQ_ABORT 2
struct fsm_req_abort
{
};
#define FSM_RESP_ABORT 3
struct fsm_resp_abort
{
};
#define FSM_REQ_SYNC 4
struct fsm_req_sync
{
ino_t ino;
};
#define FSM_REQ_STAT 5
struct fsm_req_stat
{
ino_t ino;
};
#define FSM_RESP_STAT 6
struct fsm_resp_stat
{
struct stat st;
};
#define FSM_REQ_CHMOD 7
struct fsm_req_chmod
{
ino_t ino;
mode_t mode;
};
#define FSM_REQ_CHOWN 8
struct fsm_req_chown
{
ino_t ino;
uid_t uid;
gid_t gid;
};
#define FSM_REQ_TRUNCATE 9
struct fsm_req_truncate
{
ino_t ino;
off_t size;
};
#define FSM_REQ_LSEEK 10
struct fsm_req_lseek
{
ino_t ino;
off_t offset;
int whence;
};
#define FSM_RESP_LSEEK 11
struct fsm_resp_lseek
{
off_t offset;
};
#define FSM_REQ_READ 12
struct fsm_req_read
{
ino_t ino;
size_t count;
};
#define FSM_REQ_PREAD 13
struct fsm_req_pread
{
ino_t ino;
off_t offset;
size_t count;
};
#define FSM_RESP_READ 14
struct fsm_resp_read
{
size_t count;
//uint8_t data[count];
};
#define FSM_REQ_WRITE 15
struct fsm_req_write
{
ino_t ino;
size_t count;
//uint8_t data[count];
};
#define FSM_REQ_PWRITE 16
struct fsm_req_pwrite
{
ino_t ino;
off_t offset;
size_t count;
//uint8_t data[count];
};
#define FSM_RESP_WRITE 17
struct fsm_resp_write
{
size_t count;
};
#define FSM_REQ_UTIMES 18
struct fsm_req_utimes
{
ino_t ino;
struct timeval times[2];
};
#define FSM_REQ_ISATTY 19
struct fsm_req_isatty
{
ino_t ino;
};
#define FSM_REQ_READDIRENTS 20
struct fsm_req_readdirents
{
ino_t ino;
off_t rec_num;
};
#define FSM_RESP_READDIRENTS 21
struct fsm_resp_readdirents
{
ino_t ino;
unsigned char type;
size_t namelen;
//char name[namelen];
};
#define FSM_REQ_OPEN 22
struct fsm_req_open
{
ino_t dirino;
int flags;
mode_t mode;
size_t namelen;
//char name[namelen];
};
#define FSM_RESP_OPEN 23
struct fsm_resp_open
{
ino_t ino;
mode_t type;
};
#define FSM_REQ_MKDIR 24
struct fsm_req_mkdir
{
ino_t dirino;
mode_t mode;
size_t namelen;
//char name[namelen];
};
#define FSM_RESP_MKDIR 25
struct fsm_resp_mkdir
{
ino_t ino;
};
#define FSM_REQ_LINK 26
struct fsm_req_link
{
ino_t dirino;
ino_t linkino;
size_t namelen;
//char name[namelen];
};
#define FSM_REQ_SYMLINK 27
struct fsm_req_symlink
{
ino_t dirino;
size_t targetlen;
size_t namelen;
//char target[targetlen];
//char name[namelen];
};
#define FSM_REQ_READLINK 28
struct fsm_req_readlink
{
ino_t ino;
};
#define FSM_RESP_READLINK 29
struct fsm_resp_readlink
{
size_t targetlen;
//char target[targetlen];
};
#define FSM_REQ_TCGETWINSIZE 30
struct fsm_req_tcgetwinsize
{
ino_t ino;
};
#define FSM_RESP_TCGETWINSIZE 31
struct fsm_resp_tcgetwinsize
{
struct winsize size;
};
#define FSM_REQ_SETTERMMODE 32
struct fsm_req_settermmode
{
ino_t ino;
unsigned int termmode;
};
#define FSM_REQ_GETTERMMODE 33
struct fsm_req_gettermmode
{
ino_t ino;
};
#define FSM_RESP_GETTERMMODE 34
struct fsm_resp_gettermmode
{
unsigned int termmode;
};
#define FSM_REQ_UNLINK 35
struct fsm_req_unlink
{
ino_t dirino;
size_t namelen;
//char name[namelen];
};
#define FSM_REQ_RMDIR 36
struct fsm_req_rmdir
{
ino_t dirino;
size_t namelen;
//char name[namelen];
};
#define FSM_MSG_NUM 37
#if defined(__cplusplus)
} /* extern "C" */
#endif
#endif

53
libc/include/fsmarshall.h Normal file
View File

@ -0,0 +1,53 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2013.
This file is part of the Sortix C Library.
The Sortix C Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
The Sortix C Library 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the Sortix C Library. If not, see <http://www.gnu.org/licenses/>.
fsmarshall.h
User-space filesystem API.
*******************************************************************************/
#ifndef INCLUDE_FSMARSHALL_H
#define INCLUDE_FSMARSHALL_H
#include <stddef.h>
#include <sortix/stat.h>
#include <sortix/termios.h>
#include <sortix/timeval.h>
#include <fsmarshall-msg.h>
#if defined(__cplusplus)
extern "C" {
#endif
int fsm_mkserver();
int fsm_closeserver(int server);
int fsm_bootstraprootfd(int server, ino_t ino, int open_flags, mode_t mode);
int fsm_fsbind(int rootfd, int mountpoint, int flags);
int fsm_listen(int server);
int fsm_closechannel(int server, int channel);
ssize_t fsm_recv(int server, int channel, void* ptr, size_t count);
ssize_t fsm_send(int server, int channel, const void* ptr, size_t count);
#if defined(__cplusplus)
} /* extern "C" */
#endif
#endif

View File

@ -84,6 +84,7 @@ dtable.o \
elf.o \
fsfunc.o \
fs/kram.o \
fs/user.o \
fs/util.o \
initrd.o \
inode.o \

1193
sortix/fs/user.cpp Normal file

File diff suppressed because it is too large Load Diff

36
sortix/fs/user.h Normal file
View File

@ -0,0 +1,36 @@
/*******************************************************************************
Copyright(C) Jonas 'Sortie' Termansen 2012, 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 <http://www.gnu.org/licenses/>.
fs/user.h
User-space filesystem.
*******************************************************************************/
#ifndef SORTIX_FS_USER_H
#define SORTIX_FS_USER_H
namespace Sortix {
namespace UserFS {
void Init(const char* devpath, Ref<Descriptor> slashdev);
} // namespace UserFS
} // namespace Sortix
#endif

View File

@ -75,7 +75,7 @@ public:
int settermmode(ioctx_t* ctx, unsigned mode);
int gettermmode(ioctx_t* ctx, unsigned* mode);
private:
public /*TODO: private*/:
Ref<Inode> inode;
Ref<Vnode> mountedat;
ino_t rootino;

View File

@ -92,6 +92,7 @@
#define SYSCALL_FCHMOD 68
#define SYSCALL_FCHMODAT 69
#define SYSCALL_LINKAT 70
#define SYSCALL_MAX_NUM 71 /* index of highest constant + 1 */
#define SYSCALL_FSM_FSBIND 71
#define SYSCALL_MAX_NUM 72 /* index of highest constant + 1 */
#endif

View File

@ -75,6 +75,7 @@
#include "interrupt.h"
#include "dispmsg.h"
#include "fs/kram.h"
#include "fs/user.h"
#include "kb/ps2.h"
#include "kb/layout/us.h"
@ -410,6 +411,9 @@ static void BootThread(void* /*user*/)
// Initialize the BGA driver.
BGA::Init();
// Initialize the user-space filesystem framework.
UserFS::Init("/dev", slashdev);
//
// Stage 6. Executing Hosted Environment ("User-Space")
//