From e618c1b59debbb9184874a06cbc64b8ac846a0d3 Mon Sep 17 00:00:00 2001 From: Emmanuel Dreyfus Date: Fri, 12 Aug 2011 09:12:27 +0200 Subject: - Use linkat(2) instead of link(2) so that linking to symlink work on non Linux systems - Also use mkfifo to create FIFO on NetBSD: it does not wotk with mknod Change-Id: I19ffd22b4d79009ef5f9d4a50fc6dd556c3c3ff4 BUG: 2923 Reviewed-on: http://review.gluster.com/226 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/storage/posix/src/posix.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'xlators/storage/posix/src/posix.c') diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index dce75e736..9ac400a0c 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -37,6 +37,10 @@ #include #endif /* GF_BSD_HOST_OS */ +#ifdef HAVE_LINKAT +#include +#endif /* HAVE_LINKAT */ + #include "glusterfs.h" #include "md5.h" #include "checksum.h" @@ -779,6 +783,11 @@ posix_mknod (call_frame_t *frame, xlator_t *this, goto out; } +#ifdef __NetBSD__ + if (S_ISFIFO(mode)) + op_ret = mkfifo (real_path, mode); + else +#endif /* __NetBSD__ */ op_ret = mknod (real_path, mode, dev); if (op_ret == -1) { @@ -1526,7 +1535,18 @@ posix_link (call_frame_t *frame, xlator_t *this, goto out; } +#ifdef HAVE_LINKAT + /* + * On most systems (Linux being the notable exception), link(2) + * first resolves symlinks. If the target is a directory or + * is nonexistent, it will fail. linkat(2) operates on the + * symlink instead of its target when the AT_SYMLINK_FOLLOW + * flag is not supplied. + */ + op_ret = linkat (AT_FDCWD, real_oldpath, AT_FDCWD, real_newpath, 0); +#else op_ret = link (real_oldpath, real_newpath); +#endif if (op_ret == -1) { op_errno = errno; gf_log (this->name, GF_LOG_ERROR, -- cgit