Mercurial > octave
annotate lib/kpty.cpp @ 15628:e67d0d06c18b
Forked from QTermWidget.
author | Jacob Dawid <jacob.dawid@googlemail.com> |
---|---|
date | Mon, 23 Jan 2012 12:22:13 +0100 |
parents | |
children |
rev | line source |
---|---|
15628
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
1 /* |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
2 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
3 This file is part of the KDE libraries |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
4 Copyright (C) 2002 Waldo Bastian <bastian@kde.org> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
5 Copyright (C) 2002-2003,2007 Oswald Buddenhagen <ossi@kde.org> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
6 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
7 Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
8 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
9 This library is free software; you can redistribute it and/or |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
10 modify it under the terms of the GNU Library General Public |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
11 License as published by the Free Software Foundation; either |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
12 version 2 of the License, or (at your option) any later version. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
13 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
14 This library is distributed in the hope that it will be useful, |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
15 but WITHOUT ANY WARRANTY; without even the implied warranty of |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
17 Library General Public License for more details. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
18 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
19 You should have received a copy of the GNU Library General Public License |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
20 along with this library; see the file COPYING.LIB. If not, write to |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
21 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
22 Boston, MA 02110-1301, USA. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
23 */ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
24 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
25 #include "kpty_p.h" |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
26 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
27 #ifdef __sgi |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
28 #define __svr4__ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
29 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
30 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
31 #ifdef __osf__ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
32 #define _OSF_SOURCE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
33 #include <float.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
34 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
35 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
36 #ifdef _AIX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
37 #define _ALL_SOURCE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
38 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
39 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
40 // __USE_XOPEN isn't defined by default in ICC |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
41 // (needed for ptsname(), grantpt() and unlockpt()) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
42 #ifdef __INTEL_COMPILER |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
43 # ifndef __USE_XOPEN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
44 # define __USE_XOPEN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
45 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
46 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
47 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
48 #include <sys/types.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
49 #include <sys/ioctl.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
50 #include <sys/time.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
51 #include <sys/resource.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
52 #include <sys/stat.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
53 #include <sys/param.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
54 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
55 #include <errno.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
56 #include <fcntl.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
57 #include <time.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
58 #include <stdlib.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
59 #include <stdio.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
60 #include <string.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
61 #include <unistd.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
62 #include <grp.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
63 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
64 #if defined(HAVE_PTY_H) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
65 # include <pty.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
66 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
67 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
68 #ifdef HAVE_LIBUTIL_H |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
69 # include <libutil.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
70 #elif defined(HAVE_UTIL_H) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
71 # include <util.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
72 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
73 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
74 #ifdef HAVE_UTEMPTER |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
75 extern "C" { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
76 # include <utempter.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
77 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
78 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
79 # include <utmp.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
80 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
81 # include <utmpx.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
82 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
83 # if !defined(_PATH_UTMPX) && defined(_UTMPX_FILE) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
84 # define _PATH_UTMPX _UTMPX_FILE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
85 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
86 # if !defined(_PATH_WTMPX) && defined(_WTMPX_FILE) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
87 # define _PATH_WTMPX _WTMPX_FILE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
88 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
89 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
90 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
91 /* for HP-UX (some versions) the extern C is needed, and for other |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
92 platforms it doesn't hurt */ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
93 extern "C" { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
94 #include <termios.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
95 #if defined(HAVE_TERMIO_H) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
96 # include <termio.h> // struct winsize on some systems |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
97 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
98 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
99 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
100 #if defined (_HPUX_SOURCE) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
101 # define _TERMIOS_INCLUDED |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
102 # include <bsdtty.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
103 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
104 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
105 #ifdef HAVE_SYS_STROPTS_H |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
106 # include <sys/stropts.h> // Defines I_PUSH |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
107 # define _NEW_TTY_CTRL |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
108 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
109 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
110 #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
111 # define _tcgetattr(fd, ttmode) ioctl(fd, TIOCGETA, (char *)ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
112 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
113 # if defined(_HPUX_SOURCE) || defined(__Lynx__) || defined (__CYGWIN__) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
114 # define _tcgetattr(fd, ttmode) tcgetattr(fd, ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
115 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
116 # define _tcgetattr(fd, ttmode) ioctl(fd, TCGETS, (char *)ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
117 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
118 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
119 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
120 #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
121 # define _tcsetattr(fd, ttmode) ioctl(fd, TIOCSETA, (char *)ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
122 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
123 # if defined(_HPUX_SOURCE) || defined(__CYGWIN__) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
124 # define _tcsetattr(fd, ttmode) tcsetattr(fd, TCSANOW, ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
125 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
126 # define _tcsetattr(fd, ttmode) ioctl(fd, TCSETS, (char *)ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
127 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
128 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
129 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
130 //#include <kdebug.h> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
131 //#include <kstandarddirs.h> // findExe |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
132 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
133 #include <QtCore> |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
134 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
135 // not defined on HP-UX for example |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
136 #ifndef CTRL |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
137 # define CTRL(x) ((x) & 037) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
138 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
139 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
140 #define TTY_GROUP "tty" |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
141 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
142 /////////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
143 // private functions // |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
144 /////////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
145 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
146 ////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
147 // private data // |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
148 ////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
149 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
150 KPtyPrivate::KPtyPrivate(KPty* parent) : |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
151 masterFd(-1), slaveFd(-1), ownMaster(true), q_ptr(parent) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
152 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
153 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
154 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
155 KPtyPrivate::~KPtyPrivate() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
156 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
157 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
158 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
159 bool KPtyPrivate::chownpty(bool) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
160 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
161 // return !QProcess::execute(KStandardDirs::findExe("kgrantpty"), |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
162 // QStringList() << (grant?"--grant":"--revoke") << QString::number(masterFd)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
163 return true; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
164 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
165 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
166 ///////////////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
167 // public member functions // |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
168 ///////////////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
169 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
170 KPty::KPty() : |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
171 d_ptr(new KPtyPrivate(this)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
172 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
173 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
174 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
175 KPty::KPty(KPtyPrivate *d) : |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
176 d_ptr(d) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
177 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
178 d_ptr->q_ptr = this; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
179 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
180 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
181 KPty::~KPty() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
182 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
183 close(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
184 delete d_ptr; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
185 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
186 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
187 bool KPty::open() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
188 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
189 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
190 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
191 if (d->masterFd >= 0) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
192 return true; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
193 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
194 d->ownMaster = true; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
195 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
196 QByteArray ptyName; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
197 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
198 // Find a master pty that we can open //////////////////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
199 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
200 // Because not all the pty animals are created equal, they want to |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
201 // be opened by several different methods. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
202 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
203 // We try, as we know them, one by one. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
204 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
205 #ifdef HAVE_OPENPTY |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
206 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
207 char ptsn[PATH_MAX]; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
208 if (::openpty( &d->masterFd, &d->slaveFd, ptsn, 0, 0)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
209 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
210 d->masterFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
211 d->slaveFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
212 qWarning(175) << "Can't open a pseudo teletype"; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
213 return false; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
214 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
215 d->ttyName = ptsn; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
216 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
217 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
218 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
219 #ifdef HAVE__GETPTY // irix |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
220 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
221 char *ptsn = _getpty(&d->masterFd, O_RDWR|O_NOCTTY, S_IRUSR|S_IWUSR, 0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
222 if (ptsn) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
223 d->ttyName = ptsn; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
224 goto grantedpt; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
225 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
226 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
227 #elif defined(HAVE_PTSNAME) || defined(TIOCGPTN) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
228 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
229 #ifdef HAVE_POSIX_OPENPT |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
230 d->masterFd = ::posix_openpt(O_RDWR|O_NOCTTY); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
231 #elif defined(HAVE_GETPT) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
232 d->masterFd = ::getpt(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
233 #elif defined(PTM_DEVICE) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
234 d->masterFd = ::open(PTM_DEVICE, O_RDWR|O_NOCTTY); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
235 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
236 # error No method to open a PTY master detected. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
237 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
238 if (d->masterFd >= 0) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
239 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
240 #ifdef HAVE_PTSNAME |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
241 char *ptsn = ptsname(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
242 if (ptsn) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
243 d->ttyName = ptsn; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
244 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
245 int ptyno; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
246 if (!ioctl(d->masterFd, TIOCGPTN, &ptyno)) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
247 char buf[32]; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
248 sprintf(buf, "/dev/pts/%d", ptyno); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
249 d->ttyName = buf; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
250 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
251 #ifdef HAVE_GRANTPT |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
252 if (!grantpt(d->masterFd)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
253 goto grantedpt; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
254 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
255 goto gotpty; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
256 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
257 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
258 ::close(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
259 d->masterFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
260 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
261 #endif // HAVE_PTSNAME || TIOCGPTN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
262 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
263 // Linux device names, FIXME: Trouble on other systems? |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
264 for (const char* s3 = "pqrstuvwxyzabcde"; *s3; s3++) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
265 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
266 for (const char* s4 = "0123456789abcdef"; *s4; s4++) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
267 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
268 ptyName = QString().sprintf("/dev/pty%c%c", *s3, *s4).toAscii(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
269 d->ttyName = QString().sprintf("/dev/tty%c%c", *s3, *s4).toAscii(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
270 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
271 d->masterFd = ::open(ptyName.data(), O_RDWR); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
272 if (d->masterFd >= 0) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
273 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
274 #ifdef Q_OS_SOLARIS |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
275 /* Need to check the process group of the pty. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
276 * If it exists, then the slave pty is in use, |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
277 * and we need to get another one. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
278 */ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
279 int pgrp_rtn; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
280 if (ioctl(d->masterFd, TIOCGPGRP, &pgrp_rtn) == 0 || errno != EIO) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
281 ::close(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
282 d->masterFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
283 continue; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
284 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
285 #endif /* Q_OS_SOLARIS */ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
286 if (!access(d->ttyName.data(),R_OK|W_OK)) // checks availability based on permission bits |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
287 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
288 if (!geteuid()) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
289 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
290 struct group* p = getgrnam(TTY_GROUP); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
291 if (!p) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
292 p = getgrnam("wheel"); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
293 gid_t gid = p ? p->gr_gid : getgid (); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
294 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
295 if (!chown(d->ttyName.data(), getuid(), gid)) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
296 chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IWGRP); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
297 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
298 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
299 goto gotpty; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
300 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
301 ::close(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
302 d->masterFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
303 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
304 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
305 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
306 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
307 qWarning() << "Can't open a pseudo teletype"; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
308 return false; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
309 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
310 gotpty: |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
311 struct stat st; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
312 if (stat(d->ttyName.data(), &st)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
313 return false; // this just cannot happen ... *cough* Yeah right, I just |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
314 // had it happen when pty #349 was allocated. I guess |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
315 // there was some sort of leak? I only had a few open. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
316 if (((st.st_uid != getuid()) || |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
317 (st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
318 !d->chownpty(true)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
319 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
320 qWarning() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
321 << "chownpty failed for device " << ptyName << "::" << d->ttyName |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
322 << "\nThis means the communication can be eavesdropped." << endl; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
323 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
324 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
325 #if defined(HAVE_GRANTPT) || defined(HAVE__GETPTY) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
326 grantedpt: |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
327 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
328 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
329 #ifdef HAVE_REVOKE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
330 revoke(d->ttyName.data()); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
331 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
332 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
333 #ifdef HAVE_UNLOCKPT |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
334 unlockpt(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
335 #elif defined(TIOCSPTLCK) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
336 int flag = 0; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
337 ioctl(d->masterFd, TIOCSPTLCK, &flag); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
338 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
339 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
340 d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
341 if (d->slaveFd < 0) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
342 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
343 qWarning() << "Can't open slave pseudo teletype"; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
344 ::close(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
345 d->masterFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
346 return false; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
347 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
348 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
349 #if (defined(__svr4__) || defined(__sgi__)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
350 // Solaris |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
351 ioctl(d->slaveFd, I_PUSH, "ptem"); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
352 ioctl(d->slaveFd, I_PUSH, "ldterm"); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
353 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
354 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
355 #endif /* HAVE_OPENPTY */ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
356 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
357 fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
358 fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
359 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
360 return true; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
361 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
362 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
363 void KPty::closeSlave() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
364 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
365 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
366 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
367 if (d->slaveFd < 0) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
368 return; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
369 ::close(d->slaveFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
370 d->slaveFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
371 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
372 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
373 void KPty::close() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
374 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
375 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
376 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
377 if (d->masterFd < 0) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
378 return; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
379 closeSlave(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
380 // don't bother resetting unix98 pty, it will go away after closing master anyway. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
381 if (memcmp(d->ttyName.data(), "/dev/pts/", 9)) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
382 if (!geteuid()) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
383 struct stat st; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
384 if (!stat(d->ttyName.data(), &st)) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
385 if (!chown(d->ttyName.data(), 0, st.st_gid == getgid() ? 0 : -1)) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
386 chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
387 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
388 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
389 } else { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
390 fcntl(d->masterFd, F_SETFD, 0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
391 d->chownpty(false); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
392 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
393 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
394 ::close(d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
395 d->masterFd = -1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
396 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
397 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
398 void KPty::setCTty() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
399 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
400 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
401 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
402 // Setup job control ////////////////////////////////// |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
403 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
404 // Become session leader, process group leader, |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
405 // and get rid of the old controlling terminal. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
406 setsid(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
407 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
408 // make our slave pty the new controlling terminal. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
409 #ifdef TIOCSCTTY |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
410 ioctl(d->slaveFd, TIOCSCTTY, 0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
411 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
412 // __svr4__ hack: the first tty opened after setsid() becomes controlling tty |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
413 ::close(::open(d->ttyName, O_WRONLY, 0)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
414 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
415 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
416 // make our new process group the foreground group on the pty |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
417 int pgrp = getpid(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
418 #if defined(_POSIX_VERSION) || defined(__svr4__) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
419 tcsetpgrp(d->slaveFd, pgrp); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
420 #elif defined(TIOCSPGRP) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
421 ioctl(d->slaveFd, TIOCSPGRP, (char *)&pgrp); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
422 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
423 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
424 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
425 void KPty::login(const char *user, const char *remotehost) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
426 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
427 #ifdef HAVE_UTEMPTER |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
428 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
429 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
430 addToUtmp(d->ttyName, remotehost, d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
431 Q_UNUSED(user); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
432 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
433 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
434 struct utmpx l_struct; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
435 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
436 struct utmp l_struct; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
437 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
438 memset(&l_struct, 0, sizeof(l_struct)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
439 // note: strncpy without terminators _is_ correct here. man 4 utmp |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
440 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
441 if (user) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
442 strncpy(l_struct.ut_name, user, sizeof(l_struct.ut_name)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
443 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
444 if (remotehost) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
445 strncpy(l_struct.ut_host, remotehost, sizeof(l_struct.ut_host)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
446 # ifdef HAVE_STRUCT_UTMP_UT_SYSLEN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
447 l_struct.ut_syslen = qMin(strlen(remotehost), sizeof(l_struct.ut_host)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
448 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
449 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
450 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
451 # ifndef __GLIBC__ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
452 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
453 const char *str_ptr = d->ttyName.data(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
454 if (!memcmp(str_ptr, "/dev/", 5)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
455 str_ptr += 5; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
456 strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
457 # ifdef HAVE_STRUCT_UTMP_UT_ID |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
458 strncpy(l_struct.ut_id, |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
459 str_ptr + strlen(str_ptr) - sizeof(l_struct.ut_id), |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
460 sizeof(l_struct.ut_id)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
461 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
462 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
463 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
464 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
465 gettimeofday(&l_struct.ut_tv, 0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
466 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
467 l_struct.ut_time = time(0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
468 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
469 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
470 # ifdef HAVE_LOGIN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
471 # ifdef HAVE_LOGINX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
472 ::loginx(&l_struct); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
473 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
474 ::login(&l_struct); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
475 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
476 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
477 # ifdef HAVE_STRUCT_UTMP_UT_TYPE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
478 l_struct.ut_type = USER_PROCESS; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
479 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
480 # ifdef HAVE_STRUCT_UTMP_UT_PID |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
481 l_struct.ut_pid = getpid(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
482 # ifdef HAVE_STRUCT_UTMP_UT_SESSION |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
483 l_struct.ut_session = getsid(0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
484 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
485 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
486 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
487 utmpxname(_PATH_UTMPX); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
488 setutxent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
489 pututxline(&l_struct); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
490 endutxent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
491 updwtmpx(_PATH_WTMPX, &l_struct); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
492 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
493 utmpname(_PATH_UTMP); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
494 setutent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
495 pututline(&l_struct); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
496 endutent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
497 updwtmp(_PATH_WTMP, &l_struct); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
498 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
499 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
500 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
501 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
502 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
503 void KPty::logout() |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
504 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
505 #ifdef HAVE_UTEMPTER |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
506 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
507 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
508 removeLineFromUtmp(d->ttyName, d->masterFd); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
509 #else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
510 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
511 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
512 const char *str_ptr = d->ttyName.data(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
513 if (!memcmp(str_ptr, "/dev/", 5)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
514 str_ptr += 5; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
515 # ifdef __GLIBC__ |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
516 else { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
517 const char *sl_ptr = strrchr(str_ptr, '/'); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
518 if (sl_ptr) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
519 str_ptr = sl_ptr + 1; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
520 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
521 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
522 # ifdef HAVE_LOGIN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
523 # ifdef HAVE_LOGINX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
524 ::logoutx(str_ptr, 0, DEAD_PROCESS); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
525 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
526 ::logout(str_ptr); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
527 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
528 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
529 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
530 struct utmpx l_struct, *ut; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
531 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
532 struct utmp l_struct, *ut; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
533 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
534 memset(&l_struct, 0, sizeof(l_struct)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
535 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
536 strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
537 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
538 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
539 utmpxname(_PATH_UTMPX); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
540 setutxent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
541 if ((ut = getutxline(&l_struct))) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
542 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
543 utmpname(_PATH_UTMP); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
544 setutent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
545 if ((ut = getutline(&l_struct))) { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
546 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
547 memset(ut->ut_name, 0, sizeof(*ut->ut_name)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
548 memset(ut->ut_host, 0, sizeof(*ut->ut_host)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
549 # ifdef HAVE_STRUCT_UTMP_UT_SYSLEN |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
550 ut->ut_syslen = 0; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
551 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
552 # ifdef HAVE_STRUCT_UTMP_UT_TYPE |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
553 ut->ut_type = DEAD_PROCESS; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
554 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
555 # ifdef HAVE_UTMPX |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
556 gettimeofday(ut->ut_tv, 0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
557 pututxline(ut); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
558 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
559 endutxent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
560 # else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
561 ut->ut_time = time(0); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
562 pututline(ut); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
563 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
564 endutent(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
565 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
566 # endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
567 #endif |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
568 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
569 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
570 // XXX Supposedly, tc[gs]etattr do not work with the master on Solaris. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
571 // Please verify. |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
572 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
573 bool KPty::tcGetAttr(struct ::termios *ttmode) const |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
574 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
575 Q_D(const KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
576 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
577 return _tcgetattr(d->masterFd, ttmode) == 0; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
578 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
579 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
580 bool KPty::tcSetAttr(struct ::termios *ttmode) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
581 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
582 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
583 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
584 return _tcsetattr(d->masterFd, ttmode) == 0; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
585 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
586 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
587 bool KPty::setWinSize(int lines, int columns) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
588 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
589 Q_D(KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
590 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
591 struct winsize winSize; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
592 memset(&winSize, 0, sizeof(winSize)); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
593 winSize.ws_row = (unsigned short)lines; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
594 winSize.ws_col = (unsigned short)columns; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
595 return ioctl(d->masterFd, TIOCSWINSZ, (char *)&winSize) == 0; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
596 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
597 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
598 bool KPty::setEcho(bool echo) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
599 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
600 struct ::termios ttmode; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
601 if (!tcGetAttr(&ttmode)) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
602 return false; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
603 if (!echo) |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
604 ttmode.c_lflag &= ~ECHO; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
605 else |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
606 ttmode.c_lflag |= ECHO; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
607 return tcSetAttr(&ttmode); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
608 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
609 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
610 const char *KPty::ttyName() const |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
611 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
612 Q_D(const KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
613 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
614 return d->ttyName.data(); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
615 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
616 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
617 int KPty::masterFd() const |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
618 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
619 Q_D(const KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
620 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
621 return d->masterFd; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
622 } |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
623 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
624 int KPty::slaveFd() const |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
625 { |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
626 Q_D(const KPty); |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
627 |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
628 return d->slaveFd; |
e67d0d06c18b
Forked from QTermWidget.
Jacob Dawid <jacob.dawid@googlemail.com>
parents:
diff
changeset
|
629 } |