summaryrefslogtreecommitdiff
path: root/sys-fs/fuse-python/files/fuse_python_accept_none.patch
blob: 9f7180050b9c4fb4268c6e47718a1e00c24a029e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
--- fuseparts/_fusemodule.c.old	2007-06-18 16:20:09.000000000 +0200
+++ fuseparts/_fusemodule.c	2008-04-08 01:18:43.000000000 +0200
@@ -182,8 +182,50 @@
  * the getattr type functions.
  */
 
-#define fetchattr_soft_d(st, attr, defa)				\
-	fetchattr_soft(st, attr) else st->attr = defa
+// <spaghetti_code> (sorry ...)
+
+#define good(attr) _GOOD_SPAGHETTI_ ## attr
+#define bad(attr) _BAD_SPAGHETTI_ ## attr
+
+/*
+ * This macro checks whether an attribute is available and not None.
+ * Success --> set attribute and goto _GOOD_SPAGHETTI
+ * Failure --> goto _BAD_SPAGHETTI
+ * Error --> goto OUT_DECREF
+ */
+#define fetchattr_soft_none_pre(st, attr)					\
+	if (PyObject_HasAttrString(v, #attr)) {				\
+		if (!(pytmp = PyObject_GetAttrString(v, #attr)))		\
+			goto OUT_DECREF;					\
+		else if (pytmp != Py_None)	{			\
+			py2attr(st, attr)					\
+			goto good(attr);					\
+		}										\
+		else {									\
+			Py_DECREF(pytmp);					\
+			goto bad(attr);						\
+		}										\
+	}											\
+	goto bad(attr);
+
+/**
+ * Calls fetchattr_soft_none_pre and ignores failure.
+ */
+#define fetchattr_soft_none(st, attr)			\
+	fetchattr_soft_none_pre(st, attr);			\
+	good(attr): ;								\
+	bad(attr): ;
+
+/**
+ * Calls fetchattr_soft_none_pre and sets a default value on failure.
+ */
+#define fetchattr_soft_d(st, attr, defa)		\
+	fetchattr_soft_none_pre(st, attr);			\
+	bad(attr):									\
+		st->attr = defa;						\
+	good(attr): ;							
+
+// </spaghetti_code>
 
 #define FETCH_STAT_DATA()						\
 	fetchattr(st, st_mode);						\
@@ -206,7 +248,7 @@
 	 * autotools so we just dare to throw these in as is.		\
 	 */								\
 									\
-	fetchattr_soft(st, st_rdev);					\
+	fetchattr_soft_none(st, st_rdev);					\
 	fetchattr_soft_d(st, st_blksize, 4096);				\
 	fetchattr_soft_d(st, st_blocks, (st->st_size + 511)/512)
 
@@ -245,6 +287,10 @@
 #endif
 
 #undef fetchattr_soft_d
+#undef fetchattr_soft_none
+#undef fetchattr_soft_none_pre
+#undef good
+#undef bad
 #undef FETCH_STAT_DATA
 
 static int