windows-nt/Source/XPSP1/NT/net/sfm/afp/server/pathmap.h
2020-09-26 16:20:57 +08:00

273 lines
9.2 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
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_