--- 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 +// (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): ; + +// #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