diff options
Diffstat (limited to 'proc/pgrp.c')
-rw-r--r-- | proc/pgrp.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/proc/pgrp.c b/proc/pgrp.c index d7c562fa..9db1dba6 100644 --- a/proc/pgrp.c +++ b/proc/pgrp.c @@ -147,6 +147,30 @@ S_proc_getsid (struct proc *callerp, /* No need to check CALLERP; we don't use it. */ + if (namespace_is_subprocess (p)) + { + /* Relay it to the Subhurd's proc server (if any). */ + error_t err; + pid_t pid_sub; + + /* Release global lock while talking to the other proc server. */ + pthread_mutex_unlock (&global_lock); + + err = proc_task2pid (p->p_task_namespace, p->p_task, &pid_sub); + if (! err) + err = proc_getsid (p->p_task_namespace, pid_sub, sid); + if (! err) + /* Acquires global_lock. */ + err = namespace_translate_pids (p->p_task_namespace, sid, 1); + else + pthread_mutex_lock (&global_lock); + + if (! err) + return 0; + + /* Fallback. */ + } + *sid = p->p_pgrp->pg_session->s_sid; return 0; } @@ -167,6 +191,31 @@ S_proc_getsessionpids (struct proc *callerp, /* No need to check CALLERP; we don't use it. */ + p = pid_find (sid); + if (namespace_is_subprocess (p)) + { + /* Relay it to the Subhurd's proc server (if any). */ + error_t err; + pid_t pid_sub; + + /* Release global lock while talking to the other proc server. */ + pthread_mutex_unlock (&global_lock); + + err = proc_task2pid (p->p_task_namespace, p->p_task, &pid_sub); + if (! err) + err = proc_getsessionpids (p->p_task_namespace, pid_sub, pids, npidsp); + if (! err) + /* Acquires global_lock. */ + err = namespace_translate_pids (p->p_task_namespace, *pids, *npidsp); + else + pthread_mutex_lock (&global_lock); + + if (! err) + return 0; + + /* Fallback. */ + } + s = session_find (sid); if (!s) return ESRCH; @@ -206,6 +255,7 @@ S_proc_getsessionpgids (struct proc *callerp, size_t *npgidsp) { int count; + struct proc *p; struct pgrp *pg; struct session *s; pid_t *pp = *pgids; @@ -213,6 +263,31 @@ S_proc_getsessionpgids (struct proc *callerp, /* No need to check CALLERP; we don't use it. */ + p = pid_find (sid); + if (namespace_is_subprocess (p)) + { + /* Relay it to the Subhurd's proc server (if any). */ + error_t err; + pid_t pid_sub; + + /* Release global lock while talking to the other proc server. */ + pthread_mutex_unlock (&global_lock); + + err = proc_task2pid (p->p_task_namespace, p->p_task, &pid_sub); + if (! err) + err = proc_getsessionpgids (p->p_task_namespace, pid_sub, pgids, npgidsp); + if (! err) + /* Acquires global_lock. */ + err = namespace_translate_pids (p->p_task_namespace, *pgids, *npgidsp); + else + pthread_mutex_lock (&global_lock); + + if (! err) + return 0; + + /* Fallback. */ + } + s = session_find (sid); if (!s) return ESRCH; @@ -254,6 +329,31 @@ S_proc_getpgrppids (struct proc *callerp, /* No need to check CALLERP; we don't use it. */ + p = pid_find (pgid); + if (namespace_is_subprocess (p)) + { + /* Relay it to the Subhurd's proc server (if any). */ + error_t err; + pid_t pid_sub; + + /* Release global lock while talking to the other proc server. */ + pthread_mutex_unlock (&global_lock); + + err = proc_task2pid (p->p_task_namespace, p->p_task, &pid_sub); + if (! err) + err = proc_getpgrppids (p->p_task_namespace, pid_sub, pids, npidsp); + if (! err) + /* Acquires global_lock. */ + err = namespace_translate_pids (p->p_task_namespace, *pids, *npidsp); + else + pthread_mutex_lock (&global_lock); + + if (! err) + return 0; + + /* Fallback. */ + } + if (pgid == 0) pg = callerp->p_pgrp; else |