socket optionについて

89 views
Skip to first unread message

syuju

unread,
May 31, 2013, 12:17:37 PM5/31/13
to haske...@googlegroups.com
こんばんは。
syujuです。

今回はnetworkパッケージのsocket optionについてご相談があります。

プロセス間通信にdbusパッケージを使用したいと思っているのですが、このパッケージはLinux向けに書かれているようでFreeBSDにインストールしようとすると失敗します。
失敗の原因は、networkパッケージで定義される関数getPeerCredが、Linuxを前提にしているためです。
*getPeerCred: (通信相手のprocessID,userID,groupIDを取得する関数)

getPeerCredは、内部でc_getsockopt(C関数)の引数にSO_PEERCREDを指定して呼び出し、値を取得しています。

SO_PEERCREDはFreeBSDでは存在せず、代わりにLOCAL_PEERCREDを使用する必要があります。
(取得できる構造体もucredとxucredで異なります)

そこで、dbusパッケージを改造し、getPeerCredの代わりに直接getSocketOptionに引数を指定してuserIDを取得したいのですが、networkパッケージでは、getSocketOptionの引数としてSO_PEERCREDおよびLOCAL_PEERCREDが用意されていません。
*dbusパッケージ内ではuserIDのみ使用しているようです

現在は、dbusパッケージのgetPeerCred呼び出し部分を、networkパッケージのgetPeerCred関連部分を改造した関数(LOCAL_PEERCRED:FreeBSD専用)に置き換えてプログラムをビルドしていますが、このままの状況だとdbusパッケージのバージョンアップに自分で追随する必要があります・・・。

出来れば、networkパッケージの管理者様にgetSocketOptionの仕様を直してもらいたいのですが、管理者様に直訴して良いものなんでしょうか?
(とりあえず自分なりにパッチを作って、それを送った方がいいのでしょうか)
getSocketOptionLOCAL_PEERCREDが使用できるようになったら、次はdbusパッケージの管理者様にgetPeerCredの代わりにgetSocketOptionを使うようにお願いしたいと思っています・・・。
*もしかしたら、getSocketOptionを変更するよりgetPeerCredをFreeBSDにも対応させた方が良いのかもしれません・・・。

あまりオープンソースに関わってこなかったので、このような場合どうすべきか分かりません。
すみませんが、またアドバイスをお願いします。 m (_ _) m

Kazu Yamamoto

unread,
Jun 1, 2013, 7:33:07 AM6/1/13
to haske...@googlegroups.com
山本です。

https://github.com/haskell/network に pull req を送れば、Johan がマージします。放置されたら、教えて下さい。少なくとも僕がマージしてと言えばマージされます。


2013/6/1 syuju <tetsuya...@gmail.com>

--
このメールは Google グループのグループ「haskell-jp」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、haskell-jp+...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

Kazu Yamamoto

unread,
Jun 1, 2013, 7:34:48 AM6/1/13
to haske...@googlegroups.com
ちなみに、Haskell からは Linux か FreeBSD か気にせず使えるようになっていて欲しいので、そういう API を提案して下さい。


2013/6/1 Kazu Yamamoto <kazu.y...@gmail.com>
Message has been deleted

syuju

unread,
Jun 2, 2013, 10:15:04 AM6/2/13
to haske...@googlegroups.com
山本様

syujuです。
アドバイスありがとうございます。

getPeerCredをFreeBSDに対応させる方針で改造したいと思います。

参考になりそうなソースを見つけたので、このような感じで改造したいと思います。

update_client_creds(int s, kcm_client *peer)
(中略)
#ifdef GETPEEREID
    /* FreeBSD, OpenBSD */
    {
	uid_t uid;
	gid_t gid;

	if (getpeereid(s, &uid, &gid) == 0) {
	    peer->uid = uid;
	    peer->gid = gid;
	    peer->pid = 0;
	    return 0;
	}
    }
#endif
#ifdef SO_PEERCRED
    /* Linux */
    {
	struct ucred pc;
	socklen_t pclen = sizeof(pc);

	if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void *)&pc, &pclen) == 0) {
	    peer->uid = pc.uid;
	    peer->gid = pc.gid;
	    peer->pid = pc.pid;
	    return 0;
	}
    }
#endif
(略)

*今更ですが、FreeBSDにはgetpeereidという関数があるようなので、socket optionではなく、こちらを使ってみたいと思います。

改造が終わりましたら、こちらでコードを公開したいと思います。
その折には、アドバイス頂けますと助かります。 m (_ _) m

syuju

unread,
Jun 3, 2013, 12:03:33 PM6/3/13
to haske...@googlegroups.com
syujuです。

networkパッケージのgetPeerCredをFreeBSDに対応させてみました。
改造の仕様は前回の記事の通りです。
getPeerCred関数をFreeBSDでも使えるように変更しましたが、戻り値のprocessIDは常に0になります。
ついでにGETPEEREID(3)に対応するプラットホームでは、getPeerEid関数が使えるようになります。(追加しました)


gitの使い方もあまり理解していないので、とりあえずコミットしただけですが、何かアドバイス頂けると嬉しいです。m( _ _ )m
Linuxが手元にないので、Linuxではテストできていません・・・。
宜しければ、どなたかご確認頂けると助かります。
(今回の改造はLinuxに影響を与えないはずなので、そのことが確認できると助かります)

理解していないことが多いので、いろいろと心配です。
問題点等を指摘して頂けると助かります。 m( _ _ )m

ちなみに、cabalのバージョン番号を変更していませんが、変えてからpullリクエストした方がいいのでしょうか?

syuju

unread,
Jun 4, 2013, 10:31:39 AM6/4/13
to haske...@googlegroups.com
syujuです。

githubでpull requestする場合の手順を調べながら、再度リポジトリをフォークしなおしました。
もし、cloneしていた方はすみません。

自己レスですが、他の方のpull requestを参考にしましたが、バージョン番号を変える為だけにcabalファイルを送信する必要はないようです。(むしろ、送信してはいけない空気を感じます・・・)

とりあえず、pull requestを送って先方のご指示を仰ぎたいと思います。

皆様、お騒がせしました。
また何かありましたら、ご相談させて頂きます。 m( _ _)m

Reply all
Reply to author
Forward
0 new messages