PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : xattr / "com.apple.FinderInfo" setzen?



tschloss
22.01.08, 15:11
Hi,
ich habe Probleme mit einer iTunes Datenbank, die ich von Win auf Mac OS Leo kopiert habe. Die Datei wird von iTunes (beide Seiten 7.6) nicht akzeptiert. Nach umbenennen (.itl weg) und Angleichen der Rechte sieht alles identisch mit einer nativen OSX Library aus, bis auf einen Unterschied:

Die native hat ein extended Attribut "com.apple.FinderInfo 32" (ls -l@).
In den 32 Byte steht am Anfang eine Zeichenkette und der Rest sind \00 Bytes.

Ich kann aber keinerlei xattr -w auf "com.apple.FinderInfo" ausführen, das ist offenbar blockiert (Fehleemeldung 34 too long, scheint aber falsch zu sein).

Wie kann ich sonst das attribut besetzen? Kann ich eine vorhandende Datei mit dem Attribut nehmen und diese vom Inhalt her entsprechend überschreiben & verlängern(bastel, bastel....)?

Any ideas?
Danke Thomas

PS: Die Binärkompatibilität der iTunes Datenbanken war bei 7.5 gegeben - dort habe ich es hinbekommen.

tschloss
10.02.08, 10:49
Ich habe mir inzwischen ein kleines C-Programm erstellt, was den Job erledigt. Offenbar hat die Library Funktion keine Einschränkungen (wie das CL Tool).

VG Thomas


#include <stdio.h>
#include <sys/xattr.h>

/******
int
setxattr(const char *path, const char *name, void *value, size_t size, u_int32_t position, int options);

int
fsetxattr(int fd, const char *name, void *value, size_t size, u_int32_t position, int options);

In case of return value == -1, error ist set to global errno!!!!

*****/

int main (int argc, const char * argv[]) {
int rc;

printf("Usage: Set-xattr [path]\n Sets com.apple.FinderInfo to 'hkdbhook' in 'iTunes Library.itl'\n");
printf(" Attribute has to be non-existant; in case delete with xattr -d ....\n");
printf("File to change: %s\n", (argc==2) ? argv[1] : "iTunes Library.itl");

rc = setxattr(
(argc==2) ? argv[1] : "iTunes Library.itl",
"com.apple.FinderInfo",
"hkdbhook\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \0\0\0",
32,
0,
XATTR_CREATE);


if (rc==0) {
printf ("Ok!\n");
return 0;
}
else {
printf ("Fehler: ?\n");
return 1;
}
}