2012年2月21日火曜日

PHP FUSEで関数呼び出しにUIDとGIDを付与したい


前エントリの通り、ユーザーのUIDやGIDに応じた処理を実装するには、全関数呼び出しについて引数にユーザーのUIDとGIDを付与してやる必要があるようです。というわけで、また魔改造してみました。

■改造場所
php_fuse_call_methodの中で、付いてない引数を勝手にねつ造します。

■改造内容(強引ですが)
HashTable *function_table; の直後に
uid_t uid;
gid_t gid;
uid = fuse_get_context()->uid;
gid = fuse_get_context()->gid;
zval *arg_uid;
zval *arg_gid;
MAKE_STD_ZVAL(arg_uid);
ZVAL_LONG(arg_uid, uid);
MAKE_STD_ZVAL(arg_gid);
ZVAL_LONG(arg_gid, gid);

-zval ***params = emalloc(sizeof(zval**) * (param_count));
+zval ***params = emalloc(sizeof(zval**) * (param_count+2));

va_end(va_params); の直後に
*(params+param_count) = &arg_uid;
*(params+param_count+1) = &arg_gid;
param_count = param_count+2;

efree(params); の直後に
zval_ptr_dtor(&arg_uid);
zval_ptr_dtor(&arg_gid);

■使い方
こんな感じで、全関数でUID/GIDを取得できるようになりました。
(変更前)function mknod($path, $mode, $dev)
(変更後)function mknod($path, $mode, $dev, $uid, $gid)


全然テストしてませんけど、一応動いてるみたいなんで、これでいいやw

0 件のコメント: