From d3becf43185de8b54c3d6721d958b781f5e12fff Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 24 Nov 2016 12:06:29 +0100 Subject: [PATCH] login_tty: Rewrite following FreeBSD's traces Signed-off-by: Corinna Vinschen --- winsup/cygwin/libc/bsdlib.cc | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/winsup/cygwin/libc/bsdlib.cc b/winsup/cygwin/libc/bsdlib.cc index 89bc9431c..8e1082724 100644 --- a/winsup/cygwin/libc/bsdlib.cc +++ b/winsup/cygwin/libc/bsdlib.cc @@ -77,22 +77,15 @@ daemon (int nochdir, int noclose) extern "C" int login_tty (int fd) { - char *fdname; - int newfd; - - if (setsid () == -1) + /* If setsid fails, FreeBSD uses the current sid returned by getsid(0), + then calls tcsetsid, which we don't provide (just as Linux doesn't). + tcsetsid only uses the sid to check against the value returned by + getsid(0). So, either way, that check will not fail and we can + simply ignore the return value from setsid and just perform the + ioctl call tcsetsid does. */ + setsid (); + if (ioctl (fd, TIOCSCTTY, NULL) == -1) return -1; - if ((fdname = ttyname (fd))) - { - if (fd != STDIN_FILENO) - close (STDIN_FILENO); - if (fd != STDOUT_FILENO) - close (STDOUT_FILENO); - if (fd != STDERR_FILENO) - close (STDERR_FILENO); - newfd = open (fdname, O_RDWR); - close (newfd); - } dup2 (fd, STDIN_FILENO); dup2 (fd, STDOUT_FILENO); dup2 (fd, STDERR_FILENO);