libutempter を使って kitty で擬似端末の記録を残す

この記事は約3分で読めます。

terminal emulator で評判のよい kitty を使ったとき、who, w, last で見ても擬似端末を使った記録が残らないため、libutempter (実際の記録をするのは utempter というSUIDされた実行ファイル)を使って記録するようにしました。FreeBSD の ports は、https://github.com/kdeguchi/ports/tree/master/x11/kitty に置いてあります。以下の patch は kitty-0.26.4 に対応しています。

--- kitty/child-monitor.c.orig	2022-10-17 02:48:51 UTC
+++ kitty/child-monitor.c
@@ -22,6 +22,7 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <signal.h>
+#include <utempter.h>
 extern PyTypeObject Screen_Type;
 
 #if defined(__APPLE__) || defined(__OpenBSD__)
@@ -239,6 +240,7 @@ add_child(ChildMonitor *self, PyObject *args) {
         return NULL;
     }
 #undef A
+    utempter_add_record(add_queue[add_queue_count].fd, NULL);
     INCREF_CHILD(add_queue[add_queue_count]);
     add_queue_count++;
     children_mutex(unlock);
@@ -1185,6 +1187,7 @@ hangup(pid_t pid) {
 
 static void
 cleanup_child(ssize_t i) {
+    utempter_remove_record(children[i].fd);
     safe_close(children[i].fd, __FILE__, __LINE__);
     hangup(children[i].pid);
 }
--- setup.py.orig	2022-10-19 17:45:56 UTC
+++ setup.py
@@ -528,6 +528,7 @@ def get_source_specific_defines(env: Env, src: str) ->
     if src == 'kitty/parser_dump.c':
         return 'kitty/parser.c', ['DUMP_COMMANDS']
     if src == 'kitty/data-types.c':
+        env.ldflags.append('-lutempter')
         return src, get_vcs_rev_defines(env, src)
     with suppress(KeyError):
         return src, env.library_paths[src]

コメント

タイトルとURLをコピーしました