[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:6834] 環境変数 LOGNAME とuser-login-name



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