change_symlink_owner()

ファイルの属性、時間、オーナーを変更する関数を追加しました。
file_status.cppの差分
extract.cppの差分
これで、extract.cppも#ifdefの分岐がなくなりました。
簡単な説明、デザインの論拠とかを書いておきます。

// ファイルの属性とパーミッションを変更する
void file_mode(const path& p, file_attributes attr, file_permissions perm);

POSIXのファイルモードをファイル属性とパーミッションに分けてしまったので、2つを渡す形になりました。
Windowsでは、パーミッションを無視します。

// 最終更新時間を変更する
void last_write_time(const path& p, const timestamp& new_time);

// 最終アクセス時間を変更する
void last_access_time(const path& p, const timestamp& new_time);

// ファイル作成時間を変更する
void creation_time(const path& p, const timestamp& new_time);

Boost.Filesystemに似た形式で、3つの時間を個別に設定するようにしました。
creation_time()はPOSIXでは何もしません。

// ファイルのオーナー/グループを変更する
void change_owner(
    const path& p,
    const optional<intmax_t>& new_uid,
    const optional<intmax_t>& new_gid);

// シンボリックリンクのファイルのオーナー/グループを変更する
void change_symlink_owner(
    const path& p,
    const optional<intmax_t>& new_uid,
    const optional<intmax_t>& new_gid);

uidとgidをバラバラに変更すると少し意味が変わってくるので、こちらは同時に設定します。
ただ、完全にPOSIX専用のインターフェースなのが気になります。
Windowsでファイルのオーナーを変更したい場合にほとんど遭遇したことがないので、とりあえずWindowsだと何もしません。