Kernel, libc: Add F_GETFD, F_SETFD and FD_CLOEXEC
This commit is contained in:
parent
fcf53ef6a5
commit
50cda50f01
@ -55,6 +55,11 @@ struct Descriptor
|
|||||||
return m_close_on_exec;
|
return m_close_on_exec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_close_on_exec(bool value)
|
||||||
|
{
|
||||||
|
m_close_on_exec = value;
|
||||||
|
}
|
||||||
|
|
||||||
Descriptor(const Descriptor& other);
|
Descriptor(const Descriptor& other);
|
||||||
Descriptor();
|
Descriptor();
|
||||||
|
|
||||||
|
@ -29,6 +29,10 @@
|
|||||||
|
|
||||||
#define FCNTL_DUPFD 0
|
#define FCNTL_DUPFD 0
|
||||||
#define FCNTL_ISTTY 1
|
#define FCNTL_ISTTY 1
|
||||||
|
#define FCNTL_GETFD 2
|
||||||
|
#define FCNTL_SETFD 3
|
||||||
|
|
||||||
|
#define FD_CLOEXEC 1
|
||||||
|
|
||||||
void sys_fcntl(Context* context, int fd, int command, uintptr_t arg)
|
void sys_fcntl(Context* context, int fd, int command, uintptr_t arg)
|
||||||
{
|
{
|
||||||
@ -42,12 +46,13 @@ void sys_fcntl(Context* context, int fd, int command, uintptr_t arg)
|
|||||||
}
|
}
|
||||||
if (command == FCNTL_DUPFD)
|
if (command == FCNTL_DUPFD)
|
||||||
{
|
{
|
||||||
if ((int)arg < 0 || (int)arg >= TASK_MAX_FDS)
|
int minfd = (int)arg;
|
||||||
|
if (minfd < 0 || minfd >= TASK_MAX_FDS)
|
||||||
{
|
{
|
||||||
context->rax = -EINVAL;
|
context->rax = -EINVAL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int dupfd = current_task->alloc_fd_greater_than_or_equal((int)arg);
|
int dupfd = current_task->alloc_fd_greater_than_or_equal(minfd);
|
||||||
if (dupfd < 0)
|
if (dupfd < 0)
|
||||||
{
|
{
|
||||||
context->rax = -EMFILE;
|
context->rax = -EMFILE;
|
||||||
@ -66,6 +71,22 @@ void sys_fcntl(Context* context, int fd, int command, uintptr_t arg)
|
|||||||
context->rax = -ENOTTY;
|
context->rax = -ENOTTY;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (command == FCNTL_GETFD)
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
if (file->close_on_exec()) context->rax |= FD_CLOEXEC;
|
||||||
|
context->rax = flags;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (command == FCNTL_SETFD)
|
||||||
|
{
|
||||||
|
int flags = (int)arg;
|
||||||
|
if (flags & FD_CLOEXEC) file->set_close_on_exec(true);
|
||||||
|
else
|
||||||
|
file->set_close_on_exec(false);
|
||||||
|
context->rax = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
context->rax = -EINVAL;
|
context->rax = -EINVAL;
|
||||||
|
@ -26,6 +26,13 @@
|
|||||||
#define F_DUPFD 0
|
#define F_DUPFD 0
|
||||||
/* Is a file descriptor a TTY? */
|
/* Is a file descriptor a TTY? */
|
||||||
#define F_ISTTY 1
|
#define F_ISTTY 1
|
||||||
|
/* Get the file descriptor flags. */
|
||||||
|
#define F_GETFD 2
|
||||||
|
/* Set the file descriptor flags. */
|
||||||
|
#define F_SETFD 3
|
||||||
|
|
||||||
|
/* Close the file descriptor on a call to execve(). */
|
||||||
|
#define FD_CLOEXEC 1
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
|
Loading…
Reference in New Issue
Block a user