理系学生日記

おまえはいつまで学生気分なのか

perlxstut Example 5

書いてあることをそのままするだけなので当然なんだけど、テストがうまく通ると嬉しいなー。
というわけで、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 を作成する。