From 4ed71e2cf5ef373878da68b921c636d6403d9f2d Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sun, 27 Dec 2015 14:10:41 +0100 Subject: [PATCH] add some error handling/fallback for C library loading, fixes #494 --- borg/xattr.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/borg/xattr.py b/borg/xattr.py index 9c80c3263..7eafaa831 100644 --- a/borg/xattr.py +++ b/borg/xattr.py @@ -7,6 +7,9 @@ import tempfile from ctypes import CDLL, create_string_buffer, c_ssize_t, c_size_t, c_char_p, c_int, c_uint32, get_errno from ctypes.util import find_library +from .logger import create_logger +logger = create_logger() + def is_enabled(path=None): """Determine if xattr is enabled on the filesystem @@ -27,8 +30,28 @@ def get_all(path, follow_symlinks=True): if e.errno in (errno.ENOTSUP, errno.EPERM): return {} +libc_name = find_library('c') +if libc_name is None: + # find_library didn't work, maybe we are on some minimal system that misses essential + # tools used by find_library, like ldconfig, gcc/cc, objdump. + # so we can only try some "usual" names for the C library: + if sys.platform.startswith('linux'): + libc_name = 'libc.so.6' + elif sys.platform.startswith(('freebsd', 'netbsd')): + libc_name = 'libc.so' + elif sys.platform == 'darwin': + libc_name = 'libc.dylib' + else: + msg = "Can't find C library. No fallback known. Try installing ldconfig, gcc/cc or objdump." + logger.error(msg) + raise Exception(msg) -libc = CDLL(find_library('c'), use_errno=True) +try: + libc = CDLL(libc_name, use_errno=True) +except OSError as e: + msg = "Can't find C library [%s]. Try installing ldconfig, gcc/cc or objdump." % e + logger.error(msg) + raise Exception(msg) def _check(rv, path=None):