[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:6834] 環境変数 LOGNAME とuser-login-name
- X-ml-count: 6834
- Subject: [MD:6834] 環境変数 LOGNAME とuser-login-name
- From: Shun-ichi GOTO <gotoh@xxxxxxxxxxx>
- Date: Fri, 16 Sep 2005 22:25:37 +0900 (JST)
- X-mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI)
ticket:152の件です。
ticket:152は明示的なLOGNAME 指定によりwindows ログイン名と
違う名前を与えた場合の問題です。
まず背景説明:
* LOGNAMEの本来の意味はUNIXにおいてはログインしたユーザ名として
login 時に設定されます。それは実在するアカウントであるのが当然です。
* su した場合、LOGNAMEは変わらず、HOMEは変わります。そのためemacs は su
時もログインしたユーザの. emacs を読むために $HOMEを使用せずに
(expand-file-name "~user/.emacs") を使おうとします。
このsu した状態を判定するために (user-login-name) と
(user-real-login-name)を比較して、違えばsu した状態とみなします。
# ちなみに su - した場合はLOGNAME, HOME共に変わりますし、$HOME/.emacs
# を読むので問題はない。
* (user-login-name)は user-login-name 変数の値であり、環境変数 LOGNAME
の値、環境変数 USERNAME (unix ではUSER)の値、さもなくば geteuid()から
求めたパスワードエントリのログイン名(つまりWindows ログイン名)の順に
求めたユーザ名で初期化されます。
* (user-real-login-name)は user-real-login-name の値であり、getuid()か
ら求めたパスワードエントリのログイン名(つまりWindows ログイン名)で初
期化されます。
* Windows においてLOGNAME は存在しませんが、USERNAME が相当します。
この変数はログインダイアログでログインした際のユーザ名です。
* Windows において本来LOGNAMEは使われませんが、RCSなどの一部のプログラ
ムがそれを利用することがあります。Windows ログイン名に不都合がある
場合などにそれを設定する人がいます。
そういう背景において、LOGNAMEをWindows ログイン名と違う名前で設定した場
合、(user-login-name) と (user-real-login-name)が違うということになり、
UNIX での su したときと同じ振舞いとなり、LOGNAME で指定されたユーザのホー
ムディレクトリから.emacs を読もうとします。まずこれが1つの不都合。
次に上記を許容したとしても、現在のmeadow のgetpwnam()などの実装は、他の
ユーザのホームディレクトリを得ることは出来ません。そのため以下のように
なります。
(expand-file-name "~/.emacs")
=> "/users/gotoh/.emacs"
(expand-file-name "~gotoh/.emacs")
=> "/users/gotoh/.emacs"
(expand-file-name "~ggg/.emacs") ;; 存在しないアカウントの場合
=> "/users/gotoh/~ggg/.emacs" ;; これ自体は使用通りともいえる
(expand-file-name "~postgres/.emacs") ;; Windows で存在するアカウントの場合
=> "/users/gotoh/~postgres/.emacs" ;; これはちゃんといって欲しいところ
で、結局ticket:152のように、LOGNAMEを指定すると、それが実在するユーザア
カウントであってもなくても .emacs が開けずにエラーということになります。
で、本題なのですが、user-login-name として環境変数 LOGNAME の値を使用す
るのは本家Emacs のコードがそうなっているからなのですが、さて、これは必要
なことでしょうか? USERNAME ならまだしもLOGNAME に左右されるのは不必要な
UNIX互換性のように思えます。
Meadow として打てる手としては以下が考えられるかと思う
(1) LOGNAMEからユーザ名を得るのを止める
(2) 存在するアカウントであれば(expand-file-name "~user")が正しく動作す
るようにしたうえで、そのWindowsアカウントのホームフォルダを適切な
ものに設定してもらう。
(3) UNIXと違って、su の挙動はないため、.emacs は常に$HOMEから
読むようにする。
(4) なにも修正はしない。.emacs 読み込みの問題は起動時の -user
オプションで回避してもらう。漢字ログイン名だったりするとヤバイ
かも知れないけど。
さて、どうするのが良いでしょうか。
少なくとも現状は中途半端な気がしてます。
私的には (3) もしくは(1)が妥当な気がしてます。
さもなくば (2)
--- Regards,
Shun-ichi Goto <gotoh@xxxxxxxxxxx>
R&D Group, TAIYO Corp., Tokyo, JAPAN