diff --git a/headers/posix/termios.h b/headers/posix/termios.h index 141746eb23..e8ec24428a 100644 --- a/headers/posix/termios.h +++ b/headers/posix/termios.h @@ -187,6 +187,7 @@ struct termios { #define TIOCCBRK (TCGETA + 21) /* both are a frontend to TCSBRK */ #define TIOCMBIS (TCGETA + 22) /* set bits in line state */ #define TIOCMBIC (TCGETA + 23) /* clear bits in line state */ +#define TIOCGSID (TCGETA + 24) /* get session leader process group ID */ /* Event codes. Returned from TCWAITEVENT */ #define EV_RING 0x0001 @@ -233,6 +234,7 @@ extern int tcsendbreak(int fd, int duration); extern int tcdrain(int fd); extern int tcflow(int fd, int action); extern int tcflush(int fd, int queueSelector); +extern pid_t tcgetsid(int fd); #ifdef __cplusplus } diff --git a/src/add-ons/kernel/drivers/tty/tty.cpp b/src/add-ons/kernel/drivers/tty/tty.cpp index 95e53ed478..0117696b44 100644 --- a/src/add-ons/kernel/drivers/tty/tty.cpp +++ b/src/add-ons/kernel/drivers/tty/tty.cpp @@ -1679,6 +1679,15 @@ tty_ioctl(tty_cookie* cookie, uint32 op, void* buffer, size_t length) return B_OK; } + // get session leader process group ID + + case TIOCGSID: + { + TRACE(("tty: get session_id\n")); + return user_memcpy(buffer, &tty->settings->session_id, + sizeof(pid_t)); + } + // get and set window size case TIOCGWINSZ: diff --git a/src/system/libroot/posix/termios.c b/src/system/libroot/posix/termios.c index f60602eb7e..18b9c96c2f 100644 --- a/src/system/libroot/posix/termios.c +++ b/src/system/libroot/posix/termios.c @@ -167,3 +167,16 @@ cfmakeraw(struct termios *termios) termios->c_cflag &= ~(CSIZE | PARENB); termios->c_cflag |= CS8; } + + +pid_t +tcgetsid(int fd) +{ + int sid; + + if (ioctl(fd, TIOCGSID, &sid) == 0) + return sid; + + return -1; +} +