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

MacPorts, NFS上のファイルへのchflagsに失敗する

80 views
Skip to first unread message

Yasushi Shinjo

unread,
Mar 26, 2010, 7:13:18 AM3/26/10
to
新城@筑波大学情報です。こんにちは。

MacOSX 10.6 Snow Leopard で MacPorts 使っています。コマンド
等の置場所を NFS にすると、install 時に失敗します。たとえば、
こんな感じで。

------------------------------------------------------------
# port activate pstree
---> Activating pstree Error: port activate failed: could not set flags for
file "/usr/local3/share/doc/pstree-2.33": operation not supported
#
------------------------------------------------------------

内部的には、こんな事をしているのではないかと思います。
------------------------------------------------------------
# chflags uchange /usr/local3/share/doc/pstree-2.33
chflags: /usr/local3/share/doc/pstree-2.33: Operation not supported
#
------------------------------------------------------------

この問題を誤魔化すような方法は、ないでしょうか。たとえば、
chflags を実行しないようにするとか。

試しに、MacPorts のソースコードで chflags システムコールを実
行している所を外してみたりはしたのですが、効果ありませんでし
た。src/pextlib1.0/xinstall.c を書き換えて、Pextlib.dylib を
置換えたのですが、ダメでした。

------------------------------------------------------------
% nm Pextlib.dylib,orig,2010-03-26 | egrep chflags
U _chflags
U _fchflags
% nm Pextlib.dylib | egrep chflags
%
------------------------------------------------------------

Tcl に強い人、何かヒントがあれば教えてください。MacPorts の
本体は、tclsh8.5 で動いています。

NFS サーバは、NAS (NetApp) です。

chflags は、FreeBSD 由来のコマンドだと思いますが、その辺りで
も何か情報ありませんか。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

tesi...@diary.ocn.ne.jp

unread,
Mar 26, 2010, 11:26:37 PM3/26/10
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> この問題を誤魔化すような方法は、ないでしょうか。たとえば、
> chflags を実行しないようにするとか。

空の chflags 関数を作って ELF ライブラリにして、
それを環境変数 LD_PRELOAD に指定する、
というのはどうですか。
BSD 系でこの技が使えるか分かりませんが…

Yasushi Shinjo

unread,
Mar 28, 2010, 11:47:36 PM3/28/10
to
新城@筑波大学情報です。こんにちは。

In article <hojtti$nfh$1...@speranza.aioe.org>


tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> > この問題を誤魔化すような方法は、ないでしょうか。たとえば、
> > chflags を実行しないようにするとか。
> 空の chflags 関数を作って ELF ライブラリにして、
> それを環境変数 LD_PRELOAD に指定する、
> というのはどうですか。

なるほど。その手がありましたね。試してみた所、うまく行きまし
た。ありがとうございました。

動的リンクライブラリを置換える方法としては、次の Web ページ
を参考にしました。

http://d.hatena.ne.jp/eagletmt/20080726/1217085814

実際に作ったのは、次のような C のプログラムです。

------------------------------------------------------------
% cat chflags.c
/*
* fake chflags(2) and fchflags(2) to run port on NFS
*/

#include <sys/stat.h>
#include <unistd.h>

int
chflags(const char *path, __uint32_t flags)
{
return( 0 );
}

int
fchflags(int fd, __uint32_t flags)
{
return( 0 );
}

int
lchflags(const char *path, __uint32_t flags)
{
return( 0 );
}
%
------------------------------------------------------------

Makefile も作ってみました。cc -shared -fPIC -o chflags.dylib
chflags.c でいいんですけれど。

------------------------------------------------------------
% cat Makefile
#
#
#

all: chflags.dylib

chflags.dylib: chflags.c
$(CC) -shared -fPIC -o $@ $<

%
------------------------------------------------------------

うちでは、できあがったものを
/usr/local3/lib/dummy-chflags/chflags.dylib に置きました。

------------------------------------------------------------
% ls -l /usr/local3/lib/dummy-chflags/chflags.dylib
-rwxr-xr-x 1 root admin 4304 3 29 12:31
/usr/local3/lib/dummy-chflags/chflags.dylib
% nm /usr/local3/lib/dummy-chflags/chflags.dylib
0000000000000000 t __mh_dylib_header
0000000000000ecb T _chflags
0000000000000edd T _fchflags
0000000000000eee T _lchflags
U dyld_stub_binder
%
------------------------------------------------------------

シェルスクリプトを作りました。

------------------------------------------------------------
% cat /usr/local3/bin/run-no-chflags
#!/bin/sh

export DYLD_INSERT_LIBRARIES=/usr/local3/lib/dummy-chflags/chflags.dylib
export DYLD_FORCE_FLAT_NAMESPACE=YES

$@
%
------------------------------------------------------------

このシェルスクリプトは、次のように、引数に実行したいコマンド
を与えて使います。
------------------------------------------------------------
# run-no-chflags port activate pstree
---> Activating pstree
#
------------------------------------------------------------

In article <hojtti$nfh$1...@speranza.aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> BSD 系でこの技が使えるか分かりませんが…

やってみると、MacOSX でもこのくらいなら比較的簡単でしたね。
引数を変えながら同じ名前の関数を呼ぶとかしようとすると、また
面倒なのかもしれませんけれど。

0 new messages