From: "H.Yamamoto" Date: 2005-11-11T00:24:01+09:00 Subject: [ruby-dev:27672] BeOS patch for chown 山本です。 [ruby-dev:27230] で無視することにしたエラーですが、やっぱり対処できる範囲で 対処しておくことにしました。最初のエラーはこんな感じで解消することを確認しま した。 Index: file.c =================================================================== RCS file: /src/ruby/file.c,v retrieving revision 1.169.2.28 diff -u -r1.169.2.28 file.c --- file.c 6 Nov 2005 11:18:57 -0000 1.169.2.28 +++ file.c 10 Nov 2005 12:46:43 -0000 @@ -71,6 +71,34 @@ # define fseeko fseek #endif +#ifdef __BEOS__ /* should not change ID if -1 */ + +static int be_chown(const char *path, uid_t owner, gid_t group) +{ + if (owner == -1 || group == -1) { + struct stat st; + if (stat(path, &st) < 0) return -1; + if (owner == -1) owner = st.st_uid; + if (group == -1) group = st.st_gid; + } + return chown(path, owner, group); +} +#define chown be_chown + +static int be_fchown(int fd, uid_t owner, gid_t group) +{ + if (owner == -1 || group == -1) { + struct stat st; + if (fstat(fd, &st) < 0) return -1; + if (owner == -1) owner = st.st_uid; + if (group == -1) group = st.st_gid; + } + return fchown(fd, owner, group); +} +#define fchown be_fchown + +#endif /* __BEOS__ */ + VALUE rb_cFile; VALUE rb_mFileTest; static VALUE rb_cStat; そして二番目のエラーなのですが、BeOS でだけ HAVE_LINK が 定義されないようにする方法ってあるでしょうか? link を置き換えて rb_notimplement() を呼ぶようにするとか、 #if defined(HAVE_LINK) && !defiend(__BEOS__) にするとか、 他にも方法は思いつくのですが、どうせ BeOS の link は常に EINVALを返す実装なので、元々持たないことにしてしまうのが 一番確実に思えました。 # それは chown についても言えそうですが、こちらの場合は # シングルユーザOSで意味があるのか疑問であるにせよ、 # ファイルシステム上で確かにユーザID、グループIDが変化しているので # 上のように対処することにしました。