Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ioctl を呼び出す度に strcpy で値を設定している理由

179 views
Skip to first unread message

Naoki Saito

unread,
Oct 17, 2001, 2:35:28 AM10/17/01
to linux...@linux.or.jp
斉藤と申します。

ifconfig コマンドのソースコードを読んでいて気付いたのですが、
interface.c の if_fetchという関数内では

strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
return (-1);
ife->flags = ifr.ifr_flags;

strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
memset(ife->hwaddr, 0, 32);
else
memcpy(ife->hwaddr, ifr.ifr_hwaddr.sa_data, 8);

のように、ioctl を呼び出す度に、その直前で strcpy により
ifreq 構造体の ifr_name に値をセットしています。

前と同じデバイスについての情報を取り出すような場合、
一度セットすれば2度目以降のstrcpy呼び出しは必要ないように
思うのですが、何か理由でもあるのか良くわかりません。

実際2、3箇所ほどコメントアウトしましたが出力結果に変化は
見られませんでした。

理由についてどなたかご存知の方はいらっしゃいますでしょうか。

ちなみに使用環境は Debian/GNU Linux 2.2(potato)で、
ソースコードは apt-get source netbase として得られたものを
使用しています。

話題自体はDebianに限った話ではないと思い
こちらに投稿させていただきました。
(Linux に限った話でもないかもしれませんが)

Akira Hatakeyama

unread,
Oct 17, 2001, 2:48:02 AM10/17/01
to linux...@linux.or.jp
On Wed, Oct 17, 2001 at 03:35:28PM +0900, Naoki Saito wrote:
> ifconfig コマンドのソースコードを読んでいて気付いたのですが、
> interface.c の if_fetchという関数内では
>
> strcpy(ifr.ifr_name, ifname);
> if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
> return (-1);
> ife->flags = ifr.ifr_flags;
>
> strcpy(ifr.ifr_name, ifname);
> if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
> memset(ife->hwaddr, 0, 32);
> else
> memcpy(ife->hwaddr, ifr.ifr_hwaddr.sa_data, 8);
>
> のように、ioctl を呼び出す度に、その直前で strcpy により
> ifreq 構造体の ifr_name に値をセットしています。
>
> 前と同じデバイスについての情報を取り出すような場合、
> 一度セットすれば2度目以降のstrcpy呼び出しは必要ないように
> 思うのですが、何か理由でもあるのか良くわかりません。

ioctlで、パラメタの内容を変えない、という保証が無いからでは?

> 実際2、3箇所ほどコメントアウトしましたが出力結果に変化は
> 見られませんでした。

たまたま、SIOCGIFHWADDRでは変わらないからでしょう。

> (Linux に限った話でもないかもしれませんが)

一般的なプログラミングの話ですね。

--
Akira Hatakeyama E-Mail: ak...@sra.co.jp
http://www.sra.co.jp/people/akira/index.html
chigasaki-minami, tsuzuki ward, yokohama, japan

Takashi Higuchi

unread,
Oct 17, 2001, 3:16:48 AM10/17/01
to
CTCの樋口です。
以前、trussやstraceの話題を出したのですが、こっちのスレッドに
レスをつけた方が議論が発展すると思いレスしました。

> ioctlで、パラメタの内容を変えない、という保証が無いからでは?

現在、デバッグしているプログラムはアメリカのとある会社の
販売しているソフトなのでソースコードが見れません。
ですので、trussやstraceで出力されたメッセージからメモリの
使用率などについて削減できるように(つまり、無駄なメモリを
使っていないか調べるために)このコマンドを使っているのですが、
現在、低レベルの関数についてわからないので作業がストップして
います。

ASCII SPARC&Solaris パフォーマンスチューニング
(サンソフトプレスシリーズ)ISBN 4756103111
という書物をSolarisで見つけました。しかし、出版年が
1995年と古く、使い物になるかわかりません。
低レベルの関数についての知識がわからないのですが、
ioctlなどの関数はSolarisでもLinuxでも共通していると思うのです。
現在、Solarisでtrussを使った結果のみテストしていますので
(明日、Linuxで実行します)その結果の抜粋を記載したいと思います。

18702: ioctl(1, TCGETA, 0xFFBED86C) Err#22 EINVAL
18702: ioctl(3, TCGETA, 0xFFBEDE4C) Err#25 ENOTTY

このエラーの意味は何となくはわかるのですが、
実際にどこで出しているか切り分けたいと考えています。
OSが出しているのか、アプリケーションが出しているのか
問題を切り分けたいと思っています。もし、Linuxアプリの
開発でstraceなどのノウハウをお持ちの方、あるいは、
関連書物、関連ホームページ、などをご存じの方アドバイス
お願いします。

--
Takashi Higuchi
ITOCHU TECHNO-SCIENCE CORPORATION
SEMICONDUCTOR AE
EDA SOLUTION SALES DEPT.
NO.4 SALES DIVISION
6-30, AOBADAI 3-CHOME, MEGURO-KU
TOKYO, 153-0042 JAPAN
TEL.+81-3-5728-7018 FAX.+81-3-5728-7009
mailto:t-hi...@ctc-g.co.jp
---

Akira Hatakeyama

unread,
Oct 17, 2001, 3:47:31 AM10/17/01
to
On Wed, Oct 17, 2001 at 04:16:48PM +0900, Takashi Higuchi wrote:
> 低レベルの関数についての知識がわからないのですが、
> ioctlなどの関数はSolarisでもLinuxでも共通していると思うのです。

ioctlとsignal回りはだいたい違っています。

移植するときは、まずこれらが使われているかどうかし調べて、
多数使われていたら、素直に諦めます...

Naoki Saito

unread,
Oct 21, 2001, 9:03:32 PM10/21/01
to linux...@linux.or.jp
斉藤と申します。
すごい遅いリプライになってしまいましたが...

> > 前と同じデバイスについての情報を取り出すような場合、
> > 一度セットすれば2度目以降のstrcpy呼び出しは必要ないように
> > 思うのですが、何か理由でもあるのか良くわかりません。
>
> ioctlで、パラメタの内容を変えない、という保証が無いからでは?

私の質問の仕方がまずかったですね(確かにそうとしか答えようがない)。

しかし、パラメタの内容が変わるにしても、

ioctlでパラメタの値を変更するような処理が入っていて変更されるのか。
そうならばソースなりドキュメントなりを見ればそれがパラメタを
変更するものなのかどうかわかるはずなのでわざわざ strcpyを呼び出す
べきかどうか判断できるはず。

それとも ioctl が誤動作を起こしたときにたまたまパラメタの値を
変更してしまうような事を起こしてしまうのか。そうならばいつパラメタの
値が変更されるかわからないので念のために strcpyを呼び出している。

と、考えてみたのですが結局のところまずはソースを見ないと
何とも言えないのでソースを読んで考えてみることにします。
どうも失礼しました。

> > (Linux に限った話でもないかもしれませんが)
>
> 一般的なプログラミングの話ですね。

確かにそうですね。でも適切なMLってあるのでしょうか?
それとも fj.net.programming あたりとか。

0 new messages