Module Name: src
Committed By: christos
Date: Sat Sep 17 01:50:09 UTC 2011
Modified Files:
src/external/bsd/tmux/dist: tmux.h window.c
Added Files:
src/external/bsd/tmux/dist: utmp.c
Log Message:
Add utmp/utmpx support.
XXX: Should we make the top pty (tmux) hide?
XXX: Should we add an option to not create utmp entries for a tmux terminal?
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/tmux/dist/tmux.h
cvs rdiff -u -r0 -r1.1 src/external/bsd/tmux/dist/utmp.c
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/tmux/dist/window.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/tmux/dist/tmux.h
diff -u src/external/bsd/tmux/dist/tmux.h:1.2 src/external/bsd/tmux/dist/tmux.h:1.3
--- src/external/bsd/tmux/dist/tmux.h:1.2 Fri Aug 19 05:06:05 2011
+++ src/external/bsd/tmux/dist/tmux.h Fri Sep 16 21:50:08 2011
@@ -1,4 +1,4 @@
-/* $Id: tmux.h,v 1.2 2011/08/19 09:06:05 christos Exp $ */
+/* $Id: tmux.h,v 1.3 2011/09/17 01:50:08 christos Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <[email protected]>
@@ -789,6 +789,7 @@
};
/* Child window structure. */
+struct window_utmp;
struct window_pane {
u_int id;
@@ -832,6 +833,8 @@
const struct window_mode *mode;
void *modedata;
+ struct window_utmp *utmp;
+
TAILQ_ENTRY(window_pane) entry;
RB_ENTRY(window_pane) tree_entry;
};
@@ -2067,4 +2070,8 @@
int printflike3 xsnprintf(char *, size_t, const char *, ...);
int xvsnprintf(char *, size_t, const char *, va_list);
+/* utmp.c */
+struct window_utmp *utmp_create(const char *);
+void utmp_destroy(struct window_utmp *);
+
#endif /* TMUX_H */
Index: src/external/bsd/tmux/dist/window.c
diff -u src/external/bsd/tmux/dist/window.c:1.3 src/external/bsd/tmux/dist/window.c:1.4
--- src/external/bsd/tmux/dist/window.c:1.3 Wed Aug 17 14:48:36 2011
+++ src/external/bsd/tmux/dist/window.c Fri Sep 16 21:50:09 2011
@@ -1,4 +1,4 @@
-/* $Id: window.c,v 1.3 2011/08/17 18:48:36 jmmv Exp $ */
+/* $Id: window.c,v 1.4 2011/09/17 01:50:09 christos Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <[email protected]>
@@ -629,6 +629,7 @@
xfree(wp->shell);
if (wp->cmd != NULL)
xfree(wp->cmd);
+ utmp_destroy(wp->utmp);
xfree(wp);
}
@@ -718,6 +719,8 @@
window_pane_read_callback, NULL, window_pane_error_callback, wp);
bufferevent_enable(wp->event, EV_READ|EV_WRITE);
+ wp->utmp = utmp_create(wp->tty);
+
return (0);
}
Added files:
Index: src/external/bsd/tmux/dist/utmp.c
diff -u /dev/null src/external/bsd/tmux/dist/utmp.c:1.1
--- /dev/null Fri Sep 16 21:50:09 2011
+++ src/external/bsd/tmux/dist/utmp.c Fri Sep 16 21:50:08 2011
@@ -0,0 +1,167 @@
+/* $NetBSD: utmp.c,v 1.1 2011/09/17 01:50:08 christos Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: utmp.c,v 1.1 2011/09/17 01:50:08 christos Exp $");
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <syslog.h>
+#include <string.h>
+#include <time.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <util.h>
+#include <paths.h>
+
+#ifdef SUPPORT_UTMP
+#include <utmp.h>
+#endif
+#ifdef SUPPORT_UTMPX
+#include <utmpx.h>
+#endif
+
+#include "tmux.h"
+
+struct window_utmp {
+#ifdef SUPPORT_UTMP
+ struct utmp ut;
+#endif
+#ifdef SUPPORT_UTMPX
+ struct utmpx utx;
+#endif
+};
+
+#ifdef SUPPORT_UTMPX
+static void
+login_utmpx(struct utmpx *utmpx, const char *username, const char *hostname,
+ const char *tty, const struct timeval *now)
+{
+ const char *t;
+
+ (void)memset(utmpx, 0, sizeof(*utmpx));
+ utmpx->ut_tv = *now;
+ (void)strncpy(utmpx->ut_name, username, sizeof(utmpx->ut_name));
+ if (hostname)
+ (void)strncpy(utmpx->ut_host, hostname, sizeof(utmpx->ut_host));
+ (void)strncpy(utmpx->ut_line, tty, sizeof(utmpx->ut_line));
+ utmpx->ut_type = USER_PROCESS;
+ utmpx->ut_pid = getpid();
+ t = tty + strlen(tty);
+ if ((size_t)(t - tty) >= sizeof(utmpx->ut_id)) {
+ (void)strncpy(utmpx->ut_id, t - sizeof(utmpx->ut_id),
+ sizeof(utmpx->ut_id));
+ } else {
+ (void)strncpy(utmpx->ut_id, tty, sizeof(utmpx->ut_id));
+ }
+ (void)pututxline(utmpx);
+ endutxent();
+}
+
+static void
+logout_utmpx(struct utmpx *utmpx, const struct timeval *now)
+{
+ utmpx->ut_type = DEAD_PROCESS;
+ utmpx->ut_tv = *now;
+ utmpx->ut_pid = 0;
+ (void)pututxline(utmpx);
+ endutxent();
+}
+#endif
+
+#ifdef SUPPORT_UTMP
+static void
+login_utmp(struct utmp *utmp, const char *username, const char *hostname,
+ const char *tty, const struct timeval *now)
+{
+ (void)memset(utmp, 0, sizeof(*utmp));
+ utmp->ut_time = now->tv_sec;
+ (void)strncpy(utmp->ut_name, username, sizeof(utmp->ut_name));
+ if (hostname)
+ (void)strncpy(utmp->ut_host, hostname, sizeof(utmp->ut_host));
+ (void)strncpy(utmp->ut_line, tty, sizeof(utmp->ut_line));
+ login(utmp);
+}
+
+static void
+logout_utmp(struct utmp *utmp, const struct timeval *now)
+{
+ logout(utmp->ut_line);
+}
+#endif
+
+struct window_utmp *
+utmp_create(const char *tty)
+{
+ struct window_utmp *wu;
+ struct timeval tv;
+ char username[LOGIN_NAME_MAX];
+
+ if (getlogin_r(username, sizeof(username)) == -1)
+ return NULL;
+
+ if ((wu = malloc(sizeof(*wu))) == NULL)
+ return NULL;
+
+ tty += sizeof(_PATH_DEV) - 1;
+
+ (void)gettimeofday(&tv, NULL);
+#ifdef SUPPORT_UTMPX
+ login_utmpx(&wu->utx, username, "tmux", tty, &tv);
+#endif
+#ifdef SUPPORT_UTMP
+ login_utmp(&wu->ut, username, "tmux", tty, &tv);
+#endif
+ return wu;
+}
+
+void
+utmp_destroy(struct window_utmp *wu)
+{
+ struct timeval tv;
+
+ if (wu == NULL)
+ return;
+
+ (void)gettimeofday(&tv, NULL);
+#ifdef SUPPORT_UTMPX
+ logout_utmpx(&wu->utx, &tv);
+#endif
+#ifdef SUPPORT_UTMP
+ logout_utmp(&wu->ut, &tv);
+#endif
+}