libposix: fix setpgid: if the target process is already a group leader, do nothing
This commit is contained in:
parent
6a9aaa3b14
commit
8ed3e74c3f
|
@ -49,12 +49,14 @@ __libposix_sighelper_set_pgid(int target, int group)
|
||||||
long raw;
|
long raw;
|
||||||
} offset;
|
} offset;
|
||||||
IntBuf buf;
|
IntBuf buf;
|
||||||
|
long ret;
|
||||||
|
|
||||||
offset.request.command = PHSetProcessGroup;
|
offset.request.command = PHSetProcessGroup;
|
||||||
offset.request.target = target;
|
offset.request.target = target;
|
||||||
|
|
||||||
buf.group = group;
|
buf.group = group;
|
||||||
return pwrite(*__libposix_devsignal, buf.raw, sizeof(buf.raw), offset.raw);
|
ret = pwrite(*__libposix_devsignal, buf.raw, sizeof(buf.raw), offset.raw);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -77,11 +79,15 @@ CreateNewProcessGroup:
|
||||||
rfork(RFNOTEG);
|
rfork(RFNOTEG);
|
||||||
return __libposix_sighelper_cmd(PHSetProcessGroup, mypid);
|
return __libposix_sighelper_cmd(PHSetProcessGroup, mypid);
|
||||||
}
|
}
|
||||||
|
if(pid == 0)
|
||||||
|
pid = mypid;
|
||||||
ppid = get_ppid(pid);
|
ppid = get_ppid(pid);
|
||||||
if(ppid == -1 || pid != mypid && mypid != ppid){
|
if(ppid == -1 || pid != mypid && mypid != ppid){
|
||||||
*errnop = __libposix_get_errno(PosixESRCH);
|
*errnop = __libposix_get_errno(PosixESRCH);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if(group == 0)
|
||||||
|
group = pid;
|
||||||
if(pid == group && pid == mypid)
|
if(pid == group && pid == mypid)
|
||||||
goto CreateNewProcessGroup;
|
goto CreateNewProcessGroup;
|
||||||
|
|
||||||
|
|
|
@ -329,8 +329,10 @@ group_create(Process *leader)
|
||||||
ProcessGroup* g;
|
ProcessGroup* g;
|
||||||
assert(leader != nil);
|
assert(leader != nil);
|
||||||
|
|
||||||
if((leader->flags & GroupLeader) || (leader->flags & SessionLeader))
|
if(leader->flags & SessionLeader)
|
||||||
return nil; /* operation not permitted */
|
return nil; /* operation not permitted */
|
||||||
|
if(leader->group && leader->group->pgid == leader->pid)
|
||||||
|
return leader->group; /* nothing to do */
|
||||||
|
|
||||||
g = mallocz(sizeof(ProcessGroup), 1);
|
g = mallocz(sizeof(ProcessGroup), 1);
|
||||||
if(g == nil)
|
if(g == nil)
|
||||||
|
|
Loading…
Reference in New Issue