Unix/Linuxプログラミング理論と実践 第2章(who)

http://www.amazon.co.jp/gp/product/4048700219

良書と評判の本書.FreeBSDで第2章のwhoを実装するにはいくつか対応が必要だった.
環境:FreeBSD 8.2-STABLE

"UTMP_FILE"が無い

UTMPの情報が記載されているファイルを"UTMP_FILE"で指定していて,プログラム中には以下のコメントがある.

/* UTMP_FILEはutmp.hで定義されている */

しかし,/usr/include/utmp.hには"UTMP_FILE"はない.
かわりに下のように定義されているので,"UTMP_FILE"ではなく"_PATH_UTMP"を利用する.

#define	_PATH_UTMP	"/var/run/utmp"

ut_typeが無い

空レコードを排除するために,struct utmpのut_typeメンバを利用している.
しかし,utmp.hのstruct utmpにはut_typeメンバがない.

struct utmp {
	char	ut_line[UT_LINESIZE];
	char	ut_name[UT_NAMESIZE];
	char	ut_host[UT_HOSTSIZE];
	int32_t	ut_time;
};

対応としてはut_nameが空なら読み飛ばせば良い.
FreeBSDのwhoコマンドではこうやって読み飛ばしている(utはstruct utmp).

              if (*ut.ut_name == '\0')
                        continue;