ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libptytty/doc/libptytty.3.pod
Revision: 1.12
Committed: Wed Jan 25 11:14:26 2006 UTC (20 years, 7 months ago) by root
Branch: MAIN
CVS Tags: rel-0_1, rel-0_2
Changes since 1.11: +2 -1 lines
Log Message:
*** empty log message ***

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     file that spawns a loginshell 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     If you are 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     This checks wether the program runs setuid or setgid. If yes then it will
82     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     methods C<ptytty::use_helper> and C<ptytty::drop_privileges> are more
87     useful.
88    
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     The default way to initialise libptytty. Must be called imemdiately as
98     the first thing in the C<main> function, or earlier e.g. during static
99     construction time. The earlier, the better.
100    
101     This method checks wether the program runs with setuid/setgid permissions
102     and, if yes, spawns a helper process for pty/tty management. IT then
103     drops the privileges completely, so the actual program runs without
104     setuid/setgid privileges.
105    
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     manually if it is inconvinient to drop privileges at startup, or when
112     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     helper process cna usually be used form the process starting it an all its
117     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     to the real user id. Also aborts if this cnanot be achieved. Useful to
123     make sure that the process doesn't run with special privileges.
124    
125     =item bool success = ptytty::send_fd (int socket, int fd)
126    
127     Utility method to send a file descriptor over a unix domain
128     socket. Returns true if successful, false otherwise. This method is only
129     exposed for your convinience and is not required for normal operation.
130    
131     =item int fd = ptytty::recv_fd (int socket)
132    
133     Utility method to receive a file descriptor over a unix domain
134     socket. Returns the fd if sucecssful and C<-1> otherwise. This method
135     is only exposed for your convinience and is not required for normal
136     operation.
137 root 1.4
138 root 1.6 =item ptytty *pty = ptytty::create ()
139 root 1.3
140 root 1.6 Creates new ptytty object. Creation does not yet do anything besides
141     allocating the structure.
142    
143     A static method is used because the actual ptytty implementation can
144     differ at runtime, so you need a dynamic object creation facility.
145    
146     =back
147    
148 root 1.7
149 root 1.6 =head2 DYNAMIC/SESSION-RELATED DATA MEMBERS AND METHODS
150 root 1.1
151     =over 4
152    
153 root 1.6 =item int pty_fd = pty->pty
154    
155     =item int tty_fd = pty->tty
156    
157     These members contain the pty and tty file descriptors, respectively. They
158     initially contain C<-1> until a successful to C<ptytty::get>.
159    
160     =item bool success = pty->get ()
161    
162     Tries to find, allocate and initialise a new pty/tty pair. Returns C<true>
163     when successful.
164    
165     =item pty->login (int cmd_pid, bool login_shell, const char *hostname)
166    
167     Creates an entry in the systems session database(s) (utmp, wtmp, lastlog).
168     C<cmd_pid> must be the pid of the process representing the session
169     (such as the login shell), C<login_shell> defines wether the session is
170     associated with a login, which influences wether wtmp and lastlog entries
171     are created, and C<hostname> should identify the "hostname" the user logs
172     in from, which often is the value of the C<DISPLAY> variable or tty line
173     in case of local logins.
174    
175     Calling this method is optional. A session starts at the time of the login
176     call and extends until the ptytty object is destroyed.
177    
178     =item pty->close_tty ()
179    
180     Closes the tty. Useful after forking in the parent/pty process.
181    
182     =item bool success = pty->make_controlling_tty ()
183    
184     Tries to make the pty/tty pair the controlling terminal of the current
185     process. Useful after forking in the child/tty process.
186    
187     =item pty->set_utf8_mode (bool on)
188 root 1.1
189 root 1.6 On systems supporting special UTF-8 line disciplines (e.g. Linux), tries
190     to enable it for the given pty. Can be called at any time to change the
191     mode.
192 root 1.1
193     =back
194    
195 root 1.7
196     =head1 C INTERFACE: THE ptytty FAMILY OF FUNCTIONS
197    
198     =over 4
199    
200     =item ptytty_init ()
201    
202     See C<ptytty::init ()>.
203    
204     =item PTYTTY ptytty_create ()
205    
206     Creates a new opaque PTYTTY object and returns it. Do not try to access it
207     in any way excecp by testing it for truthness (e.g. C<if (pty) ....>). See
208     C<ptytty::create ()>.
209    
210     =item int ptytty_pty (PTYTTY ptytty)
211    
212     Return the pty file descriptor. See C<< pty->pty >>.
213    
214     =item int ptytty_tty (PTYTTY ptytty)
215    
216     Return the tty file descriptor. See C<< pty->tty >>.
217    
218     =item void ptytty_delete (PTYTTY ptytty)
219    
220     Destroys the PTYTTY object, freeing the pty/tty pair and cleaning up the
221     utmp/wtmp/lastlog databases, if initialised/used. Same as C<delete pty> in
222     C++.
223    
224     =item int ptytty_get (PTYTTY ptytty)
225    
226     See C<< pty->get >>, returns 0 in case of an error, non-zero otherwise.
227    
228     =item void ptytty_login (PTYTTY ptytty, int cmd_pid, bool login_shell, const char *hostname)
229    
230     See C<< pty->login >>.
231    
232     =item void ptytty_close_tty (PTYTTY ptytty)
233    
234     See C<< pty->close_tty >>.
235    
236     =item int ptytty_make_controlling_tty (PTYTTY ptytty)
237    
238     See C<< pty->make_controlling_tty >>.
239    
240     =item void ptytty_set_utf8_mode (PTYTTY ptytty, int on)
241    
242     See C<< pty->set_utf8_mode >>.
243    
244     =item void ptytty_drop_privileges ()
245    
246     See C<< ptytty::drop_privileges >>.
247    
248     =item void ptytty_use_helper ()
249    
250     See C<< ptytty::use_helper >>.
251    
252     =back
253    
254    
255 root 1.1 =head1 BUGS
256    
257     You kiddin'?
258    
259     =head1 AUTHORS
260    
261     Emanuele Giaquinta L<< <e.giaquinta@glauco.it> >>, Marc Alexander Lehmann
262     L<< <rxvt-unicode@schmorp.de> >>.