Emacs の init.el でネットワークインターフェイスにアドレスが付いているときだけある関数を実行したいときはどーするんだ、という疑問からリファレンスを引き引き作ってみた。
まず、Emacs 23.2で使える elisp の標準関数としてnetwork-interface-info
という関数が用意されている。この関数はマニュアルでは下記のように説明されている。
network-interface-info is a built-in function in `C source code'.ようするに引数にネットワークインターフェイスの名前を指定すると、指定したネットワークインターフェイスの情報が取れる、というわけですな。
(network-interface-info IFNAME)
Return information about network interface named IFNAME.
The return value is a list (ADDR BCAST NETMASK HWADDR FLAGS),
where ADDR is the layer 3 address, BCAST is the layer 3 broadcast address,
NETMASK is the layer 3 network mask, HWADDR is the layer 2 addres, and
FLAGS is the current flags of the interface.
で、今回はあるネットワークインターフェイスにアドレスが付いているときに特定の処理をしたいので、以下のような処理をどこかに噛ます必要があります。(currnet-network-interface-name
はネットワークインターフェイスの名前)
(if (car (network-interface-info currnet-network-interface-name))
(progn
;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
)
Emacs 23.2にはnetwork-interface-list
という関数が用意されていて、この関数を使えば、ネットワークインターフェイスのリストが取れるようなことが書いてあるんだけど、僕の環境ではちゃんと意図したとおりの結果を返してくれなかった。というわけで、ネットワークインターフェイスのリストは自前で定義して下記のようにしました。
(setq network-interface-names '("en0" "en1")) ; ネットワークインターフェイスの名前のリスト
(while network-interface-names
(setq currnet-network-interface-name (car network-interface-names))
(if (car (network-interface-info currnet-network-interface-name))
(progn
;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
(setq network-interface-names ())))
(setq network-interface-names (cdr network-interface-names)))
まぁ、こんなもんでしょ。
0 件のコメント:
コメントを投稿