2011-01-16

emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelisp

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 件のコメント: