書いてあることをそのままするだけなので当然なんだけど、テストがうまく通ると嬉しいなー。
というわけで、statfs(2) を Perl から呼び出すための XS。Mac の場合は sys/param.h と sys/mount.h の include が必要。
void statfs(path) char * path INIT: int i; struct statfs buf; PPCODE: i = statfs(path, &buf); if ( i == 0 ) { XPUSHs( sv_2mortal( newSVnv( buf.f_bavail ) ) ); // free blocks avail to non-superuser XPUSHs( sv_2mortal( newSVnv( buf.f_bfree ) ) ); // free blocks in fs XPUSHs( sv_2mortal( newSVnv( buf.f_blocks ) ) ); // total data blocks in fs XPUSHs( sv_2mortal( newSVnv( buf.f_bsize ) ) ); // fundamental file system block size XPUSHs( sv_2mortal( newSVnv( buf.f_ffree ) ) ); // free file nodes in fs XPUSHs( sv_2mortal( newSVnv( buf.f_files ) ) ); // total file nodes in fs XPUSHs( sv_2mortal( newSVnv( buf.f_type ) ) ); // type of file system (reserved) } else { XPUSHs( sv_2mortal( newSVnv( errno ) ) ); }
XPUSHs
スタックを自動的に拡張しつつ、SV をスタックに積んでいくためのマクロ。EXTEND マクロと PUSHs マクロで代用することも可能。
sv_2mortal
引数の SV を "mortal" とする。mortal とされた SV は、Perl レベルの 1 文が終了した後にリファレンスカウントがデクリメントされる。詳細は perlguts の "Reference Counts and Mortality" を参照。
newSVnv
浮動小数点数を持った SV を作成する。