Lecture d'ACLs, persistance en mémoire aléatoire " acl_get_file & cie

yoannyoann Membre
22:34 modifié dans API AppKit #1
Salut tout le monde,

Comme déjà  dit dans un autre sujet je suis entrain de bosser sur un GetInfo amélioré permettant de gérer les ACLs du système de fichier OS X Client sans passer par la ligne de commande et avec toutes les options que l'ont est en droit d'attendre (la version du Get Info de Leopard étant tout simplement ridicule ^^)

J'ai donc le privilège de jouer avec des méthodes documenté par page de man uniquement.

Je rencontre un problème plutôt cocasse, lors de la première lecture des mes ACLs tout se passe bien et je récupère bien les informations existante, je charge tout cela dans un tableau, voici ce que ça peut donner :

[tt]
(
    {
        DirAccount = Groups/admin (80 Administrators): ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000050;
        applicable =        {
            isUser = 0;
            uid = 80;
        };
        flags =        (
        );
        inherit = 0;
        "l_flags" =        {
        };
        "l_rights" =        {
            read = Read;
            write = Read;
        };
        rights =        (
            read,
            write,
            read,
            write,
            execute,
            delete,
            append,
            readattr,
            writeattr,
            readextattr,
            writeextattr,
            readsecurity,
            writesecurity,
            chown
        );
        type = ACLTypeDeny;
    },
        {
        DirAccount = Users/yoanngini (501 Yoann GINI): 9388B798-73EA-4E85-AEEE-744E0E3D2740;
        applicable =        {
            isUser = 1;
            uid = 501;
        };
        flags =        (
        );
        inherit = 0;
        "l_flags" =        {
        };
        "l_rights" =        {
            append = Append;
            chown = "Change ownership";
            delete = Delete;
            execute = Execute;
            read = Read;
            readattr = "Read attributes";
            readextattr = "Read exented attributes";
            readsecurity = "Read security attributes";
            write = Read;
            writeattr = "Write attributes";
            writeextattr = "Write extended attributes";
            writesecurity = "Write security attributes";
        };
        rights =        (
            read,
            write,
            read,
            write,
            execute,
            delete,
            append,
            readattr,
            writeattr,
            readextattr,
            writeextattr,
            readsecurity,
            writesecurity,
            chown
        );
        type = ACLTypeAllow;
    }
)
[/tt]

Soit ce que je veux (il y a juste une incohérence sur les droits lue qui doit venir d'une variable non remise à  0 sur ma boucle de chargement), par un manque d'optimisation due au fait que je suis en phase de test, le code de chargement des ACLs est appelé 4 fois d'affilé au lancement et cela ne pause aucun problème, les 4 fois les informations chargé sont justes.


Par contre lorsque je vais aller relire mon tableau pour l'exploiter dans mon interface voici ce que j'obtiens :

[tt]
(
        {
        DirAccount = Groups/admin (80 Administrators): ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000050;
        applicable =        {
            isUser = 0;
            uid = 80;
        };
        flags =        (
        );
        inherit = 0;
        "l_flags" =        {
        };
        "l_rights" =        {
            read = Read;
            write = Read;
        };
        rights = NSImage 0x178630 Size={32, 32} Reps=(
    NSIconRefBitmapImageRep 0x1c9570 Size={128, 128} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=128x128 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x1c60d0 Size={256, 256} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=256x256 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x1c0e20 Size={512, 512} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=512x512 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x1c96e0 Size={32, 32} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=32x32 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x171920 Size={16, 16} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=16x16 Alpha=YES Planar=NO Format=0
);
        type = ACLTypeDeny;
    },
        {
        DirAccount = Users/yoanngini (501 Yoann GINI): 9388B798-73EA-4E85-AEEE-744E0E3D2740;
        applicable =        {
            isUser = 1;
            uid = 501;
        };
        flags =        (
        );
        inherit = 0;
        "l_flags" =        {
        };
        "l_rights" =        {
            append = Append;
            chown = "Change ownership";
            delete = Delete;
            execute = Execute;
            read = Read;
            readattr = "Read attributes";
            readextattr = "Read exented attributes";
            readsecurity = "Read security attributes";
            write = Read;
            writeattr = "Write attributes";
            writeextattr = "Write extended attributes";
            writesecurity = "Write security attributes";
        };
        rights = NSImage 0x178630 Size={32, 32} Reps=(
    NSIconRefBitmapImageRep 0x1c9570 Size={128, 128} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=128x128 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x1c60d0 Size={256, 256} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=256x256 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x1c0e20 Size={512, 512} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=512x512 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x1c96e0 Size={32, 32} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=32x32 Alpha=YES Planar=NO Format=0,
    NSIconRefBitmapImageRep 0x171920 Size={16, 16} ColorSpace=NSCalibratedRGBColorSpace BPS=8 BPP=32 Pixels=16x16 Alpha=YES Planar=NO Format=0
);
        type = ACLTypeAllow;
    }
)`
[/tt]


Et là , j'avoue que je je ne comprend absolument pas pourquoi !

Est-ce que quelqu'un a une idée d'où ça peut bien venir ?!

A noter que juste après ce log la, l'ACL est de nouveau rechargé depuis le disque et est toujours bien lue, c'est lorsque je réutilise ce qui est en mémoire que je trouve des truc aberrant.

Autre chose aussi, gdb me fait un log étrange juste avant la lecture de l'ACL foiré :

[tt]
=shlibs-removed,shlib-info=[num="105",name="EyeTV MPEG Support",kind="-",dyld-addr="0x1627e000",reason="dyld",requested-state="E",state="E",path="/Library/QuickTime/EyeTV MPEG Support.component/Contents/MacOS/EyeTV MPEG Support",description="/Library/QuickTime/EyeTV MPEG Support.component/Contents/MacOS/EyeTV MPEG Support",loaded_addr="0x1627e000",slide="0x1627e000",prefix=""]
=shlibs-removed,shlib-info=[num="106",name="EyeTV MPEG Support",kind="-",dyld-addr="0x162e0000",reason="dyld",requested-state="E",state="E",path="/Library/QuickTime/EyeTV MPEG Support.component/Contents/MacOS/EyeTV MPEG Support",description="/Library/QuickTime/EyeTV MPEG Support.component/Contents/MacOS/EyeTV MPEG Support",loaded_addr="0x162e0000",slide="0x162e0000",prefix=""]
=shlibs-removed,shlib-info=[num="108",name="IOUSBLib",kind="B",dyld-addr="0x1676a000",reason="dyld",requested-state="E",state="E",path="/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle/Contents/MacOS/IOUSBLib",description="/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle/Contents/MacOS/IOUSBLib",loaded_addr="0x1676a000",slide="0x1676a000",prefix=""]
[/tt]


En espérant qu'un barbu passe par là  ^^

(je peut montrer le code à  ceux que ça intéresse, il n'y a rien de secret, je me suis inspiré des sources darwin de ls et chmod pour la partie gestion ACL, le reste c'est des tableView)

Réponses

  • yoannyoann Membre
    22:34 modifié #2
    Je crois que je vais ouvrir un forum pour poser des questions à  moi même. Mettre son problème au propre aide pas mal à  trouver où on a fait l'erreur...

    L'erreur venait d'un release de trop sur un élément contenue dans mon tableau d'ACL, du coup j'avais un pointeur sur n'importe quoi et donc à  la lecture je lisais dans la mémoire du voisin ^^

    Cela dit si certain sont intéressé par le code faite le moi savoir
  • schlumschlum Membre
    22:34 modifié #3
    Moi j'ai une question... Pourquoi faire le moteur en objective-C alors que toutes les fonctions sont des fonctions BSD ?  :)

    Sinon, les ACL sont très peu utilisées par le grand public ; c'est pour ça qu'ils ne se sont pas fait chier AMHA  ;)
  • yoannyoann Membre
    22:34 modifié #4
    Je fait un wrapper ObjC pour que ce soit bien plus simple à  utiliser ensuite. Je convertis les données en array/dict et ensuite je ne bosse qu'avec ça, reste après à  le relire pour l'écrire.

    Sinon concernant l'utilité c'est plutôt pour de l'entreprise et pour les admin que pour le grand publique en effet.

    ça permet quand même de gagner du temps d'avoir une interface pour le faire. Sur OS X Server l'interface existe mais pas sur le client. Hors dans certain cas (TPME/PME sans serveur) ça peut être bien pratique d'avoir quelque chose d'utilisable par les non-fan de la ligne de commande :-)
  • schlumschlum Membre
    22:34 modifié #5
    Petites suggestion pour un outil complet:
    - Gérer également les Finder Flags (invisibilité, icône...)
    - Gérer les extended attributes
    - + les trucs classiques (droits Unix)
  • yoannyoann Membre
    22:34 modifié #6
    Voici l'interface actuelle :
    17707526-5271ac618a2dd9fa0591c29e0b9a36e5.4a5f4c56-full.png

    Je vais prévoir en plus le lock/unlock ainsi que le modèle  et passer le hide en checkbox

    Et certainement revoir l'interface pour la faire coller à  celle du get info (avec les différentes sections) une fois que les ACL fonctionneront correctement

    Si vous avez d'autres idées, des choses qui vous manque dans le getInfo d'origine n'hésitez pas :-)
Connectez-vous ou Inscrivez-vous pour répondre.