続々々々アレ

fopen(3) の第二引数を "rb" にした理由が判った。"rb+" だとユーザに書き込み権限の無いファイルがオープンできないからだ。これ書いてると情け無くなるね。
結局、最初に "rb+" で fopen(3) して、エラーだったら "rb" で fopen(3) する様にした。つーか、最初からそうしておけよ。

FILE *
file_open(const char *filename)
{
    FILE *fp;

    fp = fopen(filename, "rb+");
    if (fp)
        return fp;
    return fopen(filename, "rb");
}