kterm-6.2.0 を以下のような環境で利用していると、 OS: NetBSD-1.1, NetBSD-1.2, FreeBSD-2.2.2 認証方式: MIT-MAGIC-COOKIE-1 その他の条件: ホームディレクトリは別マシンにあり、NFS で マウントしている。NFS サーバは kterm の走行す るマシンに対して、root アクセスを許していない。 ファイル .Xauthority へアクセスできないため、下記のようにエラーが起こ ることがあります。 % ./kterm Xlib: connection to ":0.0" refused by server Xlib: Client is not authorized to connect to Server ./kterm Xt error: Can't open display: :0.0 XFree86-3.2 附属の xterm には、この問題への対策が含まれているので、抜 き出してkterm-6.2.0 に当てました。以下に示すパッチがそれです。 このパッチには、revoke(2) 呼びだしの追加も含まれていますが、これは上の 問題とは関係ありません。ディスクリプタ ttydev を利用するプロセスが残っ ていた場合への対策です。(これも XFree86-3.2 から持ってきたものです。) なお、XFree86-3.2 には、USE_POSIX_TERMIOS という #ifdef 処理も含まれて おり、4.4BSD 系の OS を利用する場合には、この変更も行っておいた方が良 さそうなのですが、以下のパッチには含まれていません。 -- Noriyuki Soda Index: main.c *** main.c 1996/07/12 05:01:38 1.1 --- main.c 1997/06/03 12:02:44 1.3 *************** *** 238,246 **** --- 238,257 ---- #ifdef _POSIX_SOURCE #define USE_POSIX_WAIT + #define HAS_POSIX_SAVED_IDS #endif #ifdef SVR4 #define USE_POSIX_WAIT + #define HAS_POSIX_SAVED_IDS + #endif + + #if !defined(MINIX) && !defined(WIN32) + #include /* for NOFILE */ + #endif + + #if (BSD >= 199103) + #define USE_POSIX_WAIT + #define HAS_POSIX_SAVED_IDS #endif #include *************** *** 1307,1328 **** /* Init the Toolkit. */ XtSetErrorHandler(xt_error); #ifdef KTERM ! toplevel = XtAppInitialize (&app_con, "KTerm", #else /* !KTERM */ ! toplevel = XtAppInitialize (&app_con, "XTerm", #endif /* !KTERM */ optionDescList, XtNumber(optionDescList), &argc, argv, fallback_resources, NULL, 0); ! XtGetApplicationResources(toplevel, (XtPointer) &resource, application_resources, XtNumber(application_resources), NULL, 0); #ifdef __sgi ! if (resource.useLocale) ! setlocale(LC_ALL,""); #endif waiting_for_initial_map = resource.wait_for_map; --- 1318,1367 ---- /* Init the Toolkit. */ XtSetErrorHandler(xt_error); + { + #ifdef HAS_POSIX_SAVED_IDS + uid_t euid = geteuid(); + gid_t egid = getegid(); + uid_t ruid = getuid(); + gid_t rgid = getgid(); + + if (setegid(rgid) == -1) + (void) fprintf(stderr, "setegid(%d): %s\n", + (int) rgid, strerror(errno)); + + if (seteuid(ruid) == -1) + (void) fprintf(stderr, "seteuid(%d): %s\n", + (int) ruid, strerror(errno)); + #endif + + XtSetErrorHandler(xt_error); #ifdef KTERM ! toplevel = XtAppInitialize (&app_con, "KTerm", #else /* !KTERM */ ! toplevel = XtAppInitialize (&app_con, "XTerm", #endif /* !KTERM */ optionDescList, XtNumber(optionDescList), &argc, argv, fallback_resources, NULL, 0); ! XtGetApplicationResources(toplevel, (XtPointer) &resource, application_resources, XtNumber(application_resources), NULL, 0); #ifdef __sgi ! if (resource.useLocale) ! setlocale(LC_ALL,""); ! #endif ! ! #ifdef HAS_POSIX_SAVED_IDS ! if (seteuid(euid) == -1) ! (void) fprintf(stderr, "seteuid(%d): %s\n", ! (int) euid, strerror(errno)); ! ! if (setegid(egid) == -1) ! (void) fprintf(stderr, "setegid(%d): %s\n", ! (int) egid, strerror(errno)); #endif + } waiting_for_initial_map = resource.wait_for_map; *************** *** 2445,2450 **** --- 2484,2492 ---- close (tty); } #endif /* TIOCNOTTY */ + #if (BSD >= 199103) + (void)revoke(ttydev); + #endif if ((tty = open(ttydev, O_RDWR, 0)) >= 0) { #if defined(CRAY) && defined(TCSETCTTY) /* make /dev/tty work */