--- xattr/__init__.py.orig	2011-08-16 22:57:36.000000000 -0700
+++ xattr/__init__.py	2011-11-14 16:56:53.000000000 -0800
@@ -118,19 +118,13 @@
         return len(self.list())
 
     def __delitem__(self, item):
-        try:
-            self.remove(item)
-        except IOError:
-            raise KeyError(item)
+        self.remove(item)
 
     def __setitem__(self, item, value):
         self.set(item, value)
 
     def __getitem__(self, item):
-        try:
-            return self.get(item)
-        except IOError:
-            raise KeyError(item)
+        return self.get(item)
 
     def iterkeys(self):
         return iter(self.list())
@@ -140,7 +134,7 @@
     def has_key(self, item):
         try:
             self.get(item)
-        except IOError:
+        except:
             return False
         else:
             return True
@@ -161,11 +155,8 @@
         return dict(self.iteritems())
 
     def setdefault(self, k, d=''):
-        try:
-            d = self.get(k)
-        except IOError:
-            self[k] = d
-        return d
+        d = self.get(k)
+        self[k] = d
 
     def keys(self):
         return self.list()
--- xattr/_xattr.c.orig	2011-08-16 22:54:30.000000000 -0700
+++ xattr/_xattr.c	2011-11-14 16:57:54.000000000 -0800
@@ -543,19 +543,27 @@
 #define xattr_flistxattr flistxattr
 #endif
 
-static PyObject *xattr_error(void);
-static PyObject *xattr_error_with_filename(char *name);
+static PyObject *xattr_error(const char *name);
+static PyObject *xattr_error_with_filename(const char *file, const char *name);
 
 static PyObject *
-xattr_error(void)
+xattr_error(const char *name)
 {
+    if (name && errno == ENOATTR) {
+	PyErr_SetString(PyExc_KeyError, name);
+	return NULL;
+    }
     return PyErr_SetFromErrno(PyExc_IOError);
 }
 
 static PyObject *
-xattr_error_with_filename(char *name)
+xattr_error_with_filename(const char *file, const char *name)
 {
-    return PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
+    if (name && errno == ENOATTR) {
+	PyErr_SetString(PyExc_KeyError, name);
+	return NULL;
+    }
+    return PyErr_SetFromErrnoWithFilename(PyExc_IOError, (char *)file);
 }
 
 PyDoc_STRVAR(pydoc_getxattr,
@@ -588,7 +596,7 @@
         res = xattr_getxattr((const char *)path, (const char *)name, NULL, 0, position, options);
         Py_END_ALLOW_THREADS
         if (res == -1) {    
-            PyObject *tmp = xattr_error_with_filename(path);
+            PyObject *tmp = xattr_error_with_filename(path, name);
             PyMem_Free(path);
             PyMem_Free(name);
             return tmp;
@@ -605,7 +613,7 @@
     res = xattr_getxattr((const char *)path, (const char *)name, (void *)PyString_AS_STRING(buffer), size, position, options);
     Py_END_ALLOW_THREADS
     if (res == -1) {
-        PyObject *tmp = xattr_error_with_filename(path);
+        PyObject *tmp = xattr_error_with_filename(path, name);
         Py_DECREF(buffer);
         PyMem_Free(path);
         PyMem_Free(name);
@@ -650,7 +658,7 @@
         Py_END_ALLOW_THREADS
         if (res == -1) {    
             PyMem_Free(name);
-            return xattr_error();
+            return xattr_error(name);
         }
         size = res;
     }
@@ -665,7 +673,7 @@
     PyMem_Free(name);
     if (res == -1) {
         Py_DECREF(buffer);
-        return xattr_error();
+        return xattr_error(name);
     }
     if (res != size) {
         _PyString_Resize(&buffer, (int)res);
@@ -703,7 +711,7 @@
     res = xattr_setxattr((const char *)path, (const char *)name, (void *)value, size, position, options);
     Py_END_ALLOW_THREADS
     if (res) {
-        result = xattr_error_with_filename(path);
+        result = xattr_error_with_filename(path, name);
     } else {
         Py_INCREF(Py_None);
         result = Py_None;
@@ -743,7 +751,7 @@
     Py_END_ALLOW_THREADS
     PyMem_Free(name);
     if (res) {
-        return xattr_error();
+        return xattr_error(name);
     }
     Py_INCREF(Py_None);
     return Py_None;
@@ -774,7 +782,7 @@
     res = xattr_removexattr((const char *)path, (const char *)name, options);
     Py_END_ALLOW_THREADS
     if (res) {
-        result = xattr_error_with_filename(path);
+        result = xattr_error_with_filename(path, name);
     } else {
         Py_INCREF(Py_None);
         result = Py_None;
@@ -809,7 +817,7 @@
     Py_END_ALLOW_THREADS
     PyMem_Free(name);
     if (res) {
-        return xattr_error();
+        return xattr_error(name);
     }
     Py_INCREF(Py_None);
     return Py_None;
@@ -838,7 +846,7 @@
     res = xattr_listxattr((const char *)path, NULL, 0, options);
     Py_END_ALLOW_THREADS
     if (res == -1) {    
-        PyObject *tmp = xattr_error_with_filename(path);
+        PyObject *tmp = xattr_error_with_filename(path, NULL);
         PyMem_Free(path);
         return tmp;
     }
@@ -856,7 +864,7 @@
     res = xattr_listxattr((const char *)path, (void *)PyString_AS_STRING(buffer), (size_t)PyString_GET_SIZE(buffer), options);
     Py_END_ALLOW_THREADS
     if (res == -1) {
-        PyObject *tmp = xattr_error_with_filename(path);
+        PyObject *tmp = xattr_error_with_filename(path, NULL);
         Py_DECREF(buffer);
         PyMem_Free(path);
         return tmp;
@@ -891,7 +899,7 @@
     res = xattr_flistxattr(fd, NULL, 0, options);
     Py_END_ALLOW_THREADS
     if (res == -1) {    
-        return xattr_error();
+        return xattr_error(NULL);
     }
     buffer = PyString_FromStringAndSize((char *)NULL, (int)res);
     if (buffer == NULL) {
@@ -902,7 +910,7 @@
     Py_END_ALLOW_THREADS
     if (res == -1) {
         Py_DECREF(buffer);
-        return xattr_error();
+        return xattr_error(NULL);
     }
     if (res != (ssize_t)PyString_GET_SIZE(buffer)) {
         _PyString_Resize(&buffer, (int)res);
