/* Test tcgetpgrp if the terminal has no session. */

#include "suite.h"

int main(void)
{
	int controller = posix_openpt(O_RDWR | O_NOCTTY);
	if ( controller < 0 )
		err(1, "posix_openpt");
	if ( grantpt(controller) < 0 )
		err(1, "grantpt");
	if ( unlockpt(controller) < 0 )
		err(1, "unlockpt");
	char* name = ptsname(controller);
	if ( !name )
		err(1, "unlockpt");
	pid_t session = fork();
	if ( session < 0 )
		err(1, "fork");
	if ( !session )
	{
		close(controller);
		if ( setsid() < 0 )
			err(1, "setsid");
		session = getpid();
		int pty = open(name, O_RDWR | O_NOCTTY);
		if ( pty < 0 )
			err(1, "%s", name);
		// ENOTTY is supposed to happen here because the tty has no session.
		errno = 0; // In case tcgetpgrp returns -1 without an error.
		pid_t tty_pgrp = tcgetpgrp(pty);
		if ( tty_pgrp < 0 )
			err(1, "tcgetpgrp");
		printf("%li\n", (long) tty_pgrp);
		exit(0);
	}
	int status;
	if ( waitpid(session, &status, 0) < 0 )
		err(1, "waitpid");
	close(controller);
	if ( WIFEXITED(status) )
		return WEXITSTATUS(status);
	else if ( WIFSIGNALED(status) )
		errx(1, "%s", strsignal(WTERMSIG(status)));
	else
		errx(1, "unknown exit: %#x", status);
	return 0;
}
