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