[xattr] Catch 'Argument list too long'

This commit is contained in:
Yen Chi Hsuan 2015-05-14 14:51:00 +08:00
parent 86c7fdb17c
commit fbff30d2db

View File

@ -25,6 +25,8 @@ def __init__(self, code=None, msg='Unknown error'):
if (self.code in (errno.ENOSPC, errno.EDQUOT) or if (self.code in (errno.ENOSPC, errno.EDQUOT) or
'No space left' in self.msg or 'Disk quota excedded' in self.msg): 'No space left' in self.msg or 'Disk quota excedded' in self.msg):
self.reason = 'NO_SPACE' self.reason = 'NO_SPACE'
elif self.code == errno.E2BIG or 'Argument list too long' in self.msg:
self.reason = 'VALUE_TOO_LONG'
else: else:
self.reason = 'NOT_SUPPORTED' self.reason = 'NOT_SUPPORTED'
@ -103,8 +105,11 @@ def write_xattr(path, key, value):
[encodeArgument(o) for o in opts] + [encodeArgument(o) for o in opts] +
[encodeFilename(path, True)]) [encodeFilename(path, True)])
p = subprocess.Popen( try:
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
except EnvironmentError as e:
raise XAttrMetadataError(e.errno, e.strerror)
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
stderr = stderr.decode('utf-8', 'replace') stderr = stderr.decode('utf-8', 'replace')
if p.returncode != 0: if p.returncode != 0:
@ -158,6 +163,9 @@ def write_xattr(path, key, value):
self._downloader.report_warning( self._downloader.report_warning(
'There\'s no disk space left or disk quota exceeded. ' + 'There\'s no disk space left or disk quota exceeded. ' +
'Extended attributes are not written.') 'Extended attributes are not written.')
elif e.reason == 'VALUE_TOO_LONG':
self._downloader.report_warning(
'Unable to write extended attributes due to too long values.')
else: else:
self._downloader.report_error( self._downloader.report_error(
'This filesystem doesn\'t support extended attributes. ' + 'This filesystem doesn\'t support extended attributes. ' +