mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 20:15:17 +00:00
Add tcsetpgrp()+tcgetpgrp().
One more step on the path to being able to ^C a runaway process. :^)
This commit is contained in:
parent
d8f0dd6f3b
commit
621217ffeb
Notes:
sideshowbarker
2024-07-19 18:34:27 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/621217ffeb9
11 changed files with 72 additions and 4 deletions
|
@ -277,10 +277,11 @@ ByteBuffer procfs$summary()
|
|||
auto processes = Process::allProcesses();
|
||||
auto buffer = ByteBuffer::createUninitialized(processes.size() * 256);
|
||||
char* ptr = (char*)buffer.pointer();
|
||||
ptr += ksprintf(ptr, "PID PGP SID OWNER STATE PPID NSCHED FDS TTY NAME\n");
|
||||
ptr += ksprintf(ptr, "PID TPG PGP SID OWNER STATE PPID NSCHED FDS TTY NAME\n");
|
||||
for (auto* process : processes) {
|
||||
ptr += ksprintf(ptr, "% 3u % 3u % 3u % 4u % 8s % 3u % 9u % 3u % 4s %s\n",
|
||||
ptr += ksprintf(ptr, "% 3u % 3u % 3u % 3u % 4u % 8s % 3u % 9u % 3u % 4s %s\n",
|
||||
process->pid(),
|
||||
process->tty() ? process->tty()->pgid() : 0,
|
||||
process->pgid(),
|
||||
process->sid(),
|
||||
process->uid(),
|
||||
|
|
|
@ -1249,3 +1249,34 @@ int Process::sys$setpgid(pid_t specified_pid, pid_t specified_pgid)
|
|||
process->m_pgid = new_pgid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pid_t Process::sys$tcgetpgrp(int fd)
|
||||
{
|
||||
auto* handle = fileHandleIfExists(fd);
|
||||
if (!handle)
|
||||
return -EBADF;
|
||||
if (!handle->isTTY())
|
||||
return -ENOTTY;
|
||||
auto& tty = *handle->tty();
|
||||
if (&tty != m_tty)
|
||||
return -ENOTTY;
|
||||
return tty.pgid();
|
||||
}
|
||||
|
||||
int Process::sys$tcsetpgrp(int fd, pid_t pgid)
|
||||
{
|
||||
if (pgid < 0)
|
||||
return -EINVAL;
|
||||
if (get_sid_from_pgid(pgid) != m_sid)
|
||||
return -EINVAL;
|
||||
auto* handle = fileHandleIfExists(fd);
|
||||
if (!handle)
|
||||
return -EBADF;
|
||||
if (!handle->isTTY())
|
||||
return -ENOTTY;
|
||||
auto& tty = *handle->tty();
|
||||
if (&tty != m_tty)
|
||||
return -ENOTTY;
|
||||
tty.set_pgid(pgid);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -86,6 +86,8 @@ public:
|
|||
int sys$setpgid(pid_t pid, pid_t pgid);
|
||||
pid_t sys$getpgrp();
|
||||
pid_t sys$getpgid(pid_t);
|
||||
pid_t sys$tcgetpgrp(int fd);
|
||||
int sys$tcsetpgrp(int fd, pid_t pgid);
|
||||
uid_t sys$getuid();
|
||||
gid_t sys$getgid();
|
||||
pid_t sys$getpid();
|
||||
|
|
|
@ -124,6 +124,10 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3)
|
|||
return current->sys$getpgid((pid_t)arg1);
|
||||
case Syscall::PosixGetpgrp:
|
||||
return current->sys$getpgrp();
|
||||
case Syscall::PosixTcgetpgrp:
|
||||
return current->sys$tcgetpgrp((int)arg1);
|
||||
case Syscall::PosixTcsetpgrp:
|
||||
return current->sys$tcsetpgrp((int)arg1, (pid_t)arg2);
|
||||
default:
|
||||
kprintf("<%u> int0x80: Unknown function %x requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3);
|
||||
break;
|
||||
|
|
|
@ -45,6 +45,8 @@ enum Function {
|
|||
PosixGetpgid = 0x2013,
|
||||
PosixSetpgid = 0x2014,
|
||||
PosixGetpgrp = 0x2015,
|
||||
PosixTcsetpgrp = 0x2016,
|
||||
PosixTcgetpgrp = 0x2017,
|
||||
};
|
||||
|
||||
void initialize();
|
||||
|
|
|
@ -12,6 +12,9 @@ public:
|
|||
|
||||
virtual String ttyName() const = 0;
|
||||
|
||||
void set_pgid(pid_t pgid) { m_pgid = pgid; }
|
||||
pid_t pgid() const { return m_pgid; }
|
||||
|
||||
protected:
|
||||
virtual bool isTTY() const final { return true; }
|
||||
|
||||
|
@ -22,5 +25,6 @@ protected:
|
|||
|
||||
private:
|
||||
Vector<byte> m_buffer;
|
||||
pid_t m_pgid { 0 };
|
||||
};
|
||||
|
||||
|
|
|
@ -25,9 +25,14 @@ pid_t setsid()
|
|||
return Syscall::invoke(Syscall::PosixSetsid);
|
||||
}
|
||||
|
||||
pid_t sys$getsid(pid_t pid)
|
||||
pid_t tcgetpgrp(int fd)
|
||||
{
|
||||
return Syscall::invoke(Syscall::PosixSetsid, (dword)pid);
|
||||
return Syscall::invoke(Syscall::PosixTcgetpgrp, (dword)fd);
|
||||
}
|
||||
|
||||
int tcsetpgrp(int fd, pid_t pgid)
|
||||
{
|
||||
return Syscall::invoke(Syscall::PosixTcsetpgrp, (dword)fd, (dword)pgid);
|
||||
}
|
||||
|
||||
int setpgid(pid_t pid, pid_t pgid)
|
||||
|
|
|
@ -16,6 +16,8 @@ pid_t getpgrp();
|
|||
uid_t getuid();
|
||||
gid_t getgid();
|
||||
pid_t getpid();
|
||||
pid_t tcgetpgrp(int fd);
|
||||
int tcsetpgrp(int fd, pid_t pgid);
|
||||
int open(const char* path, int options);
|
||||
ssize_t read(int fd, void* buf, size_t count);
|
||||
ssize_t write(int fd, const void* buf, size_t count);
|
||||
|
|
|
@ -142,10 +142,17 @@ static int runcmd(char* cmd)
|
|||
return 1;
|
||||
}
|
||||
|
||||
// FIXME: This is racy, since spawn has already started the new process.
|
||||
// Once I have fork()+exec(), pgrp setup can be done in the child before exec()ing.
|
||||
tcsetpgrp(0, ret);
|
||||
|
||||
// FIXME: waitpid should give us the spawned process's exit status
|
||||
int wstatus = 0;
|
||||
waitpid(ret, &wstatus, 0);
|
||||
|
||||
// FIXME: Racy as mentioned above. Rework once we have fork()+exec().
|
||||
tcsetpgrp(0, getpid());
|
||||
|
||||
if (WIFEXITED(wstatus)) {
|
||||
//printf("Exited normally with status %d\n", WEXITSTATUS(wstatus));
|
||||
} else {
|
||||
|
@ -173,6 +180,8 @@ int main(int, char**)
|
|||
{
|
||||
g = new GlobalState;
|
||||
g->sid = setsid();
|
||||
tcsetpgrp(0, getpgrp());
|
||||
|
||||
int rc = gethostname(g->hostname, sizeof(g->hostname));
|
||||
if (rc < 0)
|
||||
perror("gethostname");
|
||||
|
|
|
@ -176,6 +176,13 @@ const TTY* FileHandle::tty() const
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
TTY* FileHandle::tty()
|
||||
{
|
||||
if (auto* device = m_vnode->characterDevice())
|
||||
return static_cast<TTY*>(device);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int FileHandle::close()
|
||||
{
|
||||
return 0;
|
||||
|
|
|
@ -30,6 +30,7 @@ public:
|
|||
|
||||
bool isTTY() const;
|
||||
const TTY* tty() const;
|
||||
TTY* tty();
|
||||
|
||||
InodeMetadata metadata() const { return m_vnode->metadata(); }
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue