This is an experimental port of glusterfs on NetBSD. Don't do this at home!
This commit is contained in:
parent
fd060fe57d
commit
90b5313922
24 changed files with 924 additions and 0 deletions
11
filesystems/glusterfs/DESCR
Normal file
11
filesystems/glusterfs/DESCR
Normal file
|
@ -0,0 +1,11 @@
|
|||
GlusterFS is a flexible, powerful, POSIX-compliant cluster filesystem
|
||||
that can scale to several petabytes.
|
||||
|
||||
GlusterFS works over either TCP/IP or high-performance Infiniband
|
||||
RDMA interconnect.
|
||||
|
||||
GlusterFS provides striping and on-the-fly synchronous replication
|
||||
of files. GlusterFS has a fully distributed design, with no single
|
||||
point of failure.
|
||||
|
||||
Please visit http://www.gluster.org/glusterfs.php for more info.
|
7
filesystems/glusterfs/MESSAGE.NetBSD
Normal file
7
filesystems/glusterfs/MESSAGE.NetBSD
Normal file
|
@ -0,0 +1,7 @@
|
|||
===========================================================================
|
||||
$NetBSD: MESSAGE.NetBSD,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
glusterfs on NetBSD is extremely experimental. Do not feed it with
|
||||
important data right now.
|
||||
|
||||
===========================================================================
|
49
filesystems/glusterfs/Makefile
Normal file
49
filesystems/glusterfs/Makefile
Normal file
|
@ -0,0 +1,49 @@
|
|||
# $NetBSD: Makefile,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
#
|
||||
|
||||
DISTNAME= glusterfs-3.0.5
|
||||
CATEGORIES= filesystems
|
||||
MASTER_SITES= http://ftp.gluster.com/pub/gluster/glusterfs/3.0/LATEST/
|
||||
|
||||
MAINTAINER= pkgsrc-users@NetBSD.org
|
||||
HOMEPAGE= http://www.gluster.org/glusterfs.php
|
||||
COMMENT= Cluster filesystem
|
||||
LICENSE= gnu-gpl-v3
|
||||
|
||||
PKG_DESTDIR_SUPPORT= user-destdir
|
||||
|
||||
GNU_CONFIGURE= yes
|
||||
USE_LIBTOOL= yes
|
||||
PYTHON_VERSIONS_ACCEPTED= 26 25
|
||||
CONFIGURE_ARGS+= --localstatedir=${VARBASE}
|
||||
|
||||
SUBST_CLASSES+= py
|
||||
SUBST_STAGE.py= post-build
|
||||
SUBST_FILES.py= extras/volgen/glusterfs-volgen
|
||||
SUBST_SED.py= -e "s,/usr/bin/python,${PYTHONBIN},g"
|
||||
|
||||
SUBST_CLASSES+= bash
|
||||
SUBST_STAGE.bash= post-build
|
||||
SUBST_FILES.bash= xlators/mount/fuse/utils/mount.glusterfs
|
||||
SUBST_SED.bash= -e "s,/bin/bash,/bin/sh,g"
|
||||
|
||||
|
||||
REPLACE_PYTHON+= ${WRKSRC}/extras/volgen/glusterfs-volgen
|
||||
|
||||
EGDIR= ${PREFIX}/etc/glusterfs
|
||||
CONF_FILES+= ${EGDIR}/glusterfs.vol.sample ${EGDIR}/glusterfs.vol
|
||||
CONF_FILES+= ${EGDIR}/glusterfsd.vol.sample ${EGDIR}/glusterfsd.vol
|
||||
OWN_DIRS+= ${VARBASE}/glusterfs
|
||||
BUILD_DEFS+= VARBASE
|
||||
|
||||
post-install:
|
||||
cp ${DESTDIR}/sbin/mount.glusterfs ${DESTDIR}/${PREFIX}/sbin/
|
||||
|
||||
.include "../../mk/bsd.prefs.mk"
|
||||
.include "../../lang/python/application.mk"
|
||||
.include "../../devel/flex/buildlink3.mk"
|
||||
.if ${OPSYS} == "NetBSD"
|
||||
.include "../../filesystems/perfuse/buildlink3.mk"
|
||||
.endif
|
||||
|
||||
.include "../../mk/bsd.pkg.mk"
|
72
filesystems/glusterfs/PLIST
Normal file
72
filesystems/glusterfs/PLIST
Normal file
|
@ -0,0 +1,72 @@
|
|||
@comment $NetBSD: PLIST,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
bin/glusterfs-volgen
|
||||
etc/glusterfs/glusterfs.vol.sample
|
||||
etc/glusterfs/glusterfsd.vol.sample
|
||||
lib/glusterfs/3.0.5/auth/addr.la
|
||||
lib/glusterfs/3.0.5/auth/login.la
|
||||
lib/glusterfs/3.0.5/scheduler/alu.la
|
||||
lib/glusterfs/3.0.5/scheduler/nufa.la
|
||||
lib/glusterfs/3.0.5/scheduler/random.la
|
||||
lib/glusterfs/3.0.5/scheduler/rr.la
|
||||
lib/glusterfs/3.0.5/scheduler/switch.la
|
||||
lib/glusterfs/3.0.5/transport/socket.la
|
||||
lib/glusterfs/3.0.5/xlator/cluster/afr.la
|
||||
lib/glusterfs/3.0.5/xlator/cluster/dht.la
|
||||
lib/glusterfs/3.0.5/xlator/cluster/distribute.so
|
||||
lib/glusterfs/3.0.5/xlator/cluster/nufa.la
|
||||
lib/glusterfs/3.0.5/xlator/cluster/replicate.so
|
||||
lib/glusterfs/3.0.5/xlator/cluster/stripe.la
|
||||
lib/glusterfs/3.0.5/xlator/cluster/switch.la
|
||||
lib/glusterfs/3.0.5/xlator/debug/error-gen.la
|
||||
lib/glusterfs/3.0.5/xlator/debug/io-stats.la
|
||||
lib/glusterfs/3.0.5/xlator/debug/trace.la
|
||||
lib/glusterfs/3.0.5/xlator/encryption/rot-13.la
|
||||
lib/glusterfs/3.0.5/xlator/features/locks.la
|
||||
lib/glusterfs/3.0.5/xlator/features/posix-locks.so
|
||||
lib/glusterfs/3.0.5/xlator/features/quota.la
|
||||
lib/glusterfs/3.0.5/xlator/legacy/cluster/unify.la
|
||||
lib/glusterfs/3.0.5/xlator/mount/fuse.la
|
||||
lib/glusterfs/3.0.5/xlator/performance/io-cache.la
|
||||
lib/glusterfs/3.0.5/xlator/performance/io-threads.la
|
||||
lib/glusterfs/3.0.5/xlator/performance/quick-read.la
|
||||
lib/glusterfs/3.0.5/xlator/performance/read-ahead.la
|
||||
lib/glusterfs/3.0.5/xlator/performance/stat-prefetch.la
|
||||
lib/glusterfs/3.0.5/xlator/performance/write-behind.la
|
||||
lib/glusterfs/3.0.5/xlator/protocol/client.la
|
||||
lib/glusterfs/3.0.5/xlator/protocol/server.la
|
||||
lib/glusterfs/3.0.5/xlator/storage/posix.la
|
||||
lib/glusterfs/3.0.5/xlator/testing/cluster/ha.la
|
||||
lib/glusterfs/3.0.5/xlator/testing/cluster/map.la
|
||||
lib/glusterfs/3.0.5/xlator/testing/features/filter.la
|
||||
lib/glusterfs/3.0.5/xlator/testing/features/path-converter.la
|
||||
lib/glusterfs/3.0.5/xlator/testing/features/trash.la
|
||||
lib/glusterfs/3.0.5/xlator/testing/performance/symlink-cache.la
|
||||
lib/libglusterfs.la
|
||||
man/man8/glusterfs.8
|
||||
man/man8/mount.glusterfs.8
|
||||
sbin/glusterfs
|
||||
sbin/glusterfsd
|
||||
sbin/mount.glusterfs
|
||||
share/doc/glusterfs/benchmarking/README
|
||||
share/doc/glusterfs/benchmarking/glfs-bm.c
|
||||
share/doc/glusterfs/benchmarking/launch-script.sh
|
||||
share/doc/glusterfs/benchmarking/local-script.sh
|
||||
share/doc/glusterfs/benchmarking/rdd.c
|
||||
share/doc/glusterfs/examples/README
|
||||
share/doc/glusterfs/examples/filter.vol
|
||||
share/doc/glusterfs/examples/io-cache.vol
|
||||
share/doc/glusterfs/examples/io-threads.vol
|
||||
share/doc/glusterfs/examples/posix-locks.vol
|
||||
share/doc/glusterfs/examples/protocol-client.vol
|
||||
share/doc/glusterfs/examples/protocol-server.vol
|
||||
share/doc/glusterfs/examples/read-ahead.vol
|
||||
share/doc/glusterfs/examples/replicate.vol
|
||||
share/doc/glusterfs/examples/stripe.vol
|
||||
share/doc/glusterfs/examples/trace.vol
|
||||
share/doc/glusterfs/examples/trash.vol
|
||||
share/doc/glusterfs/examples/unify.vol
|
||||
share/doc/glusterfs/examples/write-behind.vol
|
||||
share/doc/glusterfs/glusterfs-mode.el
|
||||
share/doc/glusterfs/glusterfs.vim
|
||||
share/glusterfs/CreateBooster.py
|
||||
share/glusterfs/CreateVolfile.py
|
24
filesystems/glusterfs/distinfo
Normal file
24
filesystems/glusterfs/distinfo
Normal file
|
@ -0,0 +1,24 @@
|
|||
$NetBSD: distinfo,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
SHA1 (glusterfs-3.0.5.tar.gz) = 15ff9777cc23afa61f253bcbea2ebdd7a65ef82a
|
||||
RMD160 (glusterfs-3.0.5.tar.gz) = 2316dd43e7d4db98a8a619414cbe3d0546e678b4
|
||||
Size (glusterfs-3.0.5.tar.gz) = 1698376 bytes
|
||||
SHA1 (patch-aa) = 35e85637d0779d24a7c51cf2084c37d2abf57033
|
||||
SHA1 (patch-ab) = d929f88563f503323fb9f29e981cebe0deb6df34
|
||||
SHA1 (patch-ac) = f130a850238f3e0b1b7f906cc2b37242249ef9f2
|
||||
SHA1 (patch-ad) = 18860e03627d679a8a1f05f68b0688c82ddaea57
|
||||
SHA1 (patch-ae) = 0ec5cd1f251a016ba4f36093c6bdc5b17112ce06
|
||||
SHA1 (patch-af) = 7a19a965768cb923629cc50d4791e9934750078d
|
||||
SHA1 (patch-ag) = 8de8f242d6aca13b6a04b1affc6af6376877392d
|
||||
SHA1 (patch-an) = d76f131bca8e1f6b2d0cf00fec2f5390222811c0
|
||||
SHA1 (patch-ao) = 72198b13482bc0653b473ee98830bb05b44bd330
|
||||
SHA1 (patch-aq) = 57a25ef86a14c144553c3357fd69b9ab008f798e
|
||||
SHA1 (patch-ar) = 56217f95b689d6872d777fed2350366fdb3c3e66
|
||||
SHA1 (patch-as) = 3f303a80389b6ddf91e828836581af04d973c7f7
|
||||
SHA1 (patch-ax) = 89e42127b49d70cc0071c0ce32641d3cdf59fae9
|
||||
SHA1 (patch-ba) = f384e775bd99622790c7bceef22525e2d92a5519
|
||||
SHA1 (patch-bb) = 03afe977ab7b80332de4a1014bc7032a37b677ab
|
||||
SHA1 (patch-bc) = 2109d45002dea0cc9546135f333c93f5c2c17d19
|
||||
SHA1 (patch-bd) = 2a9b7492af964410f156fbe521b35b1d2ec46d84
|
||||
SHA1 (patch-be) = a0ff5c2a9f856055328925ac3cf227f7bcfdf3e2
|
||||
SHA1 (patch-bf) = 9ea8057d03de080b42da649ea66a892a07df8f6d
|
16
filesystems/glusterfs/patches/patch-aa
Normal file
16
filesystems/glusterfs/patches/patch-aa
Normal file
|
@ -0,0 +1,16 @@
|
|||
$NetBSD: patch-aa,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
The == operator is a non-standard bash extension. = should be used instead
|
||||
--- xlators/mount/fuse/utils/mount_glusterfs.in.orig 2010-07-16 11:32:53.000000000 +0200
|
||||
+++ xlators/mount/fuse/utils/mount_glusterfs.in 2010-07-16 11:33:04.000000000 +0200
|
||||
@@ -166,9 +166,9 @@
|
||||
}
|
||||
|
||||
# TODO: use getopt. This is very much darwin specific
|
||||
volfile_loc="$1";
|
||||
- while [ "$volfile_loc" == "-o" ] ; do
|
||||
+ while [ "$volfile_loc" = "-o" ] ; do
|
||||
shift ;
|
||||
shift ;
|
||||
volfile_loc="$1";
|
||||
done
|
20
filesystems/glusterfs/patches/patch-ab
Normal file
20
filesystems/glusterfs/patches/patch-ab
Normal file
|
@ -0,0 +1,20 @@
|
|||
$NetBSD: patch-ab,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
NetBSD does not have AI_ADDRCONFIG. This patch has a side effect: glusterfsd
|
||||
listens on IPv6 adresses only by default. Option transport.socket.bind-address
|
||||
in volume server-tcp must be used to listen on an IPv4 address.
|
||||
--- libglusterfs/src/common-utils.c.orig 2010-07-16 11:38:26.000000000 +0200
|
||||
+++ libglusterfs/src/common-utils.c 2010-07-16 11:41:03.000000000 +0200
|
||||
@@ -45,8 +45,12 @@
|
||||
#include "revision.h"
|
||||
#include "glusterfs.h"
|
||||
#include "stack.h"
|
||||
|
||||
+#ifndef AI_ADDRCONFIG
|
||||
+#define AI_ADDRCONFIG 0
|
||||
+#endif /* AI_ADDRCONFIG */
|
||||
+
|
||||
typedef int32_t (*rw_op_t)(int32_t fd, char *buf, int32_t size);
|
||||
typedef int32_t (*rwv_op_t)(int32_t fd, const struct iovec *buf, int32_t size);
|
||||
static glusterfs_ctx_t *gf_global_ctx;
|
||||
|
19
filesystems/glusterfs/patches/patch-ac
Normal file
19
filesystems/glusterfs/patches/patch-ac
Normal file
|
@ -0,0 +1,19 @@
|
|||
$NetBSD: patch-ac,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
NetBSD does not have EDOOFUS.
|
||||
--- libglusterfs/src/compat-errno.c.orig 2010-07-16 11:44:51.000000000 +0200
|
||||
+++ libglusterfs/src/compat-errno.c 2010-07-16 11:50:55.000000000 +0200
|
||||
@@ -857,11 +857,13 @@
|
||||
/* ENOATTR 87 / * Attribute not found */
|
||||
gf_error_to_errno_array[GF_ERROR_CODE_NOATTR] = ENOATTR;
|
||||
gf_errno_to_error_array[ENOATTR] = GF_ERROR_CODE_NOATTR;
|
||||
|
||||
+#ifdef EDOOFUS /* Undefined on NetBSD */
|
||||
/* EDOOFUS 88 / * Programming error */
|
||||
gf_error_to_errno_array[GF_ERROR_CODE_DOOFUS] = EDOOFUS;
|
||||
gf_errno_to_error_array[EDOOFUS] = GF_ERROR_CODE_DOOFUS;
|
||||
+#endif /* EDOOFUS */
|
||||
|
||||
/* EBADMSG 89 / * Bad message */
|
||||
gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;
|
||||
gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;
|
16
filesystems/glusterfs/patches/patch-ad
Normal file
16
filesystems/glusterfs/patches/patch-ad
Normal file
|
@ -0,0 +1,16 @@
|
|||
$NetBSD: patch-ad,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
Works around "error: 'EBADFD' undeclared" on NetBSD
|
||||
--- xlators/protocol/server/src/server-resolve.c.orig 2010-07-16 11:54:50.000000000 +0200
|
||||
+++ xlators/protocol/server/src/server-resolve.c 2010-07-16 12:00:29.000000000 +0200
|
||||
@@ -23,9 +23,9 @@
|
||||
#endif
|
||||
|
||||
#include "server-protocol.h"
|
||||
#include "server-helpers.h"
|
||||
-
|
||||
+#include "compat-errno.h"
|
||||
|
||||
int
|
||||
server_resolve_all (call_frame_t *frame);
|
||||
int
|
52
filesystems/glusterfs/patches/patch-ae
Normal file
52
filesystems/glusterfs/patches/patch-ae
Normal file
|
@ -0,0 +1,52 @@
|
|||
$NetBSD: patch-ae,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
On NetBSD use libperfuse(3), rename umount2(2) as unmount(2), and skip
|
||||
inexistant /etc/mtab management.
|
||||
--- contrib/fuse-lib/mount.c.orig 2010-08-23 09:56:52.000000000 +0200
|
||||
+++ contrib/fuse-lib/mount.c 2010-08-23 10:29:03.000000000 +0200
|
||||
@@ -19,16 +19,23 @@
|
||||
#include <limits.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
+#ifndef __NetBSD__
|
||||
#include <mntent.h>
|
||||
+#endif
|
||||
#include <sys/stat.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mount.h>
|
||||
|
||||
+#ifdef __NetBSD__
|
||||
+#include <perfuse.h>
|
||||
+#define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0)
|
||||
+#endif
|
||||
+
|
||||
#ifdef FUSE_UTIL
|
||||
#define MALLOC(size) malloc (size)
|
||||
#define FREE(ptr) free (ptr)
|
||||
#define GFFUSE_LOGERR(...) fprintf (stderr, ## __VA_ARGS__)
|
||||
@@ -57,8 +64,9 @@
|
||||
* - s/free/FREE/, s/malloc/MALLOC/
|
||||
* - there are some other minor things
|
||||
*/
|
||||
|
||||
+#ifndef __NetBSD__
|
||||
static int
|
||||
mtab_needs_update (const char *mnt)
|
||||
{
|
||||
int res;
|
||||
@@ -90,8 +98,11 @@
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
+#else /* __NetBSD__ */
|
||||
+#define mtab_needs_update(x) 1
|
||||
+#endif
|
||||
|
||||
#ifndef FUSE_UTIL
|
||||
static
|
||||
#endif
|
16
filesystems/glusterfs/patches/patch-af
Normal file
16
filesystems/glusterfs/patches/patch-af
Normal file
|
@ -0,0 +1,16 @@
|
|||
$NetBSD: patch-af,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
Works around "error: 'TCP_KEEPALIVE' undeclared" on NetBSD
|
||||
--- transport/socket/src/socket.c.orig 2010-07-16 12:18:27.000000000 +0200
|
||||
+++ transport/socket/src/socket.c 2010-07-16 12:19:46.000000000 +0200
|
||||
@@ -258,9 +258,9 @@
|
||||
|
||||
if (keepalive_intvl == GF_USE_DEFAULT_KEEPALIVE)
|
||||
goto done;
|
||||
|
||||
-#ifndef GF_LINUX_HOST_OS
|
||||
+#if !defined(GF_LINUX_HOST_OS) && !defined(__NetBSD__)
|
||||
ret = setsockopt (fd, IPPROTO_TCP, TCP_KEEPALIVE, &keepalive_intvl,
|
||||
sizeof (keepalive_intvl));
|
||||
if (ret == -1)
|
||||
goto err;
|
20
filesystems/glusterfs/patches/patch-ag
Normal file
20
filesystems/glusterfs/patches/patch-ag
Normal file
|
@ -0,0 +1,20 @@
|
|||
$NetBSD: patch-ag,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
NetBSD does not have AI_ADDRCONFIG. This patch has a side effect: glusterfsd
|
||||
listens on IPv6 adresses only by default. Option transport.socket.bind-address
|
||||
in volume server-tcp must be used to listen on an IPv4 address.
|
||||
--- transport/socket/src/name.c.orig 2010-07-16 12:20:28.000000000 +0200
|
||||
+++ transport/socket/src/name.c 2010-07-16 12:20:59.000000000 +0200
|
||||
@@ -33,8 +33,12 @@
|
||||
#ifndef AF_INET_SDP
|
||||
#define AF_INET_SDP 27
|
||||
#endif
|
||||
|
||||
+#ifndef AI_ADDRCONFIG
|
||||
+#define AI_ADDRCONFIG 0
|
||||
+#endif /* AI_ADDRCONFIG */
|
||||
+
|
||||
static int gf_name_addr_enotspec_log;
|
||||
|
||||
#include "transport.h"
|
||||
#include "socket.h"
|
27
filesystems/glusterfs/patches/patch-an
Normal file
27
filesystems/glusterfs/patches/patch-an
Normal file
|
@ -0,0 +1,27 @@
|
|||
$NetBSD: patch-an,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
NetBSD uses libperfuse(3). Also enable debugging (-g) for now.
|
||||
--- configure.ac.orig 2010-08-23 15:31:49.000000000 +0200
|
||||
+++ configure.ac 2010-08-23 16:39:32.000000000 +0200
|
||||
@@ -378,8 +378,21 @@
|
||||
GF_BOOSTER_SUBDIR=""
|
||||
BUILD_FUSE_CLIENT=no
|
||||
FUSE_CLIENT_SUBDIR=""
|
||||
;;
|
||||
+ *netbsd*)
|
||||
+ GF_HOST_OS="GF_BSD_HOST_OS"
|
||||
+ GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}"
|
||||
+ GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"
|
||||
+ GF_LDADD="${ARGP_STANDALONE_LDADD}"
|
||||
+ if test "x$ac_cv_header_execinfo_h" = "xyes"; then
|
||||
+ GF_GLUSTERFS_LDFLAGS="-lexecinfo"
|
||||
+ fi
|
||||
+ GF_FUSE_LDADD="-liconv -lperfuse"
|
||||
+ BUILD_LIBGLUSTERFSCLIENT=no
|
||||
+ LIBGLUSTERFSCLIENT_SUBDIR=""
|
||||
+ GF_BOOSTER_SUBDIR=""
|
||||
+ ;;
|
||||
*bsd*)
|
||||
GF_HOST_OS="GF_BSD_HOST_OS"
|
||||
GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}"
|
||||
GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"
|
27
filesystems/glusterfs/patches/patch-ao
Normal file
27
filesystems/glusterfs/patches/patch-ao
Normal file
|
@ -0,0 +1,27 @@
|
|||
$NetBSD: patch-ao,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
NetBSD uses libperfuse(3). Also enable debugging (-g) for now.
|
||||
--- configure.orig 2010-08-23 15:32:00.000000000 +0200
|
||||
+++ configure 2010-08-23 16:39:44.000000000 +0200
|
||||
@@ -13828,8 +13828,21 @@
|
||||
GF_BOOSTER_SUBDIR=""
|
||||
BUILD_FUSE_CLIENT=no
|
||||
FUSE_CLIENT_SUBDIR=""
|
||||
;;
|
||||
+ *netbsd*)
|
||||
+ GF_HOST_OS="GF_BSD_HOST_OS"
|
||||
+ GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -g"
|
||||
+ GF_GLUSTERFS_CFLAGS="${GF_CFLAGS} -g"
|
||||
+ GF_LDADD="${ARGP_STANDALONE_LDADD}"
|
||||
+ if test "x$ac_cv_header_execinfo_h" = "xyes"; then
|
||||
+ GF_GLUSTERFS_LDFLAGS="-lexecinfo"
|
||||
+ fi
|
||||
+ GF_FUSE_LDADD="-liconv -lperfuse"
|
||||
+ BUILD_LIBGLUSTERFSCLIENT=no
|
||||
+ LIBGLUSTERFSCLIENT_SUBDIR=""
|
||||
+ GF_BOOSTER_SUBDIR=""
|
||||
+ ;;
|
||||
*bsd*)
|
||||
GF_HOST_OS="GF_BSD_HOST_OS"
|
||||
GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}"
|
||||
GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"
|
42
filesystems/glusterfs/patches/patch-aq
Normal file
42
filesystems/glusterfs/patches/patch-aq
Normal file
|
@ -0,0 +1,42 @@
|
|||
$NetBSD: patch-aq,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
Emulate missing sem_timedwait(3) on NetBSD
|
||||
--- xlators/performance/io-threads/src/io-threads.c.orig 2010-08-23 17:49:40.000000000 +0200
|
||||
+++ xlators/performance/io-threads/src/io-threads.c 2010-08-23 18:43:35.000000000 +0200
|
||||
@@ -32,8 +32,36 @@
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include "locking.h"
|
||||
|
||||
+#ifdef __NetBSD__
|
||||
+static inline int sem_timedwait(sem_t *sem, struct timespec *ts) {
|
||||
+ struct timespec onems = { 0, 1000000 };
|
||||
+ struct timespec total = { 0, 0 };
|
||||
+ struct timespec unslept;
|
||||
+ struct timespec elapsed;
|
||||
+ struct timespec tmp;
|
||||
+
|
||||
+ while (timespeccmp(ts, &total, >)) {
|
||||
+ if (sem_trywait(sem) == 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (errno != EAGAIN)
|
||||
+ return -1;
|
||||
+
|
||||
+ (void)nanosleep(&onems, &unslept);
|
||||
+
|
||||
+ timespecsub(&onems, &unslept, &elapsed);
|
||||
+ timespecadd(&total, &elapsed, &tmp);
|
||||
+ total.tv_sec = tmp.tv_sec;
|
||||
+ total.tv_nsec = tmp.tv_nsec;
|
||||
+ }
|
||||
+
|
||||
+ errno = ETIMEDOUT;
|
||||
+ return -1;
|
||||
+}
|
||||
+#endif /* __NetBSD__ */
|
||||
+
|
||||
typedef void *(*iot_worker_fn)(void*);
|
||||
|
||||
void
|
||||
iot_stop_worker (iot_worker_t *worker);
|
17
filesystems/glusterfs/patches/patch-ar
Normal file
17
filesystems/glusterfs/patches/patch-ar
Normal file
|
@ -0,0 +1,17 @@
|
|||
$NetBSD: patch-ar,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
Add @GF_FUSE_LDADD@ to fuse.so library dependecies so that -lperfuse is
|
||||
added at configure time for NetBSD.
|
||||
--- xlators/mount/fuse/src/Makefile.am.orig 2010-08-23 15:57:10.000000000 +0200
|
||||
+++ xlators/mount/fuse/src/Makefile.am 2010-08-23 16:38:50.000000000 +0200
|
||||
@@ -5,9 +5,9 @@
|
||||
xlator_LTLIBRARIES = fuse.la
|
||||
xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/mount
|
||||
fuse_la_SOURCES = fuse-bridge.c $(CONTRIBDIR)/fuse-lib/misc.c \
|
||||
$(CONTRIBDIR)/fuse-lib/mount.c
|
||||
-fuse_la_LDFLAGS = -module -avoidversion -shared -nostartfiles
|
||||
+fuse_la_LIBADD = @GF_FUSE_LDADD@
|
||||
|
||||
AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS) -Wall \
|
||||
-I$(top_srcdir)/libglusterfs/src -I$(CONTRIBDIR)/fuse-include \
|
||||
$(GF_CFLAGS) -DFUSERMOUNT_DIR=\"$(bindir)\"
|
17
filesystems/glusterfs/patches/patch-as
Normal file
17
filesystems/glusterfs/patches/patch-as
Normal file
|
@ -0,0 +1,17 @@
|
|||
$NetBSD: patch-as,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
Add @GF_FUSE_LDADD@ to fuse.so library dependecies so that -lperfuse is
|
||||
added at configure time for NetBSD.
|
||||
--- xlators/mount/fuse/src/Makefile.in.orig 2010-08-23 15:57:15.000000000 +0200
|
||||
+++ xlators/mount/fuse/src/Makefile.in 2010-08-23 16:39:14.000000000 +0200
|
||||
@@ -55,9 +55,9 @@
|
||||
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||
am__installdirs = "$(DESTDIR)$(xlatordir)"
|
||||
xlatorLTLIBRARIES_INSTALL = $(INSTALL)
|
||||
LTLIBRARIES = $(xlator_LTLIBRARIES)
|
||||
-fuse_la_LIBADD =
|
||||
+fuse_la_LIBADD = @GF_FUSE_LDADD@
|
||||
am_fuse_la_OBJECTS = fuse-bridge.lo misc.lo mount.lo
|
||||
fuse_la_OBJECTS = $(am_fuse_la_OBJECTS)
|
||||
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
16
filesystems/glusterfs/patches/patch-ax
Normal file
16
filesystems/glusterfs/patches/patch-ax
Normal file
|
@ -0,0 +1,16 @@
|
|||
$NetBSD: patch-ax,v 1.1.1.1 2010/08/26 14:26:18 manu Exp $
|
||||
|
||||
Do not strip binaries so that we have debug for now.
|
||||
--- install-sh.orig 2010-08-23 16:56:17.000000000 +0200
|
||||
+++ install-sh 2010-08-23 16:56:40.000000000 +0200
|
||||
@@ -120,9 +120,9 @@
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
- -s) stripcmd=$stripprog
|
||||
+ -s) #stripcmd=$stripprog
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t) dstarg=$2
|
46
filesystems/glusterfs/patches/patch-ba
Normal file
46
filesystems/glusterfs/patches/patch-ba
Normal file
|
@ -0,0 +1,46 @@
|
|||
$NetBSD: patch-ba,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
glibc dirname() modify the string it is given and returns it.
|
||||
glusterfs takes this behavior for granted, and assume that if it
|
||||
gives a malloc'ed string to dirname(), then it can free()) the
|
||||
return value.
|
||||
|
||||
Here is what SUSv2 says:
|
||||
http://opengroup.org/onlinepubs/007908799/xsh/dirname.html
|
||||
"The dirname() function may modify the string pointed to by path,
|
||||
and may return a pointer to static storage"
|
||||
|
||||
At least NetBSD returns a static storage. glusterfs will return it to
|
||||
a calling function that has the responsability to free it, causing
|
||||
a SIGSEGV.
|
||||
|
||||
--- ./xlators/performance/stat-prefetch/src/stat-prefetch.c.orig 2010-08-24 14:06:54.000000000 +0200
|
||||
+++ ./xlators/performance/stat-prefetch/src/stat-prefetch.c 2010-08-24 14:20:10.000000000 +0200
|
||||
@@ -815,18 +815,25 @@
|
||||
path = dirname (cpy);
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
- *parent = path;
|
||||
+ *parent = strdup(path);
|
||||
+ if (*parent == NULL)
|
||||
+ goto out;
|
||||
break;
|
||||
case 1:
|
||||
- *grand_parent = path;
|
||||
+ *grand_parent = strdup(path);
|
||||
+ if (*grand_parent == NULL)
|
||||
+ goto out;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
+ if (cpy != NULL)
|
||||
+ free(cpy);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
19
filesystems/glusterfs/patches/patch-bb
Normal file
19
filesystems/glusterfs/patches/patch-bb
Normal file
|
@ -0,0 +1,19 @@
|
|||
$NetBSD: patch-bb,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
On NetBSD and FreeBSD, O_DIRECTORY does not exists and is defined as 0
|
||||
by glusterfs. ((flags & O_DIRECTORY) == O_DIRECTORY) always evaluate
|
||||
to true, and this is a bug.
|
||||
|
||||
--- ./xlators/performance/quick-read/src/quick-read.c.orig 2010-08-24 17:31:30.000000000 +0200
|
||||
+++ ./xlators/performance/quick-read/src/quick-read.c 2010-08-24 17:32:13.000000000 +0200
|
||||
@@ -642,9 +642,9 @@
|
||||
}
|
||||
}
|
||||
UNLOCK (&table->lock);
|
||||
|
||||
- if (content_cached && ((flags & O_DIRECTORY) == O_DIRECTORY)) {
|
||||
+ if (content_cached && (flags & O_DIRECTORY)) {
|
||||
op_ret = -1;
|
||||
op_errno = ENOTDIR;
|
||||
goto unwind;
|
||||
}
|
60
filesystems/glusterfs/patches/patch-bc
Normal file
60
filesystems/glusterfs/patches/patch-bc
Normal file
|
@ -0,0 +1,60 @@
|
|||
$NetBSD: patch-bc,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
glibc dirname() modify the string it is given and returns it.
|
||||
glusterfs takes this behavior for granted, and assume that if it
|
||||
gives a malloc'ed string to dirname(), then it can free()) the
|
||||
return value.
|
||||
|
||||
Here is what SUSv2 says:
|
||||
http://opengroup.org/onlinepubs/007908799/xsh/dirname.html
|
||||
"The dirname() function may modify the string pointed to by path,
|
||||
and may return a pointer to static storage"
|
||||
|
||||
At least NetBSD returns a static storage. glusterfs will return it to
|
||||
a calling function that has the responsability to free it, causing
|
||||
a SIGSEGV.
|
||||
|
||||
--- ./xlators/performance/quick-read/src/quick-read.c.orig 2010-08-24 18:01:15.000000000 +0200
|
||||
+++ ./xlators/performance/quick-read/src/quick-read.c 2010-08-24 18:04:22.000000000 +0200
|
||||
@@ -80,8 +80,9 @@
|
||||
qr_loc_fill (loc_t *loc, inode_t *inode, char *path)
|
||||
{
|
||||
int32_t ret = -1;
|
||||
char *parent = NULL;
|
||||
+ char *path_copy = NULL;
|
||||
|
||||
if ((loc == NULL) || (inode == NULL) || (path == NULL)) {
|
||||
ret = -1;
|
||||
errno = EINVAL;
|
||||
@@ -91,15 +92,15 @@
|
||||
loc->inode = inode_ref (inode);
|
||||
loc->path = strdup (path);
|
||||
loc->ino = inode->ino;
|
||||
|
||||
- parent = strdup (path);
|
||||
- if (parent == NULL) {
|
||||
+ path_copy = strdup (path);
|
||||
+ if (path_copy == NULL) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
- parent = dirname (parent);
|
||||
+ parent = dirname (path_copy);
|
||||
|
||||
loc->parent = inode_from_path (inode->table, parent);
|
||||
if (loc->parent == NULL) {
|
||||
ret = -1;
|
||||
@@ -114,10 +115,10 @@
|
||||
qr_loc_wipe (loc);
|
||||
|
||||
}
|
||||
|
||||
- if (parent) {
|
||||
- FREE (parent);
|
||||
+ if (path_copy) {
|
||||
+ FREE (path_copy);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
60
filesystems/glusterfs/patches/patch-bd
Normal file
60
filesystems/glusterfs/patches/patch-bd
Normal file
|
@ -0,0 +1,60 @@
|
|||
$NetBSD: patch-bd,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
glibc dirname() modify the string it is given and returns it.
|
||||
glusterfs takes this behavior for granted, and assume that if it
|
||||
gives a malloc'ed string to dirname(), then it can free()) the
|
||||
return value.
|
||||
|
||||
Here is what SUSv2 says:
|
||||
http://opengroup.org/onlinepubs/007908799/xsh/dirname.html
|
||||
"The dirname() function may modify the string pointed to by path,
|
||||
and may return a pointer to static storage"
|
||||
|
||||
At least NetBSD returns a static storage. glusterfs will return it to
|
||||
a calling function that has the responsability to free it, causing
|
||||
a SIGSEGV.
|
||||
|
||||
--- libglusterfsclient/src/libglusterfsclient-dentry.c.orig 2010-08-24 18:36:08.000000000 +0200
|
||||
+++ libglusterfsclient/src/libglusterfsclient-dentry.c 2010-08-24 18:41:09.000000000 +0200
|
||||
@@ -231,8 +231,9 @@
|
||||
char lookup_basename)
|
||||
{
|
||||
int32_t op_ret = -1;
|
||||
char *resolved = NULL;
|
||||
+ char *restmp = NULL;
|
||||
inode_t *parent = NULL, *inode = NULL;
|
||||
dentry_t *dentry = NULL;
|
||||
loc_t new_loc = {0, };
|
||||
char *pathname = NULL, *directory = NULL;
|
||||
@@ -244,10 +245,10 @@
|
||||
gf_log ("libglusterfsclient-dentry", GF_LOG_DEBUG,
|
||||
"loc->parent(%"PRId64") already present. sending "
|
||||
"lookup for %"PRId64"/%s", parent->ino, parent->ino,
|
||||
loc->path);
|
||||
- resolved = strdup (loc->path);
|
||||
- resolved = dirname (resolved);
|
||||
+ restmp = strdup (loc->path);
|
||||
+ resolved = dirname (restmp);
|
||||
} else {
|
||||
parent = __libgf_client_path_to_parenti (ctx, ctx->itable,
|
||||
loc->path, &resolved);
|
||||
}
|
||||
@@ -342,17 +343,13 @@
|
||||
out:
|
||||
loc->inode = inode;
|
||||
loc->parent = parent;
|
||||
|
||||
- FREE (resolved);
|
||||
+ FREE (restmp);
|
||||
if (pathname) {
|
||||
FREE (pathname);
|
||||
}
|
||||
|
||||
- if (directory) {
|
||||
- FREE (directory);
|
||||
- }
|
||||
-
|
||||
return op_ret;
|
||||
}
|
||||
|
||||
|
239
filesystems/glusterfs/patches/patch-be
Normal file
239
filesystems/glusterfs/patches/patch-be
Normal file
|
@ -0,0 +1,239 @@
|
|||
$NetBSD: patch-be,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
basename() and dirname() are not supposed to be thread-safe, and NetBSD's
|
||||
implementation is not. glusterfs assume the functions are thread-safe.
|
||||
Borrow basename() and rdirname() form glibc and make NetBSD use them.
|
||||
|
||||
--- libglusterfs/src/compat.c.orig 2010-08-25 03:58:44.000000000 +0200
|
||||
+++ libglusterfs/src/compat.c 2010-08-25 10:42:37.000000000 +0200
|
||||
@@ -509,4 +509,230 @@
|
||||
len++;
|
||||
return len;
|
||||
}
|
||||
#endif /* STRNLEN */
|
||||
+
|
||||
+#ifdef __NetBSD__
|
||||
+/*
|
||||
+ * basename() and dirname() are not supposed to be thread-safe.
|
||||
+ * SUSv2 states it can return a static pointer, and * NetBSD does that.
|
||||
+ * glusterfs heavily assume basename() and * dirname() thread-safety,
|
||||
+ * hence these replacement from glibc.
|
||||
+ * compat.h defines basename() and dirname() as macro so that
|
||||
+ * the replacement are used.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * borrowed from glibc-2.12.1/string/basename.c (GPL 2.1 or later)
|
||||
+ * Copyright (C) 1996,97,98,2002 Free Software Foundation, Inc.
|
||||
+ * Modified to return "." for NULL or "", as required for SUSv2.
|
||||
+ */
|
||||
+char *
|
||||
+basename_r (filename)
|
||||
+ const char *filename;
|
||||
+{
|
||||
+ char *p;
|
||||
+
|
||||
+ if ((filename == NULL) || (*filename == '\0'))
|
||||
+ return ".";
|
||||
+
|
||||
+ p = strrchr (filename, '/');
|
||||
+ return p ? p + 1 : (char *) filename;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Borrowed from blibc-2.12.1/string/memrchr.c (GPL 2.1 or later)
|
||||
+ * Copyright (C) 1991, 93, 96, 97, 99, 2000 Free Software Foundation, Inc.
|
||||
+ * Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||
+ * Removed code for long bigger than 32 bytes, renamed __ptr_t as void *
|
||||
+ * changed reg_char type to char.
|
||||
+ */
|
||||
+void *
|
||||
+__memrchr (s, c_in, n)
|
||||
+ const void * s;
|
||||
+ int c_in;
|
||||
+ size_t n;
|
||||
+{
|
||||
+ const unsigned char *char_ptr;
|
||||
+ const unsigned long int *longword_ptr;
|
||||
+ unsigned long int longword, magic_bits, charmask;
|
||||
+ unsigned char c;
|
||||
+
|
||||
+ c = (unsigned char) c_in;
|
||||
+
|
||||
+ /* Handle the last few characters by reading one character at a time.
|
||||
+ Do this until CHAR_PTR is aligned on a longword boundary. */
|
||||
+ for (char_ptr = (const unsigned char *) s + n;
|
||||
+ n > 0 && ((unsigned long int) char_ptr
|
||||
+ & (sizeof (longword) - 1)) != 0;
|
||||
+ --n)
|
||||
+ if (*--char_ptr == c)
|
||||
+ return (void *) char_ptr;
|
||||
+
|
||||
+ /* All these elucidatory comments refer to 4-byte longwords,
|
||||
+ but the theory applies equally well to 8-byte longwords. */
|
||||
+
|
||||
+ longword_ptr = (const unsigned long int *) char_ptr;
|
||||
+
|
||||
+ /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits
|
||||
+ the "holes." Note that there is a hole just to the left of
|
||||
+ each byte, with an extra at the end:
|
||||
+
|
||||
+ bits: 01111110 11111110 11111110 11111111
|
||||
+ bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
|
||||
+
|
||||
+ The 1-bits make sure that carries propagate to the next 0-bit.
|
||||
+ The 0-bits provide holes for carries to fall into. */
|
||||
+
|
||||
+ if (sizeof (longword) != 4 && sizeof (longword) != 8)
|
||||
+ abort ();
|
||||
+
|
||||
+ magic_bits = 0x7efefeff;
|
||||
+
|
||||
+ /* Set up a longword, each of whose bytes is C. */
|
||||
+ charmask = c | (c << 8);
|
||||
+ charmask |= charmask << 16;
|
||||
+
|
||||
+ /* Instead of the traditional loop which tests each character,
|
||||
+ we will test a longword at a time. The tricky part is testing
|
||||
+ if *any of the four* bytes in the longword in question are zero. */
|
||||
+ while (n >= sizeof (longword))
|
||||
+ {
|
||||
+ /* We tentatively exit the loop if adding MAGIC_BITS to
|
||||
+ LONGWORD fails to change any of the hole bits of LONGWORD.
|
||||
+
|
||||
+ 1) Is this safe? Will it catch all the zero bytes?
|
||||
+ Suppose there is a byte with all zeros. Any carry bits
|
||||
+ propagating from its left will fall into the hole at its
|
||||
+ least significant bit and stop. Since there will be no
|
||||
+ carry from its most significant bit, the LSB of the
|
||||
+ byte to the left will be unchanged, and the zero will be
|
||||
+ detected.
|
||||
+
|
||||
+ 2) Is this worthwhile? Will it ignore everything except
|
||||
+ zero bytes? Suppose every byte of LONGWORD has a bit set
|
||||
+ somewhere. There will be a carry into bit 8. If bit 8
|
||||
+ is set, this will carry into bit 16. If bit 8 is clear,
|
||||
+ one of bits 9-15 must be set, so there will be a carry
|
||||
+ into bit 16. Similarly, there will be a carry into bit
|
||||
+ 24. If one of bits 24-30 is set, there will be a carry
|
||||
+ into bit 31, so all of the hole bits will be changed.
|
||||
+
|
||||
+ The one misfire occurs when bits 24-30 are clear and bit
|
||||
+ 31 is set; in this case, the hole at bit 31 is not
|
||||
+ changed. If we had access to the processor carry flag,
|
||||
+ we could close this loophole by putting the fourth hole
|
||||
+ at bit 32!
|
||||
+
|
||||
+ So it ignores everything except 128's, when they're aligned
|
||||
+ properly.
|
||||
+
|
||||
+ 3) But wait! Aren't we looking for C, not zero?
|
||||
+ Good point. So what we do is XOR LONGWORD with a longword,
|
||||
+ each of whose bytes is C. This turns each byte that is C
|
||||
+ into a zero. */
|
||||
+
|
||||
+ longword = *--longword_ptr ^ charmask;
|
||||
+
|
||||
+ /* Add MAGIC_BITS to LONGWORD. */
|
||||
+ if ((((longword + magic_bits)
|
||||
+
|
||||
+ /* Set those bits that were unchanged by the addition. */
|
||||
+ ^ ~longword)
|
||||
+
|
||||
+ /* Look at only the hole bits. If any of the hole bits
|
||||
+ are unchanged, most likely one of the bytes was a
|
||||
+ zero. */
|
||||
+ & ~magic_bits) != 0)
|
||||
+ {
|
||||
+ /* Which of the bytes was C? If none of them were, it was
|
||||
+ a misfire; continue the search. */
|
||||
+
|
||||
+ const unsigned char *cp = (const unsigned char *) longword_ptr;
|
||||
+
|
||||
+ if (cp[3] == c)
|
||||
+ return (void *) &cp[3];
|
||||
+ if (cp[2] == c)
|
||||
+ return (void *) &cp[2];
|
||||
+ if (cp[1] == c)
|
||||
+ return (void *) &cp[1];
|
||||
+ if (cp[0] == c)
|
||||
+ return (void *) cp;
|
||||
+ }
|
||||
+
|
||||
+ n -= sizeof (longword);
|
||||
+ }
|
||||
+
|
||||
+ char_ptr = (const unsigned char *) longword_ptr;
|
||||
+
|
||||
+ while (n-- > 0)
|
||||
+ {
|
||||
+ if (*--char_ptr == c)
|
||||
+ return (void *) char_ptr;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Borrowed from glibc-2.12.1/misc/dirname.c (GPL 2.1 or later)
|
||||
+ * Copyright (C) 1996, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
+ * Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
+ */
|
||||
+char *
|
||||
+dirname_r (char *path)
|
||||
+{
|
||||
+ static const char dot[] = ".";
|
||||
+ char *last_slash;
|
||||
+
|
||||
+ /* Find last '/'. */
|
||||
+ last_slash = path != NULL ? strrchr (path, '/') : NULL;
|
||||
+
|
||||
+ if (last_slash != NULL && last_slash != path && last_slash[1] == '\0')
|
||||
+ {
|
||||
+ /* Determine whether all remaining characters are slashes. */
|
||||
+ char *runp;
|
||||
+
|
||||
+ for (runp = last_slash; runp != path; --runp)
|
||||
+ if (runp[-1] != '/')
|
||||
+ break;
|
||||
+
|
||||
+ /* The '/' is the last character, we have to look further. */
|
||||
+ if (runp != path)
|
||||
+ last_slash = __memrchr (path, '/', runp - path);
|
||||
+ }
|
||||
+
|
||||
+ if (last_slash != NULL)
|
||||
+ {
|
||||
+ /* Determine whether all remaining characters are slashes. */
|
||||
+ char *runp;
|
||||
+
|
||||
+ for (runp = last_slash; runp != path; --runp)
|
||||
+ if (runp[-1] != '/')
|
||||
+ break;
|
||||
+
|
||||
+ /* Terminate the path. */
|
||||
+ if (runp == path)
|
||||
+ {
|
||||
+ /* The last slash is the first character in the string. We have to
|
||||
+ return "/". As a special case we have to return "//" if there
|
||||
+ are exactly two slashes at the beginning of the string. See
|
||||
+ XBD 4.10 Path Name Resolution for more information. */
|
||||
+ if (last_slash == path + 1)
|
||||
+ ++last_slash;
|
||||
+ else
|
||||
+ last_slash = path + 1;
|
||||
+ }
|
||||
+ else
|
||||
+ last_slash = runp;
|
||||
+
|
||||
+ last_slash[0] = '\0';
|
||||
+ }
|
||||
+ else
|
||||
+ /* This assignment is ill-designed but the XPG specs require to
|
||||
+ return a string containing "." in any case no directory part is
|
||||
+ found and so a static and constant string is required. */
|
||||
+ path = (char *) dot;
|
||||
+
|
||||
+ return path;
|
||||
+}
|
||||
+#endif /* __NetBSD__ */
|
32
filesystems/glusterfs/patches/patch-bf
Normal file
32
filesystems/glusterfs/patches/patch-bf
Normal file
|
@ -0,0 +1,32 @@
|
|||
$NetBSD: patch-bf,v 1.1.1.1 2010/08/26 14:26:19 manu Exp $
|
||||
|
||||
basename() and dirname() are not supposed to be thread-safe, and NetBSD's
|
||||
implementation is not. glusterfs assume the functions are thread-safe.
|
||||
Borrow basename() and rdirname() form glibc and make NetBSD use them.
|
||||
|
||||
--- libglusterfs/src/compat.h.orig 2010-08-25 10:18:27.000000000 +0200
|
||||
+++ libglusterfs/src/compat.h 2010-08-25 10:23:19.000000000 +0200
|
||||
@@ -57,9 +57,9 @@
|
||||
#endif /* HAVE_LLISTXATTR */
|
||||
#endif /* GF_LINUX_HOST_OS */
|
||||
|
||||
#ifdef GF_BSD_HOST_OS
|
||||
-/* In case of FreeBSD */
|
||||
+/* In case of FreeBSD and NetBSD */
|
||||
|
||||
#define UNIX_PATH_MAX 104
|
||||
#include <sys/types.h>
|
||||
|
||||
@@ -110,8 +110,12 @@
|
||||
#define F_GETLK64 F_GETLK
|
||||
#define F_SETLK64 F_SETLK
|
||||
#define F_SETLKW64 F_SETLKW
|
||||
|
||||
+#ifdef __NetBSD__
|
||||
+#define basename(path) basename_r(path)
|
||||
+#define dirname(path) dirname_r(path)
|
||||
+#endif /* __NetBSD__ */
|
||||
#endif /* GF_BSD_HOST_OS */
|
||||
|
||||
#ifdef GF_DARWIN_HOST_OS
|
||||
|
Loading…
Reference in a new issue