Add a tcgetsid() function that returns session id.
authorPeter Avalos <pavalos@theshell.com>
Sun, 15 Mar 2009 11:01:05 +0000 (01:01 -1000)
committerPeter Avalos <pavalos@theshell.com>
Tue, 7 Apr 2009 07:10:00 +0000 (21:10 -1000)
Obtained-from: FreeBSD

lib/libc/gen/Makefile.inc
lib/libc/gen/tcgetsid.3 [new file with mode: 0644]
lib/libc/gen/termios.c
sys/kern/tty.c
sys/sys/ttycom.h

index 5e232f0..f020aec 100644 (file)
@@ -76,7 +76,7 @@ MAN+= alarm.3 arc4random.3 clock.3 \
        raise.3 rand48.3 readpassphrase.3 rfork_thread.3 \
        scandir.3 setjmp.3 setmode.3 setproctitle.3 shm_open.3 \
        siginterrupt.3 signal.3 signbit.3 sigsetops.3 sleep.3 stringlist.3 \
-       strtofflags.3 sysconf.3 sysctl.3 syslog.3 tcgetpgrp.3 \
+       strtofflags.3 sysconf.3 sysctl.3 syslog.3 tcgetpgrp.3 tcgetsid.3 \
        tcsendbreak.3 tcsetattr.3 tcsetpgrp.3 time.3 times.3 \
        toascii.3 tolower.3 toupper.3 ttyname.3 tzset.3 ualarm.3 \
        ucontext.3 ulimit.3 uname.3 unvis.3 usleep.3 utime.3 \
diff --git a/lib/libc/gen/tcgetsid.3 b/lib/libc/gen/tcgetsid.3
new file mode 100644 (file)
index 0000000..92b6b33
--- /dev/null
@@ -0,0 +1,71 @@
+.\" Copyright (c) 2008 David Xu <davidxu@freebsd.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/lib/libc/gen/tcgetsid.3,v 1.1 2008/04/15 08:33:32 davidxu Exp $
+.\"
+.Dd April 15, 2008
+.Dt TCGETSID 3
+.Os
+.Sh NAME
+.Nm tcgetsid
+.Nd get session ID associated with a controlling terminal
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In sys/types.h
+.In termios.h
+.Ft pid_t
+.Fn tcgetsid "int fd"
+.Sh DESCRIPTION
+The
+.Fn tcgetsid
+function returns the process group ID of the session leader for a
+controlling terminal specified by
+.Fa fd .
+.Sh ERRORS
+If an error occurs,
+.Fn tcgetsid
+returns -1 and the global variable
+.Va errno
+is set to indicate the error, as follows:
+.Bl -tag -width Er
+.It Bq Er EBADF
+The
+.Fa fd
+argument is not a valid file descriptor.
+.It Bq Er ENOTTY
+The calling process does not have a controlling terminal or the
+underlying terminal device represented by
+.Fa fd
+is not the controlling terminal.
+.El
+.Sh SEE ALSO
+.Xr getsid 2 ,
+.Xr setsid 2 ,
+.Xr tcgetpgrp 3
+.Sh STANDARDS
+The
+.Fn tcgetsid
+function conforms to
+.St -xpg4.2 .
index f31468b..fb91e25 100644 (file)
@@ -97,6 +97,17 @@ tcgetpgrp(int fd)
        return ((pid_t)s);
 }
 
+pid_t
+tcgetsid(int fd)
+{
+       int s;
+
+       if (_ioctl(fd, TIOCGSID, &s) < 0)
+               return ((pid_t)-1);
+
+       return ((pid_t)s);
+}
+
 speed_t
 cfgetospeed(const struct termios *t)
 {
index bcf94b6..927971d 100644 (file)
@@ -932,6 +932,11 @@ ttioctl(struct tty *tp, u_long cmd, void *data, int flag)
                        return (ENOTTY);
                *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
                break;
+       case TIOCGSID:                  /* get sid of tty */
+               if (!isctty(p, tp))
+                       return (ENOTTY);
+               *(int *)data = tp->t_session->s_sid;
+               break;
 #ifdef TIOCHPCL
        case TIOCHPCL:                  /* hang up on last close */
                crit_enter();
index f3453d4..466e209 100644 (file)
@@ -118,6 +118,7 @@ struct winsize {
 #define        TIOCUCNTL       _IOW('t', 102, int)     /* pty: set/clr usr cntl mode */
 #define        TIOCSTAT         _IO('t', 101)          /* simulate ^T status message */
 #define                UIOCCMD(n)      _IO('u', n)     /* usr cntl op "n" */
+#define        TIOCGSID        _IOR('t', 99, int)      /* get session id */
 #define        TIOCCONS        _IOW('t', 98, int)      /* become virtual console */
 #define        TIOCSCTTY        _IO('t', 97)           /* become controlling tty */
 #define        TIOCEXT         _IOW('t', 96, int)      /* pty: external processing */