path: root/api/examples
diff options
authorNiels de Vos <>2013-09-30 09:05:14 +0200
committerAnand Avati <>2013-10-02 13:04:03 -0700
commitc499ef86a2dfd4e7727ce876b6cf18ba79c94fe5 (patch)
treecfe2a3ec9a71a8901f5e482a179caec56020a056 /api/examples
parenta66bf67965dddd9decd9210c3a530fdc85b6430c (diff) support dynamic loading of versioned libraries
Currently only loads libraries by filename ending in ".so". On an installed system without development packages, the <lib>.so filenames are not available. ctypes.util.find_library() can be used to detect the files dynamically. In addition to this, also fixing some minor indention errors and package the library into the Python site-packages path. Python applications and libraries can now access libgfapi through 'from glusterfs import gfapi'. Change-Id: I71e38dabd3ade5dcf24813bf2fc25cda91b571c6 BUG: 1005146 Signed-off-by: Niels de Vos <> Reviewed-on: Reviewed-by: Kaleb KEITHLEY <> Tested-by: Gluster Build System <>
Diffstat (limited to 'api/examples')
3 files changed, 44 insertions, 10 deletions
diff --git a/api/examples/ b/api/examples/
index 6048bb1c8b7..cfb0d3dff84 100644
--- a/api/examples/
+++ b/api/examples/
@@ -1,4 +1,6 @@
-noinst_PROGRAMS = glfsxmp
glfsxmp_SOURCES = glfsxmp.c
glfsxmp_CFLAGS = $(GLFS_CFLAGS) -Wall
-glfsxmp_LDADD = $(GLFS_LIBS) \ No newline at end of file
+glfsxmp_LDADD = $(GLFS_LIBS)
diff --git a/api/examples/ b/api/examples/
index 8d9ed732947..3ac67f4d5ba 100755
--- a/api/examples/
+++ b/api/examples/
@@ -1,6 +1,7 @@
from ctypes import *
+from ctypes.util import find_library
import os
import sys
import time
@@ -8,9 +9,9 @@ import types
# Looks like ctypes is having trouble with dependencies, so just force them to
# load with RTLD_GLOBAL until I figure that out.
-glfs = CDLL("",RTLD_GLOBAL)
+glfs = CDLL(find_library("glusterfs"),RTLD_GLOBAL)
+xdr = CDLL(find_library("gfxdr"),RTLD_GLOBAL)
+api = CDLL(find_library("gfapi"),RTLD_GLOBAL)
# Wow, the Linux kernel folks really play nasty games with this structure. If
# you look at the man page for stat(2) and then at this definition you'll note
@@ -98,10 +99,12 @@ class File(object):
def write (self, data, flags=0):
return api.glfs_write(self.fd,data,len(data),flags)
- def fallocate (self, mode, offset, len):
- return api.glfs_fallocate(self.fd, mode, offset, len)
- def discard (self, offset, len):
- return api.glfs_discard(self.fd, offset, len)
+ def fallocate (self, mode, offset, len):
+ return api.glfs_fallocate(self.fd, mode, offset, len)
+ def discard (self, offset, len):
+ return api.glfs_discard(self.fd, offset, len)
class Dir(object):
@@ -381,7 +384,7 @@ if __name__ == "__main__":
- test_fallocate,
+ test_fallocate,
ok_to_fail = (
diff --git a/api/examples/ b/api/examples/
new file mode 100644
index 00000000000..44b73809486
--- /dev/null
+++ b/api/examples/
@@ -0,0 +1,29 @@
+from distutils.core import setup
+# generate a for the package namespace
+fo = open('', 'w')
+fo.write('__version__ = "@PACKAGE_VERSION@"\n')
+DESC = """GlusterFS is a clustered file-system capable of scaling to
+several petabytes. It aggregates various storage bricks over Infiniband
+RDMA or TCP/IP interconnect into one large parallel network file system.
+GlusterFS is one of the most sophisticated file systems in terms of
+features and extensibility. It borrows a powerful concept called
+Translators from GNU Hurd kernel. Much of the code in GlusterFS is in
+user space and easily manageable.
+This package contains the Python interface to the libgfapi library."""
+ name='glusterfs-api',
+ version='@PACKAGE_VERSION@',
+ description='Python client library for the GlusterFS libgfapi',
+ long_description=DESC,
+ author='Gluster Community',
+ author_email='',
+ license='LGPLv3',
+ url='',
+ package_dir={'gluster':''},
+ packages=['gluster']