1--- xattr/__init__.py.orig 2011-08-16 22:57:36.000000000 -0700 2+++ xattr/__init__.py 2011-11-14 16:56:53.000000000 -0800 3@@ -118,19 +118,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@@ -140,7 +134,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@@ -161,11 +155,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- return d 43+ d = self.get(k) 44+ self[k] = d 45 46 def keys(self): 47 return self.list() 48--- xattr/_xattr.c.orig 2011-08-16 22:54:30.000000000 -0700 49+++ xattr/_xattr.c 2011-11-14 16:57:54.000000000 -0800 50@@ -543,19 +543,27 @@ 51 #define xattr_flistxattr flistxattr 52 #endif 53 54-static PyObject *xattr_error(void); 55-static PyObject *xattr_error_with_filename(char *name); 56+static PyObject *xattr_error(const char *name); 57+static PyObject *xattr_error_with_filename(const char *file, const char *name); 58 59 static PyObject * 60-xattr_error(void) 61+xattr_error(const char *name) 62 { 63+ if (name && errno == ENOATTR) { 64+ PyErr_SetString(PyExc_KeyError, name); 65+ return NULL; 66+ } 67 return PyErr_SetFromErrno(PyExc_IOError); 68 } 69 70 static PyObject * 71-xattr_error_with_filename(char *name) 72+xattr_error_with_filename(const char *file, const char *name) 73 { 74- return PyErr_SetFromErrnoWithFilename(PyExc_IOError, name); 75+ if (name && errno == ENOATTR) { 76+ PyErr_SetString(PyExc_KeyError, name); 77+ return NULL; 78+ } 79+ return PyErr_SetFromErrnoWithFilename(PyExc_IOError, (char *)file); 80 } 81 82 PyDoc_STRVAR(pydoc_getxattr, 83@@ -588,7 +596,7 @@ 84 res = xattr_getxattr((const char *)path, (const char *)name, NULL, 0, position, options); 85 Py_END_ALLOW_THREADS 86 if (res == -1) { 87- PyObject *tmp = xattr_error_with_filename(path); 88+ PyObject *tmp = xattr_error_with_filename(path, name); 89 PyMem_Free(path); 90 PyMem_Free(name); 91 return tmp; 92@@ -605,7 +613,7 @@ 93 res = xattr_getxattr((const char *)path, (const char *)name, (void *)PyString_AS_STRING(buffer), size, position, options); 94 Py_END_ALLOW_THREADS 95 if (res == -1) { 96- PyObject *tmp = xattr_error_with_filename(path); 97+ PyObject *tmp = xattr_error_with_filename(path, name); 98 Py_DECREF(buffer); 99 PyMem_Free(path); 100 PyMem_Free(name); 101@@ -650,7 +658,7 @@ 102 Py_END_ALLOW_THREADS 103 if (res == -1) { 104 PyMem_Free(name); 105- return xattr_error(); 106+ return xattr_error(name); 107 } 108 size = res; 109 } 110@@ -665,7 +673,7 @@ 111 PyMem_Free(name); 112 if (res == -1) { 113 Py_DECREF(buffer); 114- return xattr_error(); 115+ return xattr_error(name); 116 } 117 if (res != size) { 118 _PyString_Resize(&buffer, (int)res); 119@@ -703,7 +711,7 @@ 120 res = xattr_setxattr((const char *)path, (const char *)name, (void *)value, size, position, options); 121 Py_END_ALLOW_THREADS 122 if (res) { 123- result = xattr_error_with_filename(path); 124+ result = xattr_error_with_filename(path, name); 125 } else { 126 Py_INCREF(Py_None); 127 result = Py_None; 128@@ -743,7 +751,7 @@ 129 Py_END_ALLOW_THREADS 130 PyMem_Free(name); 131 if (res) { 132- return xattr_error(); 133+ return xattr_error(name); 134 } 135 Py_INCREF(Py_None); 136 return Py_None; 137@@ -774,7 +782,7 @@ 138 res = xattr_removexattr((const char *)path, (const char *)name, options); 139 Py_END_ALLOW_THREADS 140 if (res) { 141- result = xattr_error_with_filename(path); 142+ result = xattr_error_with_filename(path, name); 143 } else { 144 Py_INCREF(Py_None); 145 result = Py_None; 146@@ -809,7 +817,7 @@ 147 Py_END_ALLOW_THREADS 148 PyMem_Free(name); 149 if (res) { 150- return xattr_error(); 151+ return xattr_error(name); 152 } 153 Py_INCREF(Py_None); 154 return Py_None; 155@@ -838,7 +846,7 @@ 156 res = xattr_listxattr((const char *)path, NULL, 0, options); 157 Py_END_ALLOW_THREADS 158 if (res == -1) { 159- PyObject *tmp = xattr_error_with_filename(path); 160+ PyObject *tmp = xattr_error_with_filename(path, NULL); 161 PyMem_Free(path); 162 return tmp; 163 } 164@@ -856,7 +864,7 @@ 165 res = xattr_listxattr((const char *)path, (void *)PyString_AS_STRING(buffer), (size_t)PyString_GET_SIZE(buffer), options); 166 Py_END_ALLOW_THREADS 167 if (res == -1) { 168- PyObject *tmp = xattr_error_with_filename(path); 169+ PyObject *tmp = xattr_error_with_filename(path, NULL); 170 Py_DECREF(buffer); 171 PyMem_Free(path); 172 return tmp; 173@@ -891,7 +899,7 @@ 174 res = xattr_flistxattr(fd, NULL, 0, options); 175 Py_END_ALLOW_THREADS 176 if (res == -1) { 177- return xattr_error(); 178+ return xattr_error(NULL); 179 } 180 buffer = PyString_FromStringAndSize((char *)NULL, (int)res); 181 if (buffer == NULL) { 182@@ -902,7 +910,7 @@ 183 Py_END_ALLOW_THREADS 184 if (res == -1) { 185 Py_DECREF(buffer); 186- return xattr_error(); 187+ return xattr_error(NULL); 188 } 189 if (res != (ssize_t)PyString_GET_SIZE(buffer)) { 190 _PyString_Resize(&buffer, (int)res); 191