diff --git a/kernel-src/include/kernel/jobctl.h b/kernel-src/include/kernel/jobctl.h index 19079779..d55821df 100644 --- a/kernel-src/include/kernel/jobctl.h +++ b/kernel-src/include/kernel/jobctl.h @@ -13,6 +13,7 @@ pid_t jobctl_getpgid(proc_t *proc); pid_t jobctl_getsid(proc_t *proc); int jobctl_setctty(proc_t *proc, void *ctty, bool steal); void *jobctl_getctty(proc_t *proc); +proc_t *jobctl_getsession(proc_t *proc); int jobctl_signal(proc_t *proc, int signal, proc_t *sender); proc_t *jobctl_getforeground(proc_t *proc); int jobctl_setforeground(proc_t *session, proc_t *pgrp); diff --git a/kernel-src/sys/jobctl.c b/kernel-src/sys/jobctl.c index 89bd17b6..3f4dcd17 100644 --- a/kernel-src/sys/jobctl.c +++ b/kernel-src/sys/jobctl.c @@ -115,6 +115,19 @@ void *jobctl_getctty(proc_t *proc) { return tty; } +proc_t *jobctl_getsession(proc_t *proc) { + bool intstatus = interrupt_set(false); + spinlock_acquire(&proc->jobctllock); + + proc_t *session = proc->session.leader ? proc->session.leader : proc; + PROC_HOLD(session); + + spinlock_release(&proc->jobctllock); + interrupt_set(intstatus); + + return session; +} + pid_t jobctl_getpgid(proc_t *proc) { bool intstatus = interrupt_set(false); spinlock_acquire(&proc->jobctllock);