aboutsummaryrefslogtreecommitdiff
path: root/proc/pgrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'proc/pgrp.c')
-rw-r--r--proc/pgrp.c100
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