Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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;
}