Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_procctl.c
Show First 20 Lines • Show All 425 Lines • ▼ Show 20 Lines | |||||
sys_procctl(struct thread *td, struct procctl_args *uap) | sys_procctl(struct thread *td, struct procctl_args *uap) | ||||
{ | { | ||||
void *data; | void *data; | ||||
union { | union { | ||||
struct procctl_reaper_status rs; | struct procctl_reaper_status rs; | ||||
struct procctl_reaper_pids rp; | struct procctl_reaper_pids rp; | ||||
struct procctl_reaper_kill rk; | struct procctl_reaper_kill rk; | ||||
} x; | } x; | ||||
int error, error1, flags; | int error, error1, flags, signum; | ||||
switch (uap->com) { | switch (uap->com) { | ||||
case PROC_SPROTECT: | case PROC_SPROTECT: | ||||
case PROC_TRACE_CTL: | case PROC_TRACE_CTL: | ||||
case PROC_TRAPCAP_CTL: | case PROC_TRAPCAP_CTL: | ||||
error = copyin(uap->data, &flags, sizeof(flags)); | error = copyin(uap->data, &flags, sizeof(flags)); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
Show All 19 Lines | case PROC_REAP_KILL: | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
data = &x.rk; | data = &x.rk; | ||||
break; | break; | ||||
case PROC_TRACE_STATUS: | case PROC_TRACE_STATUS: | ||||
case PROC_TRAPCAP_STATUS: | case PROC_TRAPCAP_STATUS: | ||||
data = &flags; | data = &flags; | ||||
break; | break; | ||||
case PROC_PDEATHSIG_SET: | |||||
error = copyin(uap->data, &signum, sizeof(signum)); | |||||
if (error != 0) | |||||
return (error); | |||||
data = &signum; | |||||
break; | |||||
case PROC_PDEATHSIG_GET: | |||||
data = &signum; | |||||
break; | |||||
default: | default: | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
error = kern_procctl(td, uap->idtype, uap->id, uap->com, data); | error = kern_procctl(td, uap->idtype, uap->id, uap->com, data); | ||||
switch (uap->com) { | switch (uap->com) { | ||||
case PROC_REAP_STATUS: | case PROC_REAP_STATUS: | ||||
if (error == 0) | if (error == 0) | ||||
error = copyout(&x.rs, uap->data, sizeof(x.rs)); | error = copyout(&x.rs, uap->data, sizeof(x.rs)); | ||||
break; | break; | ||||
case PROC_REAP_KILL: | case PROC_REAP_KILL: | ||||
error1 = copyout(&x.rk, uap->data, sizeof(x.rk)); | error1 = copyout(&x.rk, uap->data, sizeof(x.rk)); | ||||
if (error == 0) | if (error == 0) | ||||
error = error1; | error = error1; | ||||
break; | break; | ||||
case PROC_TRACE_STATUS: | case PROC_TRACE_STATUS: | ||||
case PROC_TRAPCAP_STATUS: | case PROC_TRAPCAP_STATUS: | ||||
if (error == 0) | if (error == 0) | ||||
error = copyout(&flags, uap->data, sizeof(flags)); | error = copyout(&flags, uap->data, sizeof(flags)); | ||||
break; | break; | ||||
case PROC_PDEATHSIG_GET: | |||||
if (error == 0) | |||||
error = copyout(&signum, uap->data, sizeof(signum)); | |||||
break; | |||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
kern_procctl_single(struct thread *td, struct proc *p, int com, void *data) | kern_procctl_single(struct thread *td, struct proc *p, int com, void *data) | ||||
{ | { | ||||
Show All 25 Lines | |||||
} | } | ||||
int | int | ||||
kern_procctl(struct thread *td, idtype_t idtype, id_t id, int com, void *data) | kern_procctl(struct thread *td, idtype_t idtype, id_t id, int com, void *data) | ||||
{ | { | ||||
struct pgrp *pg; | struct pgrp *pg; | ||||
struct proc *p; | struct proc *p; | ||||
int error, first_error, ok; | int error, first_error, ok; | ||||
int signum; | |||||
bool tree_locked; | bool tree_locked; | ||||
switch (com) { | switch (com) { | ||||
case PROC_REAP_ACQUIRE: | case PROC_REAP_ACQUIRE: | ||||
case PROC_REAP_RELEASE: | case PROC_REAP_RELEASE: | ||||
case PROC_REAP_STATUS: | case PROC_REAP_STATUS: | ||||
case PROC_REAP_GETPIDS: | case PROC_REAP_GETPIDS: | ||||
case PROC_REAP_KILL: | case PROC_REAP_KILL: | ||||
case PROC_TRACE_STATUS: | case PROC_TRACE_STATUS: | ||||
case PROC_TRAPCAP_STATUS: | case PROC_TRAPCAP_STATUS: | ||||
case PROC_PDEATHSIG_SET: | |||||
case PROC_PDEATHSIG_GET: | |||||
if (idtype != P_PID) | if (idtype != P_PID) | ||||
return (EINVAL); | return (EINVAL); | ||||
} | |||||
switch (com) { | |||||
case PROC_PDEATHSIG_SET: | |||||
signum = *(int *)data; | |||||
p = td->td_proc; | |||||
if ((id != 0 && id != p->p_pid) || | |||||
(signum != 0 && !_SIG_VALID(signum))) | |||||
return (EINVAL); | |||||
PROC_LOCK(p); | |||||
p->p_pdeathsig = signum; | |||||
mjg: both this and the case below should use the already declared p pointer to shorten the lines.
p… | |||||
PROC_UNLOCK(p); | |||||
return (0); | |||||
case PROC_PDEATHSIG_GET: | |||||
p = td->td_proc; | |||||
if (id != 0 && id != p->p_pid) | |||||
return (EINVAL); | |||||
PROC_LOCK(p); | |||||
*(int *)data = p->p_pdeathsig; | |||||
PROC_UNLOCK(p); | |||||
return (0); | |||||
} | } | ||||
switch (com) { | switch (com) { | ||||
case PROC_SPROTECT: | case PROC_SPROTECT: | ||||
case PROC_REAP_STATUS: | case PROC_REAP_STATUS: | ||||
case PROC_REAP_GETPIDS: | case PROC_REAP_GETPIDS: | ||||
case PROC_REAP_KILL: | case PROC_REAP_KILL: | ||||
case PROC_TRACE_CTL: | case PROC_TRACE_CTL: | ||||
case PROC_TRAPCAP_CTL: | case PROC_TRAPCAP_CTL: | ||||
sx_slock(&proctree_lock); | sx_slock(&proctree_lock); | ||||
tree_locked = true; | tree_locked = true; | ||||
break; | break; | ||||
case PROC_REAP_ACQUIRE: | case PROC_REAP_ACQUIRE: | ||||
case PROC_REAP_RELEASE: | case PROC_REAP_RELEASE: | ||||
sx_xlock(&proctree_lock); | sx_xlock(&proctree_lock); | ||||
tree_locked = true; | tree_locked = true; | ||||
break; | break; | ||||
case PROC_TRACE_STATUS: | case PROC_TRACE_STATUS: | ||||
case PROC_TRAPCAP_STATUS: | case PROC_TRAPCAP_STATUS: | ||||
tree_locked = false; | tree_locked = false; | ||||
break; | break; | ||||
default: | default: | ||||
Done Inline ActionsI think it is unnatural to keep the actual code in the locking switch. Might be, put a switch with only PDEATHSIG commands above this switch. kib: I think it is unnatural to keep the actual code in the locking switch. Might be, put a switch… | |||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
switch (idtype) { | switch (idtype) { | ||||
case P_PID: | case P_PID: | ||||
p = pfind(id); | p = pfind(id); | ||||
if (p == NULL) { | if (p == NULL) { | ||||
error = ESRCH; | error = ESRCH; | ||||
▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines |
both this and the case below should use the already declared p pointer to shorten the lines.
p = td->td_proc;
......