mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Add factory inode support.
This commit is contained in:
parent
1240a44298
commit
d529a1e332
7 changed files with 42 additions and 4 deletions
|
@ -214,6 +214,8 @@ public:
|
||||||
size_t size, off_t start);
|
size_t size, off_t start);
|
||||||
virtual Ref<Inode> open(ioctx_t* ctx, const char* filename, int flags,
|
virtual Ref<Inode> open(ioctx_t* ctx, const char* filename, int flags,
|
||||||
mode_t mode);
|
mode_t mode);
|
||||||
|
virtual Ref<Inode> factory(ioctx_t* ctx, const char* filename, int flags,
|
||||||
|
mode_t mode);
|
||||||
virtual int mkdir(ioctx_t* ctx, const char* filename, mode_t mode);
|
virtual int mkdir(ioctx_t* ctx, const char* filename, mode_t mode);
|
||||||
virtual int link(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
virtual int link(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
||||||
virtual int link_raw(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
virtual int link_raw(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
||||||
|
@ -1065,6 +1067,12 @@ Ref<Inode> Unode::open(ioctx_t* ctx, const char* filename, int flags,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<Inode> Unode::factory(ioctx_t* /*ctx*/, const char* /*filename*/,
|
||||||
|
int /*flags*/, mode_t /*mode*/)
|
||||||
|
{
|
||||||
|
return errno = EBADF, Ref<Inode>(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int Unode::mkdir(ioctx_t* ctx, const char* filename, mode_t mode)
|
int Unode::mkdir(ioctx_t* ctx, const char* filename, mode_t mode)
|
||||||
{
|
{
|
||||||
Channel* channel = server->Connect(ctx);
|
Channel* channel = server->Connect(ctx);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, 2013, 2014 Jonas 'Sortie' Termansen.
|
* Copyright (c) 2012, 2013, 2014, 2016 Jonas 'Sortie' Termansen.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -44,6 +44,9 @@ extern "C" {
|
||||||
#define O_SYMLINK_NOFOLLOW (1<<13)
|
#define O_SYMLINK_NOFOLLOW (1<<13)
|
||||||
#define O_NOCTTY (1<<14)
|
#define O_NOCTTY (1<<14)
|
||||||
#define O_TTY_INIT (1<<15)
|
#define O_TTY_INIT (1<<15)
|
||||||
|
#ifdef __is_sortix_kernel
|
||||||
|
#define O_IS_STAT (1<<30)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define O_ACCMODE (O_READ | O_WRITE | O_EXEC | O_SEARCH)
|
#define O_ACCMODE (O_READ | O_WRITE | O_EXEC | O_SEARCH)
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,8 @@ public:
|
||||||
size_t size, off_t start) = 0;
|
size_t size, off_t start) = 0;
|
||||||
virtual Ref<Inode> open(ioctx_t* ctx, const char* filename, int flags,
|
virtual Ref<Inode> open(ioctx_t* ctx, const char* filename, int flags,
|
||||||
mode_t mode) = 0;
|
mode_t mode) = 0;
|
||||||
|
virtual Ref<Inode> factory(ioctx_t* ctx, const char* filename, int flags,
|
||||||
|
mode_t mode) = 0;
|
||||||
virtual int mkdir(ioctx_t* ctx, const char* filename, mode_t mode) = 0;
|
virtual int mkdir(ioctx_t* ctx, const char* filename, mode_t mode) = 0;
|
||||||
virtual int link(ioctx_t* ctx, const char* filename, Ref<Inode> node) = 0;
|
virtual int link(ioctx_t* ctx, const char* filename, Ref<Inode> node) = 0;
|
||||||
virtual int link_raw(ioctx_t* ctx, const char* filename, Ref<Inode> node) = 0;
|
virtual int link_raw(ioctx_t* ctx, const char* filename, Ref<Inode> node) = 0;
|
||||||
|
@ -166,6 +168,8 @@ public:
|
||||||
size_t size, off_t start);
|
size_t size, off_t start);
|
||||||
virtual Ref<Inode> open(ioctx_t* ctx, const char* filename, int flags,
|
virtual Ref<Inode> open(ioctx_t* ctx, const char* filename, int flags,
|
||||||
mode_t mode);
|
mode_t mode);
|
||||||
|
virtual Ref<Inode> factory(ioctx_t* ctx, const char* filename, int flags,
|
||||||
|
mode_t mode);
|
||||||
virtual int mkdir(ioctx_t* ctx, const char* filename, mode_t mode);
|
virtual int mkdir(ioctx_t* ctx, const char* filename, mode_t mode);
|
||||||
virtual int link(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
virtual int link(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
||||||
virtual int link_raw(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
virtual int link_raw(ioctx_t* ctx, const char* filename, Ref<Inode> node);
|
||||||
|
|
|
@ -84,6 +84,11 @@ struct stat
|
||||||
#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
|
#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
|
||||||
#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
|
#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
|
||||||
|
|
||||||
|
#ifdef __is_sortix_kernel
|
||||||
|
#define S_IFFACTORY 0x10000
|
||||||
|
#define S_IFFACTORY_NOSTAT 0x20000
|
||||||
|
#endif
|
||||||
|
|
||||||
#define UTIME_NOW 0x3FFFFFFF
|
#define UTIME_NOW 0x3FFFFFFF
|
||||||
#define UTIME_OMIT 0x3FFFFFFE
|
#define UTIME_OMIT 0x3FFFFFFE
|
||||||
|
|
||||||
|
|
|
@ -217,6 +217,14 @@ Ref<Inode> AbstractInode::open(ioctx_t* /*ctx*/, const char* /*filename*/,
|
||||||
return errno = ENOTDIR, Ref<Inode>(NULL);
|
return errno = ENOTDIR, Ref<Inode>(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<Inode> AbstractInode::factory(ioctx_t* /*ctx*/, const char* /*filename*/,
|
||||||
|
int /*flags*/, mode_t /*mode*/)
|
||||||
|
{
|
||||||
|
if ( inode_type == INODE_TYPE_DIR )
|
||||||
|
return errno = EBADF, Ref<Inode>(NULL);
|
||||||
|
return errno = ENOTDIR, Ref<Inode>(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int AbstractInode::mkdir(ioctx_t* /*ctx*/, const char* /*filename*/,
|
int AbstractInode::mkdir(ioctx_t* /*ctx*/, const char* /*filename*/,
|
||||||
mode_t /*mode*/)
|
mode_t /*mode*/)
|
||||||
{
|
{
|
||||||
|
|
|
@ -205,7 +205,8 @@ int sys_faccessat(int dirfd, const char* path, int mode, int flags)
|
||||||
ioctx_t ctx; SetupUserIOCtx(&ctx);
|
ioctx_t ctx; SetupUserIOCtx(&ctx);
|
||||||
Ref<Descriptor> from = PrepareLookup(pathcopy, dirfd);
|
Ref<Descriptor> from = PrepareLookup(pathcopy, dirfd);
|
||||||
if ( !from ) { delete[] pathcopy; return -1; }
|
if ( !from ) { delete[] pathcopy; return -1; }
|
||||||
int open_flags = O_READ | (flags & AT_SYMLINK_NOFOLLOW ? O_SYMLINK_NOFOLLOW : 0);
|
int open_flags = O_READ | O_IS_STAT |
|
||||||
|
(flags & AT_SYMLINK_NOFOLLOW ? O_SYMLINK_NOFOLLOW : 0);
|
||||||
Ref<Descriptor> desc = from->open(&ctx, pathcopy, open_flags);
|
Ref<Descriptor> desc = from->open(&ctx, pathcopy, open_flags);
|
||||||
delete[] pathcopy;
|
delete[] pathcopy;
|
||||||
if ( !desc )
|
if ( !desc )
|
||||||
|
@ -290,7 +291,8 @@ int sys_fstatat(int dirfd, const char* path, struct stat* st, int flags)
|
||||||
ioctx_t ctx; SetupUserIOCtx(&ctx);
|
ioctx_t ctx; SetupUserIOCtx(&ctx);
|
||||||
Ref<Descriptor> from = PrepareLookup(pathcopy, dirfd);
|
Ref<Descriptor> from = PrepareLookup(pathcopy, dirfd);
|
||||||
if ( !from ) { delete[] pathcopy; return -1; }
|
if ( !from ) { delete[] pathcopy; return -1; }
|
||||||
int open_flags = O_READ | (flags & AT_SYMLINK_NOFOLLOW ? O_SYMLINK_NOFOLLOW : 0);
|
int open_flags = O_READ | O_IS_STAT |
|
||||||
|
(flags & AT_SYMLINK_NOFOLLOW ? O_SYMLINK_NOFOLLOW : 0);
|
||||||
Ref<Descriptor> desc = from->open(&ctx, pathcopy, open_flags);
|
Ref<Descriptor> desc = from->open(&ctx, pathcopy, open_flags);
|
||||||
delete[] pathcopy;
|
delete[] pathcopy;
|
||||||
if ( !desc )
|
if ( !desc )
|
||||||
|
@ -326,7 +328,8 @@ int sys_fstatvfsat(int dirfd, const char* path, struct statvfs* stvfs, int flags
|
||||||
ioctx_t ctx; SetupUserIOCtx(&ctx);
|
ioctx_t ctx; SetupUserIOCtx(&ctx);
|
||||||
Ref<Descriptor> from = PrepareLookup(pathcopy, dirfd);
|
Ref<Descriptor> from = PrepareLookup(pathcopy, dirfd);
|
||||||
if ( !from ) { delete[] pathcopy; return -1; }
|
if ( !from ) { delete[] pathcopy; return -1; }
|
||||||
int open_flags = O_READ | (flags & AT_SYMLINK_NOFOLLOW ? O_SYMLINK_NOFOLLOW : 0);
|
int open_flags = O_READ | O_IS_STAT |
|
||||||
|
(flags & AT_SYMLINK_NOFOLLOW ? O_SYMLINK_NOFOLLOW : 0);
|
||||||
Ref<Descriptor> desc = from->open(&ctx, pathcopy, open_flags);
|
Ref<Descriptor> desc = from->open(&ctx, pathcopy, open_flags);
|
||||||
delete[] pathcopy;
|
delete[] pathcopy;
|
||||||
if ( !desc )
|
if ( !desc )
|
||||||
|
|
|
@ -98,6 +98,13 @@ Ref<Vnode> Vnode::open(ioctx_t* ctx, const char* filename, int flags, mode_t mod
|
||||||
Ref<Inode> retinode = inode->open(ctx, filename, flags, mode);
|
Ref<Inode> retinode = inode->open(ctx, filename, flags, mode);
|
||||||
if ( !retinode )
|
if ( !retinode )
|
||||||
return Ref<Vnode>(NULL);
|
return Ref<Vnode>(NULL);
|
||||||
|
if ( retinode->type & S_IFFACTORY &&
|
||||||
|
!(retinode->type & S_IFFACTORY_NOSTAT && flags & O_IS_STAT) )
|
||||||
|
{
|
||||||
|
retinode = retinode->factory(ctx, filename, flags, mode);
|
||||||
|
if ( !retinode )
|
||||||
|
return Ref<Vnode>(NULL);
|
||||||
|
}
|
||||||
Ref<Vnode> retmountedat = mountedat;
|
Ref<Vnode> retmountedat = mountedat;
|
||||||
ino_t retrootino = rootino;
|
ino_t retrootino = rootino;
|
||||||
dev_t retrootdev = rootdev;
|
dev_t retrootdev = rootdev;
|
||||||
|
|
Loading…
Add table
Reference in a new issue