You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.5 KiB
93 lines
2.5 KiB
From eafaa2e88f7af16756142a31ab63d032b31395e3 Mon Sep 17 00:00:00 2001 |
|
From: Pádraig Brady <P@draigBrady.com> |
|
Date: Fri, 06 Nov 2015 16:31:22 +0000 |
|
Subject: tests: fix dirent d_type support verification |
|
|
|
* tests/d_type-check: Check also the d_type of files, |
|
which excludes XFS appropriately. Specify all argument |
|
and return types to avoid truncated pointers being passed, |
|
which skipped the test due to crashes on x86_64 at least. |
|
Simplify the C library lookup by reusing the interpreter's. |
|
|
|
chroot issue reported at https://bugzilla.redhat.com/1263341 |
|
--- |
|
diff --git a/tests/d_type-check b/tests/d_type-check |
|
index ff1eb60..1a2f76f 100644 |
|
--- a/tests/d_type-check |
|
+++ b/tests/d_type-check |
|
@@ -1,13 +1,17 @@ |
|
#!/usr/bin/python |
|
-# Exit 0 if "." has useful d_type information, else 1. |
|
+# Exit 0 if "." and "./tempfile" have useful d_type information, else 1. |
|
# Intended to exit 0 only on Linux/GNU systems. |
|
+import os |
|
import sys |
|
+import tempfile |
|
|
|
fail = 1 |
|
+fname = None |
|
+ |
|
try: |
|
import ctypes |
|
|
|
- (DT_UNKNOWN, DT_DIR,) = (0, 4,) |
|
+ (DT_UNKNOWN, DT_DIR, DT_REG) = (0, 4, 8) |
|
|
|
class dirent(ctypes.Structure): |
|
_fields_ = [ |
|
@@ -17,20 +21,48 @@ try: |
|
("d_type", ctypes.c_ubyte), |
|
("d_name", ctypes.c_char*256)] |
|
|
|
+ # Pass NULL to dlopen, assuming the python |
|
+ # interpreter is linked with the C runtime |
|
+ libc = ctypes.CDLL(None) |
|
+ |
|
+ # Setup correct types for all args and returns |
|
+ # even if only passing, to avoid truncation etc. |
|
+ dirp = ctypes.c_void_p |
|
direntp = ctypes.POINTER(dirent) |
|
|
|
- # FIXME: find a way to avoid hard-coding libc's so-name. |
|
- libc = ctypes.cdll.LoadLibrary("libc.so.6") |
|
+ libc.readdir.argtypes = [dirp] |
|
libc.readdir.restype = direntp |
|
|
|
+ libc.opendir.restype = dirp |
|
+ |
|
+ # Ensure a file is present |
|
+ f, fname = tempfile.mkstemp(dir='.') |
|
+ fname = os.path.basename(fname) |
|
+ |
|
dirp = libc.opendir(".") |
|
if dirp: |
|
- ep = libc.readdir(dirp) |
|
- if ep: |
|
+ while True: |
|
+ ep = libc.readdir(dirp) |
|
+ if not ep: break |
|
+ d_type = ep.contents.d_type |
|
name = ep.contents.d_name |
|
- if (name == "." or name == "..") and ep.contents.d_type == DT_DIR: |
|
+ if name == "." or name == "..": |
|
+ if d_type != DT_DIR: break |
|
+ # Check files too since on XFS, only dirs have DT_DIR |
|
+ # while everything else has DT_UNKNOWN |
|
+ elif name == fname: |
|
+ if d_type == DT_REG: |
|
+ fail = 0 |
|
+ break |
|
+ elif d_type != DT_DIR and d_type != DT_UNKNOWN: |
|
fail = 0 |
|
+ break |
|
+except: |
|
+ pass |
|
|
|
+try: |
|
+ if fname: |
|
+ os.unlink(fname); |
|
except: |
|
pass |
|
|
|
-- |
|
cgit v0.9.0.2
|
|
|