rc_t TarNode_MakeAuto(const FSNode** cself, const KDirectory* dir, const char* path, const char* file, const char* xml_path) { rc_t rc = 0; if( cself == NULL || dir == NULL || path == NULL || file == NULL || xml_path == NULL ) { rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull); } else { if( (rc = FSNode_Make((FSNode**)cself, file, &TarNode_vtbl)) == 0 ) { ((char*)((*cself)->name))[strlen(file) - 4] = '\0'; /* -= .xml */ ((TarNode*)*cself)->xml_path = xml_path; ((TarNode*)*cself)->rel_path = path; if( (rc = FSNode_Touch(*cself)) != 0 ) { FSNode_Release(*cself); *cself = NULL; } } } return rc; }
rc_t XML_FindLock(const char* path, bool recur, const FSNode** node, const char** subpath) { rc_t rc = 0; size_t sz = 0; const char* p0 = NULL, *p = NULL; const FSNode* pn = NULL, *n = NULL; bool hidden = false; if( path == NULL || node == NULL || subpath == NULL ) { return RC(rcExe, rcPath, rcResolving, rcParam, rcNull); } sz = strlen(path); if( sz == 0 ) { return RC(rcExe, rcPath, rcResolving, rcParam, rcEmpty); } p0 = path; if( (rc = XMLLock(false)) != 0 ) { return rc; } pn = g_root; do { DEBUG_MSG(8, ("Path: '%s'\n", p0)); while( *p0 == '/' && *p0 != '\0' ) { p0++; } if( *p0 == '\0' ) { break; } p = strchr(p0, '/'); if( p == NULL ) { p = p0 + strlen(p0); } DEBUG_MSG(8, ("Push: '%.*s'\n", p - p0, p0)); if( (rc = FSNode_FindChild(pn, p0, p - p0, &n, &hidden)) == 0 ) { if( hidden ) { pn = n; DEBUG_MSG(8, ("Match! hidden '%s' left '%s'\n", pn->name, p0)); break; } else { DEBUG_MSG(8, ("Match! '%.*s' left '%s'\n", p - p0, p0, p)); } } else if( GetRCState(rc) == rcNotFound ) { rc = 0; break; } pn = n; p0 = p; } while( rc == 0 && p0 < path + sz ); if( rc == 0 ) { if( pn == NULL ) { rc = RC(rcExe, rcPath, rcResolving, rcDirEntry, rcNotFound); DEBUG_MSG(10, ("Not found: '%s', in '%s'\n", p0, path)); } else { if( (rc = FSNode_Touch(pn)) != 0 ) { PLOGERR(klogWarn, (klogWarn, rc, "touch failed for $(n)", PLOG_S(n), pn->name)); rc = 0; } *node = pn; *subpath = (p0 && p0[0] != '\0') ? p0 : NULL; #if _DEBUGGING { const char* nm = NULL; FSNode_GetName(pn, &nm); DEBUG_MSG(10, ("Found: '%s', sub '%s'\n", nm, *subpath)); } #endif } } if( rc != 0 ) { XMLUnlock(); } return rc; }