- Export the SCSI TOC in the CD:toc attribute (required by the CDDB protocol).

- Do not save or load attributes in the protected namespace.

Now cddb_server has everything it needs.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27120 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Bruno G. Albuquerque 2008-08-21 23:46:00 +00:00
parent 9445c73970
commit 31ee3b53f5

View File

@ -256,6 +256,7 @@ static const char* kProtectedAttrNamespace = "CD:";
static const char* kCddbIdAttribute = "CD:cddbid";
static const char* kDoLookupAttribute = "CD:do_lookup";
static const char* kTocAttribute = "CD:toc";
extern fs_volume_ops gCDDAVolumeOps;
extern fs_vnode_ops gCDDAVnodeOps;
@ -324,8 +325,9 @@ write_attributes(int fd, Inode* inode, attr_mode attrMode = kDiscIDAttributes)
uint32 count = 0;
while (iterator.HasNext()) {
Attribute* attribute = iterator.Next();
if (attrMode == kDiscIDAttributes
if ((attrMode == kDiscIDAttributes
|| is_special_attribute(attribute->Name(), attrMode))
&& !attribute->IsProtectedNamespace())
count++;
}
@ -342,8 +344,9 @@ write_attributes(int fd, Inode* inode, attr_mode attrMode = kDiscIDAttributes)
while (iterator.HasNext()) {
Attribute* attribute = iterator.Next();
if (attrMode != kDiscIDAttributes
if ((attrMode != kDiscIDAttributes
&& !is_special_attribute(attribute->Name(), attrMode))
|| attribute->IsProtectedNamespace())
continue;
uint32 type = B_HOST_TO_BENDIAN_INT32(attribute->Type());
@ -416,6 +419,13 @@ read_attributes(int fd, Inode* inode)
name[length] = '\0';
Attribute* attribute = new Attribute(name, type);
if (attribute->IsProtectedNamespace()) {
// Attributes in the protected namespace are handled internally
// so we do not load them even if they are present in the
// attributes file.
delete attribute;
continue;
}
if (attribute->SetSize(size) != B_OK
|| inode->AddAttribute(attribute, true) != B_OK) {
delete attribute;
@ -554,7 +564,6 @@ Volume::Mount(const char* device)
return B_NO_MEMORY;
status_t status = read_table_of_contents(fDevice, toc, 1024);
// there has to be at least one audio track
if (status == B_OK && count_audio_tracks(toc) == 0)
status = B_BAD_TYPE;
@ -658,6 +667,10 @@ Volume::Mount(const char* device)
// Add CD:do_lookup attribute.
fRootNode->AddAttribute(kDoLookupAttribute, B_BOOL_TYPE, true,
(const uint8*)&doLookup, sizeof(bool));
// Add CD:toc attribute.
fRootNode->AddAttribute(kTocAttribute, B_RAW_TYPE, true,
(const uint8*)toc, B_BENDIAN_TO_HOST_INT16(toc->data_length) + 2);
_RestoreSharedAttributes();
if (fd >= 0)