xref: /haiku/src/system/libroot/posix/unistd/terminal.c (revision 5af32e752606778be5dd7379f319fe43cb3f6b8c)
1*5af32e75SAxel Dörfler /*
2*5af32e75SAxel Dörfler  * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3*5af32e75SAxel Dörfler  * Distributed under the terms of the MIT License.
4*5af32e75SAxel Dörfler  */
5*5af32e75SAxel Dörfler 
6*5af32e75SAxel Dörfler 
7*5af32e75SAxel Dörfler #include <stdio.h>
8*5af32e75SAxel Dörfler #include <string.h>
9*5af32e75SAxel Dörfler #include <unistd.h>
10*5af32e75SAxel Dörfler #include <termios.h>
11*5af32e75SAxel Dörfler 
12*5af32e75SAxel Dörfler #include <syscalls.h>
13*5af32e75SAxel Dörfler 
14*5af32e75SAxel Dörfler 
15*5af32e75SAxel Dörfler /**	isatty - is the given file descriptor bound to a terminal device?
16*5af32e75SAxel Dörfler  *	a simple call to fetch the terminal control attributes suffices
17*5af32e75SAxel Dörfler  *	(only a valid tty device will succeed)
18*5af32e75SAxel Dörfler  */
19*5af32e75SAxel Dörfler 
20*5af32e75SAxel Dörfler int
isatty(int fd)21*5af32e75SAxel Dörfler isatty(int fd)
22*5af32e75SAxel Dörfler {
23*5af32e75SAxel Dörfler 	struct termios termios;
24*5af32e75SAxel Dörfler 
25*5af32e75SAxel Dörfler 	return _kern_ioctl(fd, TCGETA, &termios, sizeof(struct termios)) == B_OK;
26*5af32e75SAxel Dörfler 		// we don't use tcgetattr() here in order to keep errno unchanged
27*5af32e75SAxel Dörfler }
28*5af32e75SAxel Dörfler 
29*5af32e75SAxel Dörfler 
30*5af32e75SAxel Dörfler /** returns the name of the controlling terminal */
31*5af32e75SAxel Dörfler 
32*5af32e75SAxel Dörfler char *
ctermid(char * s)33*5af32e75SAxel Dörfler ctermid(char *s)
34*5af32e75SAxel Dörfler {
35*5af32e75SAxel Dörfler 	static char defaultBuffer[L_ctermid];
36*5af32e75SAxel Dörfler 	char *name = ttyname(STDOUT_FILENO);
37*5af32e75SAxel Dörfler 		// we assume that stdout is our controlling terminal...
38*5af32e75SAxel Dörfler 
39*5af32e75SAxel Dörfler 	if (s == NULL)
40*5af32e75SAxel Dörfler 		s = defaultBuffer;
41*5af32e75SAxel Dörfler 
42*5af32e75SAxel Dörfler 	return strcpy(s, name ? name : "");
43*5af32e75SAxel Dörfler }
44*5af32e75SAxel Dörfler 
45*5af32e75SAxel Dörfler 
46*5af32e75SAxel Dörfler int
tcsetpgrp(int fd,pid_t pgrpid)47*5af32e75SAxel Dörfler tcsetpgrp(int fd, pid_t pgrpid)
48*5af32e75SAxel Dörfler {
49*5af32e75SAxel Dörfler 	return ioctl(fd, TIOCSPGRP, &pgrpid);
50*5af32e75SAxel Dörfler }
51*5af32e75SAxel Dörfler 
52*5af32e75SAxel Dörfler 
53*5af32e75SAxel Dörfler pid_t
tcgetpgrp(int fd)54*5af32e75SAxel Dörfler tcgetpgrp(int fd)
55*5af32e75SAxel Dörfler {
56*5af32e75SAxel Dörfler 	pid_t foregroundProcess;
57*5af32e75SAxel Dörfler 	int status = ioctl(fd, TIOCGPGRP, &foregroundProcess);
58*5af32e75SAxel Dörfler 	if (status == 0)
59*5af32e75SAxel Dörfler 		return foregroundProcess;
60*5af32e75SAxel Dörfler 
61*5af32e75SAxel Dörfler 	return -1;
62*5af32e75SAxel Dörfler }
63