Ver código fonte

Merge pull request #524 from ThomasWaldmann/libc-loader-fallback

add some error handling/fallback for C library loading, fixes #494
TW 9 anos atrás
pai
commit
48e9b9cb15
1 arquivos alterados com 24 adições e 1 exclusões
  1. 24 1
      borg/xattr.py

+ 24 - 1
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):