create finder info/HFS creator/type data for all files.

git-svn-id: https://profuse.googlecode.com/svn/trunk@36 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
ksherlock 2009-04-28 03:32:02 +00:00
parent 911347ac13
commit d9f6b903a8

View File

@ -136,6 +136,17 @@ static void xattr_rfork(FileEntry& e, fuse_req_t req, size_t size, off_t off)
return; return;
} }
static void set_creator(uint8_t *finfo, unsigned ftype, unsigned auxtype)
{
finfo[0] = 'p';
finfo[1] = ftype;
finfo[2] = auxtype >> 8;
finfo[3] = auxtype;
finfo[4] = 'p';
finfo[5] = 'd';
finfo[6] = 'o';
finfo[7] = 's';
}
// Finder info. // Finder info.
static void xattr_finfo(FileEntry& e, fuse_req_t req, size_t size, off_t off) static void xattr_finfo(FileEntry& e, fuse_req_t req, size_t size, off_t off)
@ -146,7 +157,26 @@ static void xattr_finfo(FileEntry& e, fuse_req_t req, size_t size, off_t off)
uint8_t attr[32]; uint8_t attr[32];
unsigned attr_size = 32; unsigned attr_size = 32;
ERROR (e.storage_type != EXTENDED_FILE, ENOENT) //ERROR (e.storage_type != EXTENDED_FILE, ENOENT)
switch (e.storage_type)
{
case SEEDLING_FILE:
case SAPLING_FILE:
case TREE_FILE:
bzero(attr, attr_size);
set_creator(attr, e.file_type, e.aux_type);
fuse_reply_buf(req, (char *)attr, attr_size);
return;
case EXTENDED_FILE:
// handled below.
break;
default:
ERROR(true, ENOENT);
}
ok = disk->Normalize(e, 1, &ee); ok = disk->Normalize(e, 1, &ee);
ERROR(ok < 0, EIO) ERROR(ok < 0, EIO)
@ -172,6 +202,10 @@ static void xattr_finfo(FileEntry& e, fuse_req_t req, size_t size, off_t off)
memcpy(attr, ee.FInfo, 16); memcpy(attr, ee.FInfo, 16);
memcpy(attr + 16, ee.xFInfo, 16); memcpy(attr + 16, ee.xFInfo, 16);
// if no creator, create one.
if (memcmp(attr, "\0\0\0\0\0\0\0\0", 8) == 0)
set_creator(attr, e.file_type, e.aux_type);
fuse_reply_buf(req, (char *)attr, attr_size); fuse_reply_buf(req, (char *)attr, attr_size);
} }
@ -245,6 +279,9 @@ return; \
case SEEDLING_FILE: case SEEDLING_FILE:
case SAPLING_FILE: case SAPLING_FILE:
case TREE_FILE: case TREE_FILE:
// generate HFS creator codes.
attr += "com.apple.FinderInfo";
attr.append(1, 0);
break; break;
case DIRECTORY_FILE: case DIRECTORY_FILE:
@ -348,7 +385,7 @@ void prodos_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name, size_t si
return; return;
} }
if ( (e.storage_type == EXTENDED_FILE) && (strcmp("com.apple.FinderInfo", name) == 0)) if ( strcmp("com.apple.FinderInfo", name) == 0)
{ {
xattr_finfo(e, req, size, off); xattr_finfo(e, req, size, off);
return; return;