OSDN Git Service

hidden_def/hidden_proto: convert all users (I hope) termios split, add some missing...
[uclinux-h8/uClibc.git] / libc / termios / tcgetsid.c
1 /* Copyright (C) 1997, 1999 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, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <errno.h>
20 #include <termios.h>
21 #include <sys/ioctl.h>
22 #include <sys/types.h>
23 #define __USE_XOPEN_EXTENDED
24 #include <unistd.h>
25
26 libc_hidden_proto(ioctl)
27 libc_hidden_proto(getsid)
28 libc_hidden_proto(tcgetpgrp)
29
30 /* Return the session ID of FD.  */
31 pid_t tcgetsid (int fd)
32 {
33     pid_t pgrp;
34     pid_t sid;
35 #ifdef TIOCGSID
36     static int tiocgsid_does_not_work;
37
38     if (! tiocgsid_does_not_work)
39     {
40         int serrno = errno;
41         int sid;
42
43         if (ioctl (fd, TIOCGSID, &sid) < 0)
44         {
45             if (errno == EINVAL)
46             {
47                 tiocgsid_does_not_work = 1;
48                 __set_errno(serrno);
49             }
50             else
51                 return (pid_t) -1;
52         }
53         else
54             return (pid_t) sid;
55     }
56 #endif
57
58     pgrp = tcgetpgrp (fd);
59     if (pgrp == -1)
60         return (pid_t) -1;
61
62     sid = getsid (pgrp);
63     if (sid == -1 && errno == ESRCH)
64         __set_errno(ENOTTY);
65
66     return sid;
67 }