1--- Lib/xattr/__init__.py.orig 2007-04-14 18:06:15.000000000 -0700 2+++ Lib/xattr/__init__.py 2008-09-03 14:14:58.000000000 -0700 3@@ -106,19 +106,13 @@ 4 return len(self.list()) 5 6 def __delitem__(self, item): 7- try: 8- self.remove(item) 9- except IOError: 10- raise KeyError(item) 11+ self.remove(item) 12 13 def __setitem__(self, item, value): 14 self.set(item, value) 15 16 def __getitem__(self, item): 17- try: 18- return self.get(item) 19- except IOError: 20- raise KeyError(item) 21+ return self.get(item) 22 23 def iterkeys(self): 24 return iter(self.list()) 25@@ -128,7 +122,7 @@ 26 def has_key(self, item): 27 try: 28 self.get(item) 29- except IOError: 30+ except: 31 return False 32 else: 33 return True 34@@ -149,10 +143,8 @@ 35 return dict(self.iteritems()) 36 37 def setdefault(self, k, d=''): 38- try: 39- d = self.get(k) 40- except IOError: 41- self[k] = d 42+ d = self.get(k) 43+ self[k] = d 44 return d 45 46 def keys(self): 47--- Modules/xattr/_xattr.c.orig 2007-01-24 14:18:12.000000000 -0800 48+++ Modules/xattr/_xattr.c 2008-09-03 14:31:02.000000000 -0700 49@@ -353,19 +353,27 @@ 50 #define xattr_flistxattr flistxattr 51 #endif 52 53-static PyObject *xattr_error(void); 54-static PyObject *xattr_error_with_filename(char *name); 55+static PyObject *xattr_error(const char *name); 56+static PyObject *xattr_error_with_filename(const char *file, const char *name); 57 58 static PyObject * 59-xattr_error(void) 60+xattr_error(const char *name) 61 { 62+ if (name && errno == ENOATTR) { 63+ PyErr_SetString(PyExc_KeyError, name); 64+ return NULL; 65+ } 66 return PyErr_SetFromErrno(PyExc_IOError); 67 } 68 69 static PyObject * 70-xattr_error_with_filename(char *name) 71+xattr_error_with_filename(const char *file, const char *name) 72 { 73- return PyErr_SetFromErrnoWithFilename(PyExc_IOError, name); 74+ if (name && errno == ENOATTR) { 75+ PyErr_SetString(PyExc_KeyError, name); 76+ return NULL; 77+ } 78+ return PyErr_SetFromErrnoWithFilename(PyExc_IOError, (char *)file); 79 } 80 81 PyDoc_STRVAR(pydoc_getxattr, 82@@ -398,7 +406,7 @@ 83 res = xattr_getxattr((const char *)path, (const char *)name, NULL, 0, position, options); 84 Py_END_ALLOW_THREADS 85 if (res == -1) { 86- PyObject *tmp = xattr_error_with_filename(path); 87+ PyObject *tmp = xattr_error_with_filename(path, name); 88 PyMem_Free(path); 89 PyMem_Free(name); 90 return tmp; 91@@ -415,7 +423,7 @@ 92 res = xattr_getxattr((const char *)path, (const char *)name, (void *)PyString_AS_STRING(buffer), size, position, options); 93 Py_END_ALLOW_THREADS 94 if (res == -1) { 95- PyObject *tmp = xattr_error_with_filename(path); 96+ PyObject *tmp = xattr_error_with_filename(path, name); 97 Py_DECREF(buffer); 98 PyMem_Free(path); 99 PyMem_Free(name); 100@@ -460,7 +468,7 @@ 101 Py_END_ALLOW_THREADS 102 if (res == -1) { 103 PyMem_Free(name); 104- return xattr_error(); 105+ return xattr_error(name); 106 } 107 size = res; 108 } 109@@ -475,7 +483,7 @@ 110 PyMem_Free(name); 111 if (res == -1) { 112 Py_DECREF(buffer); 113- return xattr_error(); 114+ return xattr_error(name); 115 } 116 if (res != size) { 117 _PyString_Resize(&buffer, (int)res); 118@@ -513,7 +521,7 @@ 119 res = xattr_setxattr((const char *)path, (const char *)name, (void *)value, size, position, options); 120 Py_END_ALLOW_THREADS 121 if (res) { 122- result = xattr_error_with_filename(path); 123+ result = xattr_error_with_filename(path, name); 124 } else { 125 Py_INCREF(Py_None); 126 result = Py_None; 127@@ -553,7 +561,7 @@ 128 Py_END_ALLOW_THREADS 129 PyMem_Free(name); 130 if (res) { 131- return xattr_error(); 132+ return xattr_error(name); 133 } 134 Py_INCREF(Py_None); 135 return Py_None; 136@@ -584,7 +592,7 @@ 137 res = xattr_removexattr((const char *)path, (const char *)name, options); 138 Py_END_ALLOW_THREADS 139 if (res) { 140- result = xattr_error_with_filename(path); 141+ result = xattr_error_with_filename(path, name); 142 } else { 143 Py_INCREF(Py_None); 144 result = Py_None; 145@@ -619,7 +627,7 @@ 146 Py_END_ALLOW_THREADS 147 PyMem_Free(name); 148 if (res) { 149- return xattr_error(); 150+ return xattr_error(name); 151 } 152 Py_INCREF(Py_None); 153 return Py_None; 154@@ -648,7 +656,7 @@ 155 res = xattr_listxattr((const char *)path, NULL, 0, options); 156 Py_END_ALLOW_THREADS 157 if (res == -1) { 158- PyObject *tmp = xattr_error_with_filename(path); 159+ PyObject *tmp = xattr_error_with_filename(path, NULL); 160 PyMem_Free(path); 161 return tmp; 162 } 163@@ -661,7 +669,7 @@ 164 res = xattr_listxattr((const char *)path, (void *)PyString_AS_STRING(buffer), (size_t)PyString_GET_SIZE(buffer), options); 165 Py_END_ALLOW_THREADS 166 if (res == -1) { 167- PyObject *tmp = xattr_error_with_filename(path); 168+ PyObject *tmp = xattr_error_with_filename(path, NULL); 169 Py_DECREF(buffer); 170 PyMem_Free(path); 171 return tmp; 172@@ -696,7 +704,7 @@ 173 res = xattr_flistxattr(fd, NULL, 0, options); 174 Py_END_ALLOW_THREADS 175 if (res == -1) { 176- return xattr_error(); 177+ return xattr_error(NULL); 178 } 179 buffer = PyString_FromStringAndSize((char *)NULL, (int)res); 180 if (buffer == NULL) { 181@@ -707,7 +715,7 @@ 182 Py_END_ALLOW_THREADS 183 if (res == -1) { 184 Py_DECREF(buffer); 185- return xattr_error(); 186+ return xattr_error(NULL); 187 } 188 if (res != (ssize_t)PyString_GET_SIZE(buffer)) { 189 _PyString_Resize(&buffer, (int)res); 190