273 lines
9.2 KiB
C
273 lines
9.2 KiB
C
/*
|
||
|
||
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_
|
||
|