mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Added fcntl(3) with FD_GET and FD_SET.
This commit is contained in:
parent
75b14aa821
commit
5e75f5c428
5 changed files with 28 additions and 5 deletions
|
@ -36,8 +36,6 @@ __BEGIN_DECLS
|
||||||
|
|
||||||
/* TODO: F_* missing here */
|
/* TODO: F_* missing here */
|
||||||
|
|
||||||
/* TODO: FD_CLOEXEC missing here */
|
|
||||||
|
|
||||||
/* TODO: F_RDLCK, F_UNLCK, F_WRLCK missing here */
|
/* TODO: F_RDLCK, F_UNLCK, F_WRLCK missing here */
|
||||||
|
|
||||||
/* TODO: AT_FDCWD missing here */
|
/* TODO: AT_FDCWD missing here */
|
||||||
|
@ -61,11 +59,10 @@ struct _flock
|
||||||
|
|
||||||
typedef struct _flock flock;
|
typedef struct _flock flock;
|
||||||
|
|
||||||
/* TODO: These are not implemented in libmaxsi/sortix yet. */
|
int fcntl(int fd, int cmd, ...);
|
||||||
int open(const char* path, int oflag, ...);
|
int open(const char* path, int oflag, ...);
|
||||||
#if defined(__SORTIX_SHOW_UNIMPLEMENTED)
|
#if defined(__SORTIX_SHOW_UNIMPLEMENTED)
|
||||||
int creat(const char* path, mode_t mode);
|
int creat(const char* path, mode_t mode);
|
||||||
int fcntl(int fd, int cmd, ...);
|
|
||||||
int openat(int fd, const char* path, int oflag, ...);
|
int openat(int fd, const char* path, int oflag, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ namespace Maxsi
|
||||||
DEFN_SYSCALL2(int, SysFTruncate, SYSCALL_FTRUNCATE, int, off_t);
|
DEFN_SYSCALL2(int, SysFTruncate, SYSCALL_FTRUNCATE, int, off_t);
|
||||||
DEFN_SYSCALL2(int, SysStat, SYSCALL_STAT, const char*, struct stat*);
|
DEFN_SYSCALL2(int, SysStat, SYSCALL_STAT, const char*, struct stat*);
|
||||||
DEFN_SYSCALL2(int, SysFStat, SYSCALL_FSTAT, int, struct stat*);
|
DEFN_SYSCALL2(int, SysFStat, SYSCALL_FSTAT, int, struct stat*);
|
||||||
|
DEFN_SYSCALL3(int, SysFCntl, SYSCALL_FCNTL, int, int, unsigned long);
|
||||||
|
|
||||||
size_t Print(const char* string)
|
size_t Print(const char* string)
|
||||||
{
|
{
|
||||||
|
@ -293,6 +294,11 @@ namespace Maxsi
|
||||||
return SysFStat(fd, st);
|
return SysFStat(fd, st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" int fcntl(int fd, int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
return SysFCntl(fd, cmd, arg);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: This is a hacky implementation of a stupid function.
|
// TODO: This is a hacky implementation of a stupid function.
|
||||||
char* mktemp(char* templ)
|
char* mktemp(char* templ)
|
||||||
{
|
{
|
||||||
|
|
|
@ -46,6 +46,9 @@ __BEGIN_DECLS
|
||||||
#define FD_CLOEXEC (1<<0)
|
#define FD_CLOEXEC (1<<0)
|
||||||
#define FD_CLOFORK (1<<1)
|
#define FD_CLOFORK (1<<1)
|
||||||
|
|
||||||
|
#define F_SETFD 0
|
||||||
|
#define F_GETFD 1
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -130,6 +130,21 @@ namespace Sortix
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SysFCntl(int fd, int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
Process* process = CurrentProcess();
|
||||||
|
DescriptorTable* descs = &(process->descriptors);
|
||||||
|
Device* dev = descs->Get(fd);
|
||||||
|
if ( !dev ) { Error::Set(EBADF); return -1; }
|
||||||
|
switch ( cmd )
|
||||||
|
{
|
||||||
|
case F_GETFD: return descs->GetFlags(fd);
|
||||||
|
case F_SETFD: descs->SetFlags(fd, (int) arg); return 0;
|
||||||
|
}
|
||||||
|
Error::Set(EINVAL);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
Syscall::Register(SYSCALL_OPEN, (void*) SysOpen);
|
Syscall::Register(SYSCALL_OPEN, (void*) SysOpen);
|
||||||
|
@ -140,6 +155,7 @@ namespace Sortix
|
||||||
Syscall::Register(SYSCALL_FTRUNCATE, (void*) SysFTruncate);
|
Syscall::Register(SYSCALL_FTRUNCATE, (void*) SysFTruncate);
|
||||||
Syscall::Register(SYSCALL_STAT, (void*) SysStat);
|
Syscall::Register(SYSCALL_STAT, (void*) SysStat);
|
||||||
Syscall::Register(SYSCALL_FSTAT, (void*) SysFStat);
|
Syscall::Register(SYSCALL_FSTAT, (void*) SysFStat);
|
||||||
|
Syscall::Register(SYSCALL_FCNTL, (void*) SysFCntl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,8 @@
|
||||||
#define SYSCALL_GETTERMMODE 43
|
#define SYSCALL_GETTERMMODE 43
|
||||||
#define SYSCALL_STAT 44
|
#define SYSCALL_STAT 44
|
||||||
#define SYSCALL_FSTAT 45
|
#define SYSCALL_FSTAT 45
|
||||||
#define SYSCALL_MAX_NUM 46 /* index of highest constant + 1 */
|
#define SYSCALL_FCNTL 46
|
||||||
|
#define SYSCALL_MAX_NUM 47 /* index of highest constant + 1 */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue