#endif
struct passwd *pw;
FILE *wtmp;
+ time_t uttime;
pw = getpwuid(getuid());
memset(&utmp_entry, 0, sizeof(utmp_entry));
strncpy(utmp_entry.ut_id, ttyname+8, lenof(utmp_entry.ut_id));
strncpy(utmp_entry.ut_user, pw->pw_name, lenof(utmp_entry.ut_user));
strncpy(utmp_entry.ut_host, location, lenof(utmp_entry.ut_host));
- time(&utmp_entry.ut_time);
+ /* Apparently there are some architectures where (struct utmp).ut_time
+ * is not essentially time_t (e.g. Linux amd64). Hence the temporary. */
+ time(&uttime);
+ utmp_entry.ut_time = uttime; /* may truncate */
#if defined HAVE_PUTUTLINE
utmpname(UTMP_FILE);
{
#ifndef OMIT_UTMP
FILE *wtmp;
+ time_t uttime;
if (!pty_stamped_utmp)
return;
utmp_entry.ut_type = DEAD_PROCESS;
memset(utmp_entry.ut_user, 0, lenof(utmp_entry.ut_user));
- time(&utmp_entry.ut_time);
+ time(&uttime);
+ utmp_entry.ut_time = uttime;
if ((wtmp = fopen(WTMP_FILE, "a")) != NULL) {
fwrite(&utmp_entry, 1, sizeof(utmp_entry), wtmp);
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
-static char *pty_init(void *frontend, void **backend_handle, Config *cfg,
- char *host, int port, char **realhost, int nodelay)
+static const char *pty_init(void *frontend, void **backend_handle, Config *cfg,
+ char *host, int port, char **realhost, int nodelay,
+ int keepalive)
{
int slavefd;
pid_t pid, pgrp;
* Stamp utmp (that is, tell the utmp helper process to do so),
* or not.
*/
- if (!cfg->stamp_utmp)
+ if (!cfg->stamp_utmp) {
close(pty_utmp_helper_pipe); /* just let the child process die */
- else {
+ pty_utmp_helper_pipe = -1;
+ } else {
char *location = get_x_display(pty_frontend);
int len = strlen(location)+1, pos = 0; /* +1 to include NUL */
while (pos < len) {
if (ret < 0) {
perror("pterm: writing to utmp helper process");
close(pty_utmp_helper_pipe); /* arrgh, just give up */
+ pty_utmp_helper_pipe = -1;
break;
}
pos += ret;
close(pty_master_fd);
pty_master_fd = -1;
}
- close(pty_utmp_helper_pipe); /* this causes utmp to be cleaned up */
+ if (pty_utmp_helper_pipe >= 0) {
+ close(pty_utmp_helper_pipe); /* this causes utmp to be cleaned up */
+ pty_utmp_helper_pipe = -1;
+ }
}
/*