… | |
… | |
12 | * Copyright (c) 1997 Raul Garcia Garcia <rgg@tid.es> |
12 | * Copyright (c) 1997 Raul Garcia Garcia <rgg@tid.es> |
13 | * Copyright (c) 1998-2001 Geoff Wing <gcw@pobox.com> |
13 | * Copyright (c) 1998-2001 Geoff Wing <gcw@pobox.com> |
14 | * - extensive modifications |
14 | * - extensive modifications |
15 | * Copyright (c) 1999 D J Hawkey Jr <hawkeyd@visi.com> |
15 | * Copyright (c) 1999 D J Hawkey Jr <hawkeyd@visi.com> |
16 | * - lastlog support |
16 | * - lastlog support |
17 | * Copyright (c) 2004 Marc Lehmann <pcg@goof.com> |
17 | * Copyright (c) 2004-2006 Marc Lehmann <pcg@goof.com> |
18 | * |
18 | * |
19 | * This program is free software; you can redistribute it and/or modify |
19 | * This program is free software; you can redistribute it and/or modify |
20 | * it under the terms of the GNU General Public License as published by |
20 | * it under the terms of the GNU General Public License as published by |
21 | * the Free Software Foundation; either version 2 of the License, or |
21 | * the Free Software Foundation; either version 2 of the License, or |
22 | * (at your option) any later version. |
22 | * (at your option) any later version. |
… | |
… | |
55 | |
55 | |
56 | /* |
56 | /* |
57 | * make and write utmp and wtmp entries |
57 | * make and write utmp and wtmp entries |
58 | */ |
58 | */ |
59 | void |
59 | void |
60 | rxvt_ptytty::login (int cmd_pid, bool login_shell, const char *hostname) |
60 | rxvt_ptytty_unix::login (int cmd_pid, bool login_shell, const char *hostname) |
61 | { |
61 | { |
|
|
62 | const char *pty = name; |
|
|
63 | |
|
|
64 | if (!pty || !*pty) |
|
|
65 | return; |
|
|
66 | |
62 | this->cmd_pid = cmd_pid; |
67 | this->cmd_pid = cmd_pid; |
63 | this->login_shell = login_shell; |
68 | this->login_shell = login_shell; |
64 | |
|
|
65 | const char *pty = name; |
|
|
66 | |
69 | |
67 | #ifdef HAVE_STRUCT_UTMP |
70 | #ifdef HAVE_STRUCT_UTMP |
68 | struct utmp *ut = &this->ut; |
71 | struct utmp *ut = &this->ut; |
69 | #endif |
72 | #endif |
70 | #ifdef HAVE_STRUCT_UTMPX |
73 | #ifdef HAVE_STRUCT_UTMPX |
… | |
… | |
160 | endutxent (); /* close the file */ |
163 | endutxent (); /* close the file */ |
161 | utmp_pos = 0; |
164 | utmp_pos = 0; |
162 | #endif |
165 | #endif |
163 | |
166 | |
164 | #if defined(HAVE_STRUCT_UTMP) && !defined(HAVE_UTMP_PID) |
167 | #if defined(HAVE_STRUCT_UTMP) && !defined(HAVE_UTMP_PID) |
165 | |
|
|
166 | { |
168 | { |
167 | # ifdef HAVE_TTYSLOT |
169 | # ifdef HAVE_TTYSLOT |
|
|
170 | int fdstdin = dup (STDIN_FILENO); |
|
|
171 | dup2 (tty, STDIN_FILENO); |
|
|
172 | |
168 | i = ttyslot (); |
173 | i = ttyslot (); |
169 | if (rxvt_write_bsd_utmp (i, ut)) |
174 | if (rxvt_write_bsd_utmp (i, ut)) |
170 | utmp_pos = i; |
175 | utmp_pos = i; |
|
|
176 | |
|
|
177 | dup2 (fdstdin, STDIN_FILENO); |
|
|
178 | close (fdstdin); |
171 | # else |
179 | # else |
172 | FILE *fd0; |
180 | FILE *fd0; |
173 | |
181 | |
174 | if ((fd0 = fopen (TTYTAB_FILENAME, "r")) != NULL) |
182 | if ((fd0 = fopen (TTYTAB_FILENAME, "r")) != NULL) |
175 | { |
183 | { |
176 | char buf[256], name[256]; |
184 | char buf[256], name[256]; |
177 | |
185 | |
… | |
… | |
195 | # endif |
203 | # endif |
196 | } |
204 | } |
197 | #endif |
205 | #endif |
198 | |
206 | |
199 | #ifdef WTMP_SUPPORT |
207 | #ifdef WTMP_SUPPORT |
200 | # ifdef WTMP_ONLY_ON_LOGIN |
|
|
201 | if (login_shell) |
208 | if (login_shell) |
202 | # endif |
|
|
203 | { |
209 | { |
204 | # ifdef HAVE_STRUCT_UTMP |
210 | # ifdef HAVE_STRUCT_UTMP |
205 | # ifdef HAVE_UPDWTMP |
211 | # ifdef HAVE_UPDWTMP |
206 | updwtmp (RXVT_WTMP_FILE, ut); |
212 | updwtmp (RXVT_WTMP_FILE, ut); |
207 | # else |
213 | # else |
… | |
… | |
222 | /* ------------------------------------------------------------------------- */ |
228 | /* ------------------------------------------------------------------------- */ |
223 | /* |
229 | /* |
224 | * remove utmp and wtmp entries |
230 | * remove utmp and wtmp entries |
225 | */ |
231 | */ |
226 | void |
232 | void |
227 | rxvt_ptytty::logout () |
233 | rxvt_ptytty_unix::logout () |
228 | { |
234 | { |
|
|
235 | if (!cmd_pid) |
|
|
236 | return; |
|
|
237 | |
229 | #ifdef HAVE_STRUCT_UTMP |
238 | #ifdef HAVE_STRUCT_UTMP |
230 | struct utmp *tmput, *ut = &this->ut; |
239 | struct utmp *tmput, *ut = &this->ut; |
231 | #endif |
240 | #endif |
232 | #ifdef HAVE_STRUCT_UTMPX |
241 | #ifdef HAVE_STRUCT_UTMPX |
233 | struct utmpx *tmputx, *utx = &this->utx; |
242 | struct utmpx *tmputx, *utx = &this->utx; |
… | |
… | |
268 | |
277 | |
269 | /* |
278 | /* |
270 | * Write ending wtmp entry |
279 | * Write ending wtmp entry |
271 | */ |
280 | */ |
272 | #ifdef WTMP_SUPPORT |
281 | #ifdef WTMP_SUPPORT |
273 | # ifdef WTMP_ONLY_ON_LOGIN |
|
|
274 | if (login_shell) |
282 | if (login_shell) |
275 | # endif |
|
|
276 | { |
283 | { |
277 | # ifdef HAVE_STRUCT_UTMP |
284 | # ifdef HAVE_STRUCT_UTMP |
278 | # ifdef HAVE_UPDWTMP |
285 | # ifdef HAVE_UPDWTMP |
279 | updwtmp (RXVT_WTMP_FILE, ut); |
286 | updwtmp (RXVT_WTMP_FILE, ut); |
280 | # else |
287 | # else |
… | |
… | |
303 | #ifdef HAVE_STRUCT_UTMPX |
310 | #ifdef HAVE_STRUCT_UTMPX |
304 | if (utx->ut_pid == cmd_pid) |
311 | if (utx->ut_pid == cmd_pid) |
305 | pututxline (utx); |
312 | pututxline (utx); |
306 | endutxent (); |
313 | endutxent (); |
307 | #endif |
314 | #endif |
|
|
315 | |
|
|
316 | cmd_pid = 0; |
308 | } |
317 | } |
309 | |
318 | |
310 | /* ------------------------------------------------------------------------- */ |
319 | /* ------------------------------------------------------------------------- */ |
311 | /* |
320 | /* |
312 | * Write a BSD style utmp entry |
321 | * Write a BSD style utmp entry |