summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authorocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-10 22:48:43 +0000
committerocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-10 22:48:43 +0000
commitfa9a6a96e112313868f4b8623a7bdf2a5c7181d1 (patch)
tree9ba558cd06e443d82d42d53d9a1fbc58aa679900 /file.c
parentdad44811e2235abd7db463f0ef0bbf5372265187 (diff)
* configure.in: undef HAVE_LINK on BeOS. (link(2) always returns
EINVAL, and this causes error in test/fileutils.) * file.c: overwride chown(2) and fchown(2) on BeOS. (these functions should not change user/group id if -1 is passed as corresponding argument, and this causes error in test/fileutils too) [ruby-dev:27672] * file.c (rb_file_s_link): checks HAVE_LINK. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@9524 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/file.c b/file.c
index 898c8009aa..decb5ba81e 100644
--- a/file.c
+++ b/file.c
@@ -71,6 +71,33 @@ char *strrchr _((const char*,const char));
# 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;
@@ -1957,6 +1984,7 @@ static VALUE
rb_file_s_link(klass, from, to)
VALUE klass, from, to;
{
+#ifdef HAVE_LINK
SafeStringValue(from);
SafeStringValue(to);
@@ -1964,6 +1992,10 @@ rb_file_s_link(klass, from, to)
sys_fail2(from, to);
}
return INT2FIX(0);
+#else
+ rb_notimplement();
+ return Qnil; /* not reached */
+#endif
}
/*