LD_PRELOAD で実効グループをごまかす

最近、Dual Core Opteron のマルチCPUなマシンが4台導入された。
で、分散処理の環境として、Sun の SGE(Sun N1 Grid Engine)というのが導入されているのだが、こいつの管理ツールがユーザの実効グループ(egid)を参照してグループ名を取得しようとするらしく*1、なぜだが primary GID に対応するエントリが /etc/group にない自分はこの時点で "unable to resolve group name for group ID, XXXX" とか言われて実行できない。
しかたが無いので管理者にメール出して primary group id を修正してもらうか、対応するグループを追加してもらおうと思ったんだが、そこでふと思いついた。getegid を定義した共有ライブラリを作って LD_PRELOAD に指定すればごまかせるんじゃないか?
ってことでやってみた。ソースコードMakefile.am, configure.ac はこんな感じ。

% cat fakegetegid.c
#include <sys/types.h>

gid_t getegid()
{
    return 1101;
}

% cat Makefile.am
lib_LTLIBRARIES = libfakegetegid.la
libfakegetegid_la_SOURCES = fakegetegid.c

% cat configure.ac
AC_PREREQ(2.59)
AC_INIT(libfakegetegid, 0.1, NONE)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([fakegetegid.c])
AC_PROG_CXX
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_LIBTOOL
AC_TYPE_UID_T
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

で、ビルドしてやってみる。

% touch INSTALL NEWS README AUTHORS ChangeLog
% aclocal && libtoolize && aclocal && automake -a -c && autoconf
% ./conigure --prefix=$HOME && make install
% qstat
unable to resolve group name for group ID, 1501
% LD_PRELOAD=$HOMElib/libfakegetegid.so qstat
% 

おお、いけた。ちゃんと qsub でのジョブの投入もできる。
まぁ、やっておいていうのもなんだけど、やりすぎの感は否めないので、あとで管理者にメールを出して group ID を修正してもらおう。
ていうか、よくよく考えるとソースがあるんだからソースをいじるという手もあったのか。まぁ、気にしないことにする。ビルドの方法確認するのも面倒だしな。

*1:strace/ltraceを使いつつ、ソースを読んで確認した