std::string UPKReader::FormatName(uint32_t idx, bool verbose) { std::ostringstream ss; FNameEntry Entry = GetNameEntry(idx); ss << FormatHEX((uint32_t)idx) << " (" << idx << ") ( " << FormatHEX((char*)&idx, sizeof(idx)) << "): " << Entry.Name << std::endl; if (verbose == true) { ss << "\tNameFlagsL: " << FormatHEX(Entry.NameFlagsL) << std::endl << "\tNameFlagsH: " << FormatHEX(Entry.NameFlagsH) << std::endl; } return ss.str(); }
static LONG PathWalk(Global_T *g, UBYTE *FullName, LONG FullNameLen, UBYTE *LinkPath, /* Buf to get result into, IN/OUTPUT name of LINK */ ULONG BufLen, /* length of buf above */ LONG *Res2) /* OUTPUT */ { UBYTE *PComp; /* points to current path component */ UBYTE *WorkPath = NULL; DCEntry *ParDir, *ActDir; NEntry *ActNEnt; ACEntry *ACE; LONG LastElement = 0; /* flag: if set, last element of directory is found */ /* (init important !) */ LONG Pos = 0; /* fn_ScanPath needs this as buffer */ /* (init important !) */ LONG Res = 1; D(DBF_ALWAYS, "\tPathWalk(\"%s\")", FullName); WorkPath = StrNDup(FullName, FullNameLen); /* we will modify WorkPath */ if(!WorkPath) { *Res2 = ERROR_NO_FREE_STORE; Res = 0; } else { /* get (cached) root handle */ ParDir = GetDirEntry(g, NULL, /* no name entry */ g->g_MntAttr.fileid, &g->g_MntFh, NULL, /* currently not used */ Res2); if(ParDir) { if(FullNameLen) /* Filename != "" */ { do { PComp = fn_ScanPath(WorkPath, FullNameLen, &Pos, &LastElement); ASSERT(PComp); D(DBF_ALWAYS,"\tPComp = \"%s\"", PComp); if(*PComp == '/') /* goto parent dir, not allowed in this version, must be unified path ! */ { E(DBF_ALWAYS, "FIXME: *** parent dir reference not allowed !!"); Res = 0; break; } ActNEnt = GetNameEntry(g, ParDir, PComp, &ACE, Res2); if(!ActNEnt) { Res = 0; break; } if((ActNEnt->ne_FType != NFDIR) && (ActNEnt->ne_FType != NFLNK)) { *Res2 = ERROR_INVALID_COMPONENT_NAME; Res = 0; break; } if(ActNEnt->ne_FType == NFLNK) { nfspath u_lpath; ASSERT(ACE); ASSERT(LinkPath); u_lpath = nfs_ReadLink(g->g_NFSClnt, &ACE->ace_NFSFh, Res2); if(u_lpath) { D(DBF_ALWAYS,"\treadlink returned: %s", u_lpath); #if 0 if(UseUnixLinks(g)) ; #endif if(fn_InsertLink(LinkPath, BufLen, g->g_VolumeName, FullName, PComp-WorkPath, strlen(PComp), u_lpath, Res2) == NULL) { if(*Res2 == ERROR_NO_FREE_STORE) Res = -1; else Res = 0; } else Res = 2; } else { Res = 0; } break; } /* note: GetDirEntry will modify ActNEnt if necessary */ ActDir = GetDirEntry(g, ActNEnt, DCE_ID_UNUSED, &ACE->ace_NFSFh, PComp, Res2); ParDir = ActDir; } while(!LastElement && ParDir); } else { /* filename: "" */ LinkPath[0] = 0; Res = 1; } } else Res = 0; fn_Delete(&WorkPath); } return Res; }