« Return to Thread: Re: lib/41673

Re: lib/41673

by Stathis Kamperis-2 :: Rate this Message:

Reply to Author | View in Thread

The following reply was made to PR lib/41673; it has been noted by GNATS.

From: Stathis Kamperis <ekamperi@...>
To: gnats-bugs@...
Cc:
Subject: Re: lib/41673
Date: Thu, 9 Jul 2009 20:24:00 +0300

 Hey all.
 
 I don't know my previous code snippet didn't get through all of it, so
 here it is again:
 
 #include <assert.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/wait.h>
 
 int main(void)
 {
  pid_t oldpgid, pid;
  int rv, status;
 
  pid = fork();
  assert(pid != -1);
 
  if (pid != 0) {
  /* We are inside the parent. */
  assert(wait(&status) == pid);
  } else {
  /* We are inside the child. */
 
  /* The process group ID is inherited. */
  oldpgid = getpgid(0);
  assert(oldpgid != (pid_t)-1);
 
  /*
  * The child process ID also doesn't match any active
  * process  group ID. So the following call should
  * fail with EPERM.
  */
  rv = tcsetpgrp(STDIN_FILENO, getpid());
  if (rv == 0) {
  /*
  * This should never happen, but in Linux it does.
  * Given that the tcsetpgrp(3) call allegedly
  * succeeded, the process group of the child will
  * be different from the parent's. Only it isn't.
  */
  assert(getpgid(0) != oldpgid);
  } else {
  /*
  * NetBSD fails here, returning EINVAL which is
  * clearly wrong, since we passed to tcsetpgrp(3)
  * a value returned from getpid(3). So it definitely
  * was a "valid pgid value".
  * Only Solaris gets all of it right.
  */
  assert(errno == EPERM);
  }
  }
 
  return (EXIT_SUCCESS);
 }
 
 Best regards,
 Stathis
 

 « Return to Thread: Re: lib/41673