ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libptytty/doc/libptytty.3.pod
Revision: 1.17
Committed: Sun Jul 25 20:31:09 2010 UTC (16 years, 1 month ago) by sf-exg
Branch: MAIN
CVS Tags: rel-9_14, rel-9_12, rxvt-unicode-rel-9_18, rxvt-unicode-rel-9_17, rel-1_5, rxvt-unicode-rel-9_16, rel-1_4, rxvt-unicode-rel-9_15, rel-1_6
Changes since 1.16: +10 -10 lines
Log Message:
Fix typos.

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.2 libptytty - OS independent and secure pty/tty and utmp/wtmp/lastlog handling
4 root 1.1
5     =head1 SYNOPSIS
6    
7 root 1.11 cc ... -lptytty
8 root 1.9
9     #include <libptytty.h>
10    
11    
12     // C++
13     ptytty *pty = ptytty::create ();
14    
15     if (!pty->get ())
16     // error allocating pty
17    
18     if (we want utmp)
19     pty->login (process_pid, 0, "remote.host");
20     else if (we want utmp AND wtmp/lastlog)
21     pty->login (process_pid, 1, "remote.host");
22    
23     // we are done with it
24     delete pty;
25    
26    
27     // C
28     PTYTTY pty = ptytty_create ();
29    
30     if (!ptytty_get (pty))
31     // error allocating pty
32    
33     if (we want utmp)
34     ptytty_login (pty, process_pid, 0, "remote.host");
35     else if (we want utmp AND wtmp/lastlog)
36     ptytty_login (pty, process_pid, 1, "remote.host");
37    
38     // we are done with it
39     ptytty_delete (pty);
40    
41 root 1.12 See also the F<eg/> directory, which currently contains the F<c-sample.c>
42 sf-exg 1.17 file that spawns a login shell from C using libptytty.
43 root 1.1
44     =head1 DESCRIPTION
45    
46 root 1.9 Libptytty is a small library that offers pseudo-tty management in an
47     OS-independent way. It was created out of frustration over the many
48     differences of pty/tty handling in different operating systems for the use
49     inside C<rxvt-unicode>.
50    
51     In addition to offering mere pty/tty management, it also offers session
52     database support (utmp and optional wtmp/lastlog updates for login
53     shells).
54    
55     It also supports fork'ing after startup and dropping privileges in the
56     calling process, so in case the calling process gets compromised by the
57     user starting the program there is less to gain, as only the helper
58     process runs with privileges (e.g. setuid/setgid), which reduces the area
59     of attack immensely.
60    
61     Libptytty is written in C++, but it also offers a C-only API.
62 root 1.6
63 root 1.4 =head1 SECURITY CONSIDERATIONS
64 root 1.3
65 ayin 1.5 I<< B<It is of paramount importance that you at least read the following
66 root 1.4 paragraph!> >>
67    
68 root 1.16 If you write a typical terminal-like program that just wants one or more
69 root 1.8 ptys, you should call the C<ptytty::init ()> method (C: C<ptytty_init ()>
70 root 1.7 function) as the very first thing in your program:
71 root 1.4
72     int main (int argc, char *argv[])
73     {
74     // do nothing here
75     ptytty::init ();
76 root 1.7 // in C: ptytty_init ();
77 root 1.4
78     // initialise, parse arguments, etc.
79     }
80    
81 sf-exg 1.17 This checks whether the program runs setuid or setgid. If yes then it will
82 root 1.4 fork a helper process and drop privileges.
83    
84 root 1.6 Some programs need finer control over if and when this helper process
85     is started, and if and how to drop privileges. For those programs, the
86 root 1.14 methods C<ptytty::use_helper> and C<ptytty::drop_privileges> (and possibly
87     C<ptytty::sanitise_stdfd>) are more useful.
88 root 1.6
89 root 1.7 =head1 C++ INTERFACE: THE ptytty CLASS
90 root 1.6
91     =head2 STATIC METHODS
92    
93     =over 4
94    
95     =item ptytty::init ()
96    
97 root 1.14 The default way to initialise libptytty. Must be called immediately as
98 root 1.6 the first thing in the C<main> function, or earlier e.g. during static
99     construction time. The earlier, the better.
100    
101 sf-exg 1.17 This method calls C<sanitise_stdfd> and then checks whether the program runs
102 root 1.14 with setuid/setgid permissions and, if yes, spawns a helper process for
103     pty/tty management. It then drops the privileges completely, so the actual
104     program runs without setuid/setgid privileges.
105 root 1.6
106     =item ptytty::use_helper ()
107    
108 root 1.7 Tries to start a helper process that retains privileges even when the
109     calling process does not. This is usually called from C<ptytty::init> when
110     it detects that the program is running setuid or setgid, but can be called
111 sf-exg 1.17 manually if it is inconvenient to drop privileges at startup, or when
112 root 1.7 you are not running setuid/setgid but want to drop privileges (e.g. when
113     running as a root-started daemon).
114    
115     This method will try not to start more than one helper process. The same
116 root 1.13 helper process can usually be used both from the process starting it and
117     all its fork'ed (not exec'ed) children.
118 root 1.6
119     =item ptytty::drop_privileges ()
120    
121     Drops privileges completely, i.e. sets real, effective and saved user id
122 root 1.13 to the real user id. Also aborts if this cannot be achieved. Useful to
123 root 1.6 make sure that the process doesn't run with special privileges.
124    
125 root 1.14 =item ptytty::sanitise_stdfd ()
126    
127 sf-exg 1.17 Checks whether file descriptors 0, 1 and 2 (stdin, stdout and stderr) are
128 root 1.16 valid (open) and, if not, connects them to F</dev/tty> or F</dev/null> if
129     possible (and aborts otherwise). This is necessary because libptytty might
130     want to output error messages to those descriptors, which at the time of
131     outputting the error message, might be connected to something unsuitable
132     opened by the unsuspecting program itself (this can be a security issue).
133 root 1.14
134 root 1.6 =item bool success = ptytty::send_fd (int socket, int fd)
135    
136     Utility method to send a file descriptor over a unix domain
137     socket. Returns true if successful, false otherwise. This method is only
138 sf-exg 1.17 exposed for your convenience and is not required for normal operation.
139 root 1.6
140     =item int fd = ptytty::recv_fd (int socket)
141    
142     Utility method to receive a file descriptor over a unix domain
143 sf-exg 1.17 socket. Returns the fd if successful and C<-1> otherwise. This method
144     is only exposed for your convenience and is not required for normal
145 root 1.6 operation.
146 root 1.4
147 root 1.6 =item ptytty *pty = ptytty::create ()
148 root 1.3
149 root 1.6 Creates new ptytty object. Creation does not yet do anything besides
150     allocating the structure.
151    
152     A static method is used because the actual ptytty implementation can
153     differ at runtime, so you need a dynamic object creation facility.
154    
155     =back
156    
157 root 1.7
158 root 1.6 =head2 DYNAMIC/SESSION-RELATED DATA MEMBERS AND METHODS
159 root 1.1
160     =over 4
161    
162 root 1.6 =item int pty_fd = pty->pty
163    
164     =item int tty_fd = pty->tty
165    
166     These members contain the pty and tty file descriptors, respectively. They
167     initially contain C<-1> until a successful to C<ptytty::get>.
168    
169     =item bool success = pty->get ()
170    
171     Tries to find, allocate and initialise a new pty/tty pair. Returns C<true>
172     when successful.
173    
174     =item pty->login (int cmd_pid, bool login_shell, const char *hostname)
175    
176     Creates an entry in the systems session database(s) (utmp, wtmp, lastlog).
177     C<cmd_pid> must be the pid of the process representing the session
178 sf-exg 1.17 (such as the login shell), C<login_shell> defines whether the session is
179     associated with a login, which influences whether wtmp and lastlog entries
180 root 1.6 are created, and C<hostname> should identify the "hostname" the user logs
181     in from, which often is the value of the C<DISPLAY> variable or tty line
182     in case of local logins.
183    
184     Calling this method is optional. A session starts at the time of the login
185     call and extends until the ptytty object is destroyed.
186    
187     =item pty->close_tty ()
188    
189     Closes the tty. Useful after forking in the parent/pty process.
190    
191     =item bool success = pty->make_controlling_tty ()
192    
193     Tries to make the pty/tty pair the controlling terminal of the current
194     process. Useful after forking in the child/tty process.
195    
196     =item pty->set_utf8_mode (bool on)
197 root 1.1
198 root 1.13 On systems supporting special UTF-8 line disciplines (e.g. Linux), this
199     tries to enable this discipline for the given pty. Can be called at any
200     time to change the mode.
201 root 1.1
202     =back
203    
204 root 1.7
205     =head1 C INTERFACE: THE ptytty FAMILY OF FUNCTIONS
206    
207     =over 4
208    
209     =item ptytty_init ()
210    
211     See C<ptytty::init ()>.
212 ayin 1.15
213 root 1.7 =item PTYTTY ptytty_create ()
214    
215     Creates a new opaque PTYTTY object and returns it. Do not try to access it
216 root 1.13 in any way except by testing it for truthness (e.g. C<if (pty) ....>). See
217 root 1.7 C<ptytty::create ()>.
218    
219     =item int ptytty_pty (PTYTTY ptytty)
220    
221     Return the pty file descriptor. See C<< pty->pty >>.
222 ayin 1.15
223 root 1.7 =item int ptytty_tty (PTYTTY ptytty)
224    
225     Return the tty file descriptor. See C<< pty->tty >>.
226 ayin 1.15
227 root 1.7 =item void ptytty_delete (PTYTTY ptytty)
228    
229     Destroys the PTYTTY object, freeing the pty/tty pair and cleaning up the
230     utmp/wtmp/lastlog databases, if initialised/used. Same as C<delete pty> in
231     C++.
232    
233     =item int ptytty_get (PTYTTY ptytty)
234    
235     See C<< pty->get >>, returns 0 in case of an error, non-zero otherwise.
236    
237     =item void ptytty_login (PTYTTY ptytty, int cmd_pid, bool login_shell, const char *hostname)
238    
239     See C<< pty->login >>.
240    
241     =item void ptytty_close_tty (PTYTTY ptytty)
242    
243     See C<< pty->close_tty >>.
244 ayin 1.15
245 root 1.7 =item int ptytty_make_controlling_tty (PTYTTY ptytty)
246    
247     See C<< pty->make_controlling_tty >>.
248 ayin 1.15
249 root 1.7 =item void ptytty_set_utf8_mode (PTYTTY ptytty, int on)
250    
251     See C<< pty->set_utf8_mode >>.
252    
253     =item void ptytty_drop_privileges ()
254    
255     See C<< ptytty::drop_privileges >>.
256 ayin 1.15
257 root 1.7 =item void ptytty_use_helper ()
258    
259     See C<< ptytty::use_helper >>.
260    
261     =back
262    
263    
264 root 1.1 =head1 BUGS
265    
266     You kiddin'?
267    
268     =head1 AUTHORS
269    
270     Emanuele Giaquinta L<< <e.giaquinta@glauco.it> >>, Marc Alexander Lehmann
271     L<< <rxvt-unicode@schmorp.de> >>.