Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_swab_32bit():
assert(pycdlib.utils.swab_32bit(0x89) == 0x89000000)
Parameters:
None.
Returns:
String containing the Rock Ridge record.
'''
if not self._initialized:
raise pycdlibexception.PyCdlibInternalError('SF record not initialized')
length = 12
if self.virtual_file_size_high is not None:
length = 21
ret = b'SF' + struct.pack('=BB', length, SU_ENTRY_VERSION)
if self.virtual_file_size_high is not None and self.table_depth is not None:
ret += struct.pack('
# According to http://www.dubeyko.com/development/FileSystems/ISO9960/ISO9960.html,
# the xattr_len is the number of bytes at the *beginning* of the file
# extent. Since this is only a byte, it is necessarily limited to 255
# bytes.
(self.dr_len, self.xattr_len, extent_location_le, extent_location_be,
data_length_le, data_length_be_unused, dr_date, self.file_flags,
self.file_unit_size, self.interleave_gap_size, seqnum_le, seqnum_be,
self.len_fi) = struct.unpack_from(self.FMT, record[:33], 0)
# In theory we should have a check here that checks to make sure that
# the length of the record we were passed in matches the data record
# length. However, we have seen ISOs in the wild where this is
# incorrect, so we elide the check here.
if extent_location_le != utils.swab_32bit(extent_location_be):
raise pycdlibexception.PyCdlibInvalidISO('Little-endian (%d) and big-endian (%d) extent location disagree' % (extent_location_le, utils.swab_32bit(extent_location_be)))
self.orig_extent_loc = extent_location_le
# Theoretically, we should check to make sure that the little endian
# data length is the same as the big endian data length. In practice,
# though, we've seen ISOs where this is wrong. Skip the check, and just
# pick the little-endian as the 'actual' size, and hope for the best.
self.data_length = data_length_le
if seqnum_le != utils.swab_16bit(seqnum_be):
raise pycdlibexception.PyCdlibInvalidISO('Little-endian and big-endian seqnum disagree')
self.seqnum = seqnum_le
self.date = dates.DirectoryRecordDate()
self.date.parse(dr_date)
def record_big_endian(self):
# type: () -> bytes
'''
Generate a string representing the big endian version of
this Path Table Record.
Parameters:
None.
Returns:
A string representing the big endian version of this Path Table Record.
'''
if not self._initialized:
raise pycdlibexception.PyCdlibInternalError('Path Table Record not initialized')
return self._record(utils.swab_32bit(self.extent_location),
utils.swab_16bit(self.parent_directory_num))
An internal method to split a Rock Ridge absolute path into an absolute
ISO9660 path and a Rock Ridge name. This is accomplished by finding the
Rock Ridge directory record of the parent, then reconstructing the ISO
parent path by walking up to the root.
Parameters:
rr_path - The absolute Rock Ridge path to generate for.
is_dir - Whether this path is a directory or a file.
Returns:
A tuple where the first element is the absolute ISO9660 path of the
parent, and the second element is the Rock Ridge name.
'''
if rr_path[0] != '/':
raise pycdlibexception.PyCdlibInvalidInput("rr_path must start with '/'")
namesplit = utils.split_path(utils.normpath(rr_path))
rr_name = namesplit.pop()
rr_parent_path = b'/' + b'/'.join(namesplit)
parent_record = self.pycdlib_obj._find_rr_record(rr_parent_path) # pylint: disable=protected-access
if parent_record.is_root:
iso_parent_path = b'/'
else:
iso_parent_path = b''
parent = parent_record # type: Optional[dr.DirectoryRecord]
while parent is not None:
if not parent.is_root:
iso_parent_path = b'/' + parent.file_identifier() + iso_parent_path
parent = parent.parent
if is_dir:
iso_name = utils.mangle_dir_for_iso9660(rr_name.decode('utf-8'),
self.pycdlib_obj.interchange_level)
'''
if not self._initialized:
raise pycdlibexception.PyCdlibInternalError('UDF File Entry not initialized')
if self.icb_tag.file_type != 4:
raise pycdlibexception.PyCdlibInvalidInput('Can only add a UDF File Identifier to a directory')
self.fi_descs.append(new_fi_desc)
num_bytes_to_add = UDFFileIdentifierDescriptor.length(len(new_fi_desc.fi))
old_num_extents = 0
# If info_len is 0, then this is a brand-new File Entry, and thus the
# number of extents it is using is 0.
if self.info_len > 0:
old_num_extents = utils.ceiling_div(self.info_len, logical_block_size)
self.info_len += num_bytes_to_add
new_num_extents = utils.ceiling_div(self.info_len, logical_block_size)
self.log_block_recorded = new_num_extents
self.alloc_descs[0][0] = self.info_len
if new_fi_desc.is_dir():
self.file_link_count += 1
return new_num_extents - old_num_extents
# type: (str, int, bool) -> str
'''
Take an absolute ISO path and generate a corresponding Rock Ridge basename.
Parameters:
iso_path - The absolute iso_path to generate a Rock Ridge name from.
interchange_level - The interchange level at which to operate.
is_dir - Whether this will be a directory or not.
Returns:
The Rock Ridge name as a string.
'''
if iso_path[0] != '/':
raise pycdlibexception.PyCdlibInvalidInput("iso_path must start with '/'")
namesplit = utils.split_path(utils.normpath(iso_path))
iso_name = namesplit.pop()
if is_dir:
rr_name = utils.mangle_dir_for_iso9660(iso_name.decode('utf-8'),
interchange_level)
else:
basename, ext = utils.mangle_file_for_iso9660(iso_name.decode('utf-8'),
interchange_level)
rr_name = '.'.join([basename, ext])
return rr_name
parent_record = self.pycdlib_obj._find_rr_record(rr_parent_path) # pylint: disable=protected-access
if parent_record.is_root:
iso_parent_path = b'/'
else:
iso_parent_path = b''
parent = parent_record # type: Optional[dr.DirectoryRecord]
while parent is not None:
if not parent.is_root:
iso_parent_path = b'/' + parent.file_identifier() + iso_parent_path
parent = parent.parent
if is_dir:
iso_name = utils.mangle_dir_for_iso9660(rr_name.decode('utf-8'),
self.pycdlib_obj.interchange_level)
else:
basename, ext = utils.mangle_file_for_iso9660(rr_name.decode('utf-8'),
self.pycdlib_obj.interchange_level)
iso_name = '.'.join([basename, ext])
iso_path = iso_parent_path.decode('utf-8') + '/' + iso_name
return iso_path, rr_name.decode('utf-8')