Example #1
0
static
rc_t XML_Open(const char* path, const FSNode** tree)
{
    rc_t rc = 0;
    char errmsg[4096] = "";
    KDirectory *dir = NULL;
    
    PLOGMSG(klogInfo, (klogInfo, "Reading XML file '$(x)'", PLOG_S(x), path));
    if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
        const KFile* file = NULL;
        if( (rc = KDirectoryOpenFileRead(dir, &file, "%s", path)) == 0 ) {
            if( (rc = FSNode_Make((FSNode**)tree, "ROOT", &RootNode_vtbl)) == 0 ) {
                const KXMLDoc* xmldoc = NULL;
                if( (rc = KXMLMgrMakeDocRead(g_xmlmgr, &xmldoc, file)) == 0 ) {
                    const KXMLNodeset* ns = NULL;
                    if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/FUSE/*")) == 0 ) {
                        uint32_t count = 0;
                        if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) {
                            if( count == 0 ) {
                                rc = RC(rcExe, rcDoc, rcValidating, rcData, rcEmpty);
                            } else {
                                uint32_t i = 0;
                                while(rc == 0 && i < count) {
                                    const KXMLNode* n = NULL;
                                    if( (rc = KXMLNodesetGetNodeRead(ns, &n, i++)) == 0 ) {
                                        SRAConfigFlags flags = ~0;
                                        errmsg[0] = '\0';
                                        rc = XML_ValidateNode((FSNode*)*tree, n, flags, errmsg);
                                        ReleaseComplain(KXMLNodeRelease, n);
                                    }
                                }
                                if( rc == 0 ) {
                                    rc = SRAList_NextVersion();
                                }
                            }
                        }
                        ReleaseComplain(KXMLNodesetRelease, ns);
                    }
                    ReleaseComplain(KXMLDocRelease, xmldoc);
                }
                if( rc != 0 ) {
                    FSNode_Release(*tree);
                    *tree = NULL;
                }
            }
            ReleaseComplain(KFileRelease, file);
        }
        ReleaseComplain(KDirectoryRelease, dir);
    }
    if( rc == 0 ) {
        PLOGMSG(klogInfo, (klogInfo, "XML file '$(x)' ok", PLOG_S(x), path));
    } else {
        if( strlen(errmsg) < 1 ) {
            strcpy(errmsg, path);
        }
        LOGERR(klogErr, rc, errmsg);
    }
    return rc;
}
Example #2
0
static
rc_t TarNode_Touch(const TarNode* cself)
{
    rc_t rc = 0;

    if( cself->xml_path != NULL ) {
        KDirectory* dir = NULL;
        if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
            KTime_t dt;
            if( (rc = KDirectoryDate(dir, &dt, "%s", cself->xml_path)) == 0 ) {
                if( dt != cself->mtime ) {
                    const KFile* kfile = NULL;
                    DEBUG_MSG(8, ("%s: updating tar %s\n", __func__, cself->xml_path));
                    if( (rc = KDirectoryOpenFileRead(dir, &kfile, "%s", cself->xml_path)) == 0 ) {
                        const KXMLMgr* xmlmgr;
                        if( (rc = XML_MgrGet(&xmlmgr)) == 0 ) {
                            const KXMLDoc* xmldoc = NULL;
                            if( (rc = KXMLMgrMakeDocRead(xmlmgr, &xmldoc, kfile)) == 0 ) {
                                const KXMLNodeset* ns = NULL;
                                if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/TAR")) == 0 ) {
                                    uint32_t count = 0;
                                    if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) {
                                        if( count != 1 ) {
                                            rc = RC(rcExe, rcDoc, rcValidating, rcData, rcInvalid);
                                        } else {
                                            const KXMLNode* n = NULL;
                                            if( (rc = KXMLNodesetGetNodeRead(ns, &n, 0)) == 0 ) {
                                                char errmsg[4096];
                                                const TarFileList* new_files;
                                                if( (rc = TarNode_MakeFileList(n, &new_files, errmsg, cself->rel_path, cself->node.name)) != 0 ) {
                                                    LOGERR(klogErr, rc, errmsg);
                                                } else {
                                                    TarFileList_Release(cself->files);
                                                    ((TarNode*)cself)->files = new_files;
                                                    ((TarNode*)cself)->mtime = dt;
                                                }
                                                ReleaseComplain(KXMLNodeRelease, n);
                                            }
                                        }
                                    }
                                    ReleaseComplain(KXMLNodesetRelease, ns);
                                }
                                ReleaseComplain(KXMLDocRelease, xmldoc);
                            }
                        }
                        ReleaseComplain(KFileRelease, kfile);
                    }
                }
            }
            ReleaseComplain(KDirectoryRelease, dir);
        }
    }
    return rc;
}
Example #3
0
static rc_t XmlMetaInitMembers(BSTree* tr, const KXMLNode* node) {
    rc_t rc = 0;
    const char path[] = "Member";
    uint32_t count = 0;
    uint32_t idx = 0;
    const KXMLNodeset *members = NULL;
    if (rc == 0) {
        rc = KXMLNodeOpenNodesetRead(node, &members, path);
        DISP_RC(rc, path);
    }
    if (rc == 0) {
        rc = KXMLNodesetCount(members, &count);
        DISP_RC(rc, path);
    }
    for (idx = 0; idx < count && rc == 0; ++idx) {
        const KXMLNode *node = NULL;
        char member_name[256] = "";
        if (rc == 0) {
            rc = KXMLNodesetGetNodeRead(members, &node, idx);
            DISP_RC(rc, path);
        }
        if (rc == 0) {
            size_t size = 0;
            rc = KXMLNodeReadAttrCString(node, "member_name",
                member_name, sizeof member_name, &size);
            if (rc) {
                if (GetRCState(rc) == rcInsufficient) {
                    member_name[sizeof member_name - 1] = '\0';
                    rc = 0;
                }
            }
        }
        if (rc == 0) {
            rc = XmlMetaInitMemser(tr, node, path, member_name);
        }
        RELEASE(KXMLNode, node);
    }
    RELEASE(KXMLNodeset, members);
    return rc;
}
Example #4
0
rc_t XTocParseXml(struct XTocEntry* xRoot, const KFile* file)
{
    rc_t rc = 0;

    const KXMLMgr* mgr = NULL;
    const KXMLDoc* doc = NULL;
    const KXMLNodeset* root = NULL;
    const char rootName[] = "/ROOT";

/**** INIT ****/

    if (rc == 0) {
        rc = KXMLMgrMakeRead(&mgr);
        DISP_RC(rc, "while calling KXMLMgrMakeRead");
    }

    if (rc == 0) {
        KXMLMgrMakeDocRead(mgr, &doc, file);
        DISP_RC(rc, "while calling KXMLMgrMakeDocRead");
    }

    if (rc == 0) {
        rc = KXMLDocOpenNodesetRead(doc, &root, rootName);
        if (rc != 0) {
/*          PLOGERR(klogErr, (klogErr, rc,
                "while calling KXMLDocOpenNodesetRead $(name)",
                "name=%s", rootName));*/
        }
    }

    if (rc == 0) {
        uint32_t count = 0;
        rc = KXMLNodesetCount(root, &count);
        if (rc != 0) {
/*          PLOGERR(klogErr, (klogErr, rc,
                "while calling KXMLNodesetCount($(name))", "name=%s",
                rootName));*/
        }
        else if (count != 1) {
            rc = RC(rcFS, rcXmlDoc, rcReading,
                rcTag, count ? rcExcessive : rcNotFound);
/*          PLOGERR(klogErr, (klogErr, rc, "$(name)", "name=%s", rootName));*/
        }
        else if (false) {
            DBGMSG(DBG_APP,DBG_COND_1,
                ("KXMLNodesetCount(%s)=%d\n", rootName, count));
        }
    }

/**** READ AND PROCESS THE ROOT XML NODE ****/

    if (rc == 0) {
        uint32_t i = 0;
        const KXMLNode *node = NULL;

        rc = KXMLNodesetGetNodeRead(root, &node, i);
        if (rc == 0) {
            ProcessNode(node, rootName, i, xRoot, xRoot);
        }
/*      else {
*            PLOGERR(klogErr, (klogErr, rc,
                "while calling KXMLNodesetGetNodeRead($(name), $(i))",
                "name=%s,i=%d", rootName, i));
        }*/

        {
            rc_t rc2 = KXMLNodeRelease(node);
            if (rc == 0)
            {   rc = rc2; }
            node = NULL;
        }
    }

/**** RELEASE ****/

    {
        rc_t rc2 = KXMLDocRelease(doc);
        if (rc == 0)
        {   rc = rc2; }
        doc = NULL;
    }

    {
        rc_t rc2 = KXMLNodesetRelease(root);
        if (rc == 0)
        {   rc = rc2; }
        root = NULL;
    }

    {
        rc_t rc2 = KXMLMgrRelease(mgr);
        if (rc == 0)
        {   rc = rc2; }
        mgr = NULL;
    }

    return rc;
}