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.
94 lines
2.5 KiB
94 lines
2.5 KiB
6 years ago
|
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
|