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