/* Copyright (c) 1992 Microsoft Corporation Module Name: pathmap.c Abstract: This module contains definitions relating to manipulation of AFP paths. Author: Sue Adams (microsoft!suea) Revision History: 04 Jun 1992 Initial Version Notes: Tab stop: 4 --*/ #ifndef _PATHMAP_ #define _PATHMAP_ #define UNICODE_HOST_PATHSEPZ L"\\" // a null terminated wide string #define ANSI_HOST_PATHSEP '\\' #define AFP_PATHSEP 0 #define UNICODE_AFP_PATHSEP UNICODE_NULL #define AVERAGE_NODE_DEPTH 16 // describes the entity found by pathmapping routines typedef struct _PathMapEntity { // Handle is returned for LOOKUPS ONLY! FILESYSHANDLE pme_Handle; // Handle to DATA Stream, returned for lookups // Full, UTail and ParentPath are returned whenever the following bitmap // // FD_INTERNAL_BITMAP_RETURN_PMEPATHS // is specified in the AfpMapAfpPath call. These are mostly for Create and // for lookups ONLY for apis that MAKE DISK CHANGES which will produce a // change notification to come in. Caller must free the FullPath.Buffer. // All other strings point into this buffer and do not need to be freed. // Also used by Open to get the path of the file being opened. UNICODE_STRING pme_FullPath; // Fully qualified relative to volume root UNICODE_STRING pme_UTail; // Points to last component of Full UNICODE_STRING pme_ParentPath; // Points to Full w/ length of UTail deleted // pme_pDfeParent is used for Create and points to the parent directory. // pme_pDfEntry is used for lookup (mainly for delete case) and points to the entity. union { PDFENTRY pme_pDfeParent; // DFE of parent dir in which to create PDFENTRY pme_pDfEntry; // DFE of of the entity for Lookup }; } PATHMAPENTITY, *PPATHMAPENTITY; #define AfpInitializePME(pPME, FullPathLen, FullPathBuffer) \ (pPME)->pme_FullPath.Buffer = FullPathBuffer; \ (pPME)->pme_FullPath.MaximumLength = FullPathLen; \ (pPME)->pme_Handle.fsh_FileHandle = NULL // // Values for path mapping DFFlag parameter; // DFE_DIR/FILE/ANY tell the pathmapping code what type of entity we are // trying to lookup/create // #define DFE_DIR 0x0001 // Specified if the object should be a dir #define DFE_FILE 0x0002 // Specified if the object should be a file #define DFE_ANY 0x0004 // Specified if the object can be either // // Values for reason of pathmap: Lookup, SoftCreate or HardCreate // typedef enum _PATHMAP_TYPE { Lookup, SoftCreate, HardCreate, LookupForEnumerate // Same as Lookup but file children will be cached // in during pathmap of the directory itself. } PATHMAP_TYPE; extern AFPSTATUS AfpMapAfpPath( IN PCONNDESC pConnDesc, IN DWORD DirId, IN PANSI_STRING Path, IN BYTE PathType, IN PATHMAP_TYPE MapReason, IN DWORD DFFlag, IN DWORD Bitmap, OUT PPATHMAPENTITY pPME, OUT PFILEDIRPARM pFDParm OPTIONAL // for lookups only ); extern AFPSTATUS AfpMapAfpPathForLookup( IN PCONNDESC pConnDesc, IN DWORD DirId, IN PANSI_STRING Path, IN BYTE PathType, IN DWORD DFFlag, IN DWORD Bitmap, OUT PPATHMAPENTITY pPME OPTIONAL, OUT PFILEDIRPARM pFDParm OPTIONAL ); extern AFPSTATUS AfpMapAfpIdForLookup( IN PCONNDESC pConnDesc, IN DWORD AfpId, IN DWORD DFFlag, IN DWORD Bitmap, OUT PPATHMAPENTITY pPME OPTIONAL, OUT PFILEDIRPARM pFDParm OPTIONAL ); extern AFPSTATUS AfpHostPathFromDFEntry( IN PDFENTRY pDFE, IN DWORD taillen, OUT PUNICODE_STRING pPath ); extern AFPSTATUS AfpCheckParentPermissions( IN PCONNDESC pConnDesc, IN DWORD ParentDirId, IN PUNICODE_STRING pParentPath, IN DWORD RequiredPerms, OUT PFILESYSHANDLE pHandle OPTIONAL, OUT PBYTE pUserRights OPTIONAL ); #ifdef _PATHMAP_LOCALS // An AFP path to an entity consists of a Dirid and pathname. A MAPPEDPATH // structure resolves the AFP path into a PDFENTRY for the entity on lookups, // or to a PDFENTRY of the parent directory plus the UNICODE file/dir name // of the entity on creates. typedef struct _MappedPath { PDFENTRY mp_pdfe; UNICODE_STRING mp_Tail; // valid for Create only WCHAR mp_Tailbuf[AFP_FILENAME_LEN+1]; // for mp_tail.Buffer // mp_Tail is also used as an interim buffer during pathmap for looking up // by name in the idindex database. } MAPPEDPATH, *PMAPPEDPATH; /* private function prototypes */ LOCAL AFPSTATUS afpGetMappedForLookupFDInfo( IN PCONNDESC pConnDesc, IN PDFENTRY pDfEntry, IN DWORD Bitmap, OUT PPATHMAPENTITY pPME OPTIONAL, OUT PFILEDIRPARM pFDParm OPTIONAL ); /*** afpGetNextComponent * * Takes an AFP path with leading and trailing nulls removed, * and parses out the next path component. * * pComponent must point to a buffer of at least AFP_LONGNAME_LEN+1 * characters in length if pathtype is AFP_LONGNAME or AFP_SHORTNAME_LEN+1 * if pathtype is AFP_SHORTNAME. * * Returns the number of bytes (Mac ANSI characters) parsed off of * pPath, else -1 for error. LOCAL VOID afpGetNextComponent( IN PCHAR pPath, IN int Length, IN BYTE PathType, OUT PCHAR Component, OUT PINT pIndex ) */ #define afpGetNextComponent(_pPath, _Length, _PathType, _Component, _pIndex) \ do \ { \ int Length = _Length; \ PCHAR pPath = _pPath; \ int maxlen; \ CHAR ch; \ \ maxlen = (_PathType == AFP_LONGNAME) ? \ AFP_LONGNAME_LEN : \ AFP_SHORTNAME_LEN; \ *(_pIndex) = 0; \ \ while ((Length > 0) && ((ch = *pPath) != '\0')) \ { \ if ((*(_pIndex) == maxlen) || (ch == ':')) \ { \ /* component too long or invalid char */ \ *(_pIndex) = -1; \ break; \ } \ \ (_Component)[(*(_pIndex))++] = ch; \ \ pPath++; \ Length--; \ } \ \ if (*(_pIndex) == -1) \ break; \ \ /* null terminate the component */ \ (_Component)[*(_pIndex)] = (CHAR)0; \ \ if ((PathType == AFP_SHORTNAME) && ((_Component)[0] != AFP_PATHSEP)) \ { \ ANSI_STRING as; \ \ AfpInitUnicodeStringWithNonNullTerm(&as, *(_pIndex), _Component); \ if (!AfpIsLegalShortname(&as)) \ { \ *(_pIndex) = -1; \ break; \ } \ } \ \ /* if we stopped due to null, move past it */ \ if (Length > 0) \ { \ (*(_pIndex))++; \ } \ } while (FALSE); LOCAL AFPSTATUS afpMapAfpPathToMappedPath( IN PVOLDESC pVolDesc, IN DWORD DirId, IN PANSI_STRING Path, IN BYTE PathType, IN PATHMAP_TYPE MapReason, IN DWORD DFflag, IN BOOLEAN LockedForWrite, OUT PMAPPEDPATH pMappedPath ); LOCAL AFPSTATUS afpOpenUserHandle( IN PCONNDESC pConnDesc, IN struct _DirFileEntry * pDfEntry, IN PUNICODE_STRING pPath OPTIONAL, IN DWORD Bitmap, OUT PFILESYSHANDLE pfshData // Handle of data stream of object ); #endif // _PATHMAP_LOCALS #endif // _PATHMAP_