/* Test making a process group with two members and moving the leader out of
   the group and then back into it. */

#include "process.h"

int main(void)
{
	// Clean up children once pipe is closed.
	int pipes[2];
	if ( pipe(pipes) < 0 )
		err(1, "pipe");
	pid_t pgid = fork();
	if ( pgid < 0 )
		err(1, "fork");
	char c;
	if ( !pgid )
	{
		close(pipes[1]);
		read(pipes[0], &c, 1);
		exit(0);
	}
	if ( !kill(-pgid, 0) )
		errx(1, "process group already existed");
	if ( setpgid(pgid, pgid) < 0 )
		err(1, "setpgid on leader");
	if ( kill(-pgid, 0) < 0 )
		errx(1, "process was not created");
	pid_t member = fork();
	if ( member < 0 )
		err(1, "fork");
	if ( !member )
	{
		close(pipes[1]);
		read(pipes[0], &c, 1);
		exit(0);
	}
	if ( setpgid(member, pgid) < 0 )
		err(1, "setpgid on member");
	if ( setpgid(pgid, getpgid(0)) < 0 )
		err(1, "setpgid undo leader");
	if ( kill(-pgid, 0) < 0 )
		errx(1, "process was destroyed");
	if ( getpgid(pgid) != getpgid(0) )
		err(1, "leader was not undone");
	if ( setpgid(pgid, pgid) < 0 )
		err(1, "setpgid redo leader");
	if ( getpgid(pgid) != pgid )
		err(1, "leader was not redone");
	return 0;
}
