1 /* Copyright (C) 1997-2022 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <https://www.gnu.org/licenses/>. */ 17 18 #include <errno.h> 19 #include <termios.h> 20 #include <sys/ioctl.h> 21 #include <sys/types.h> 22 #include <unistd.h> 23 24 /* Return the session ID of FD. */ 25 pid_t tcgetsid(int fd)26tcgetsid (int fd) 27 { 28 pid_t pgrp; 29 pid_t sid; 30 #ifdef TIOCGSID 31 static int tiocgsid_does_not_work; 32 33 if (! tiocgsid_does_not_work) 34 { 35 int serrno = errno; 36 int sid; 37 38 if (__ioctl (fd, TIOCGSID, &sid) < 0) 39 { 40 if (errno == EINVAL) 41 { 42 tiocgsid_does_not_work = 1; 43 __set_errno (serrno); 44 } 45 else 46 return (pid_t) -1; 47 } 48 else 49 return (pid_t) sid; 50 } 51 #endif 52 53 pgrp = tcgetpgrp (fd); 54 if (pgrp == -1) 55 return (pid_t) -1; 56 57 sid = getsid (pgrp); 58 if (sid == -1 && errno == ESRCH) 59 __set_errno (ENOTTY); 60 61 return sid; 62 } 63