parent
fb2f2d9cb2
commit
80bc5833e7
1 changed files with 0 additions and 46 deletions
@ -1,46 +0,0 @@ |
|||||||
import os |
|
||||||
from cffi import FFI |
|
||||||
from typing import Any, List |
|
||||||
|
|
||||||
# Workaround for the EON/termux build of Python having os.*xattr removed. |
|
||||||
ffi = FFI() |
|
||||||
ffi.cdef(""" |
|
||||||
int setxattr(const char *path, const char *name, const void *value, size_t size, int flags); |
|
||||||
ssize_t getxattr(const char *path, const char *name, void *value, size_t size); |
|
||||||
ssize_t listxattr(const char *path, char *list, size_t size); |
|
||||||
int removexattr(const char *path, const char *name); |
|
||||||
""") |
|
||||||
libc = ffi.dlopen(None) |
|
||||||
|
|
||||||
def setxattr(path, name, value, flags=0) -> None: |
|
||||||
path = path.encode() |
|
||||||
name = name.encode() |
|
||||||
if libc.setxattr(path, name, value, len(value), flags) == -1: |
|
||||||
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: setxattr({path}, {name}, {value}, {flags})") |
|
||||||
|
|
||||||
def getxattr(path, name, size=128): |
|
||||||
path = path.encode() |
|
||||||
name = name.encode() |
|
||||||
value = ffi.new(f"char[{size}]") |
|
||||||
l = libc.getxattr(path, name, value, size) |
|
||||||
if l == -1: |
|
||||||
# errno 61 means attribute hasn't been set |
|
||||||
if ffi.errno == 61: |
|
||||||
return None |
|
||||||
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: getxattr({path}, {name}, {size})") |
|
||||||
return ffi.buffer(value)[:l] |
|
||||||
|
|
||||||
def listxattr(path, size=128) -> List[Any]: |
|
||||||
path = path.encode() |
|
||||||
attrs = ffi.new(f"char[{size}]") |
|
||||||
l = libc.listxattr(path, attrs, size) |
|
||||||
if l == -1: |
|
||||||
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: listxattr({path}, {size})") |
|
||||||
# attrs is b'\0' delimited values (so chop off trailing empty item) |
|
||||||
return [a.decode() for a in ffi.buffer(attrs)[:l].split(b"\0")[0:-1]] |
|
||||||
|
|
||||||
def removexattr(path, name) -> None: |
|
||||||
path = path.encode() |
|
||||||
name = name.encode() |
|
||||||
if libc.removexattr(path, name) == -1: |
|
||||||
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: removexattr({path}, {name})") |
|
Loading…
Reference in new issue