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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }