793 lines
35 KiB
C
793 lines
35 KiB
C
/****************************************************************************
|
|
|
|
|
| (C) Copyright 1985, 1991, 1993, 1996-1999 Novell, Inc.
|
|
| All Rights Reserved.
|
|
|
|
|
| This program is free software; you can redistribute it and/or
|
|
| modify it under the terms of version 2 of the GNU General Public
|
|
| License as published by the Free Software Foundation.
|
|
|
|
|
| This program is distributed in the hope that it will be useful,
|
|
| but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| GNU General Public License for more details.
|
|
|
|
|
| You should have received a copy of the GNU General Public License
|
|
| along with this program; if not, contact Novell, Inc.
|
|
|
|
|
| To contact Novell about this file by physical or electronic mail,
|
|
| you may find current contact information at www.novell.com
|
|
|
|
|
|***************************************************************************
|
|
|
|
|
| Novell Storage Services (NSS) module
|
|
|
|
|
|---------------------------------------------------------------------------
|
|
|
|
|
| $Author: blarsen $
|
|
| $Date: 2006-01-25 02:50:42 +0530 (Wed, 25 Jan 2006) $
|
|
|
|
|
| $RCSfile$
|
|
| $Revision: 1316 $
|
|
|
|
|
|---------------------------------------------------------------------------
|
|
| This module is used to:
|
|
| Define the MESSAGE structure that is passed between layers of the
|
|
| system.
|
|
|
|
|
| WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
|
|
|
|
|
| This header file should ONLY be used for NSS internal development.
|
|
| This includes Semantic Agents (SA) and Loadable Storage Services (LSS).
|
|
| Any other use may cause conflicts which NSS will NOT fix.
|
|
+-------------------------------------------------------------------------*/
|
|
#ifndef _MSGNAME_H_
|
|
#define _MSGNAME_H_
|
|
|
|
#include <xUnicode.h>
|
|
|
|
#ifndef _MSGGEN_H_
|
|
#include <msgGen.h>
|
|
#endif
|
|
|
|
#ifndef _NAMESPACE_H_
|
|
#include <nameSpace.h>
|
|
#endif
|
|
|
|
#ifndef _HARDLINK_H_
|
|
#include <hardLinkBeast.h>
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*===========================================================================
|
|
*===========================================================================
|
|
*===========================================================================
|
|
*
|
|
* This is a definition of the of internal MESSAGE structure used for
|
|
* naming.
|
|
*
|
|
*===========================================================================
|
|
*===========================================================================
|
|
*===========================================================================*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* This contains parameters specific to resolving NAMES
|
|
*---------------------------------------------------------------------------*/
|
|
struct NamingMsg_s
|
|
{
|
|
/* INPUT fields */
|
|
|
|
BYTE handlePathType; /* Type of input information specified */
|
|
BYTE pathFormat; /* The format of the path (i.e. ASCII, unicode_t, ...) */
|
|
BYTE parseMode; /* mode for path string parsing */
|
|
BYTE pathCount; /* path component count for zPFMT_ASCII_COUNTED strings only */
|
|
WORD parseFlags; /* flags for nameMsg parsing */
|
|
BYTE retParseFlags; /* OUTPUT: flags returned from nameMsg parsing */
|
|
BYTE latchType; /* Type of latch to get on curFile and curDataStream -- defined in latch.h */
|
|
NINT pathLength; /* path length for zPFMT_ASCII_LEN strings only */
|
|
|
|
ContextHandleIDP_s contextHandle; /* valid if pathType == zHPT_CONTEXT */
|
|
VolumeID_t volumeID; /* valid if pathType = zHPT_VOLUME or zHPT_VOLUME_ZID */
|
|
struct Volume_s *curvol; /* after lookup, points to volumeID (locked)
|
|
* NOTE -- This pointer has two associated use
|
|
* counts that must be incremented if this
|
|
* pointer is non-NULL. The basic useCount which
|
|
* locks the beast in memory, and the keepActiveUseCount
|
|
* which locks the beast in the ACTIVATED state */
|
|
FileHandleIDP_s fileHandle; /* valid if pathType = zHPT_FILEHANDLEID */
|
|
Zid_t fileParentZid; /* Contains parentZid of the file */
|
|
NINT fileNameType; /* The name type associated with fileNameUniquifier */
|
|
NINT zidNameType; /* Only set if path is rooted on a starting ZID.
|
|
* This must match the nameType of the beast
|
|
* identified by that starting ZID. */
|
|
Zid_t fileZid; /* if curFile==NULL, may contain zid of the file */
|
|
struct File_s *curFile; /* after lookup, points to file beast (locked)
|
|
* this object is now returned latched by
|
|
* "COMN_Lookup". Use this beast for authorization
|
|
* and for metadata changes etc... This may be
|
|
* the same beast as curDStream, but maybe not */
|
|
Zid_t dataStreamZid; /* if curDataStream==NULL, may contain zid of the dataStream */
|
|
struct NamedBeast_s *curDataStream; /* after lookup, points to dataStream beast (locked)
|
|
* this object is now returned latched by
|
|
* "COMN_Lookup". This may be the same beast
|
|
* as curFile, but it may be different. */
|
|
struct HardLinkBeast_s *hlFile; /* if retParseFlags indicate a hardlink found, after lookup, points to hardlink beast (locked) */
|
|
Zid_t hlParentZid; /* if retParseFlags indicate a hardlink found, zid of the parent of the hardlink file */
|
|
WORD nameSpaceID; /* starting namespace to resolve name in */
|
|
WORD nameType; /* starting nameType for the name message */
|
|
|
|
union {
|
|
void *voidPtr;
|
|
char *ascii;
|
|
unicode_t *unicode;
|
|
} path; /* Path string, one of several formats */
|
|
|
|
struct zMatchAttr_s *match; /* When locating a file, this match criteria
|
|
* (if present) is used to select if the file
|
|
* should be matched. */
|
|
|
|
NINT retPathLen; /* Length of retPath buffer */
|
|
|
|
struct Master_s *master;/* Owner for the file handle */
|
|
|
|
/* OUTPUT fields */
|
|
VolumeID_t *retVolumeID; /* if parsing stops at a volume boundary, is
|
|
* filled in with the volumeID of the boundary */
|
|
unicode_t *retPath; /* if parsing stops at a volume boundary, is
|
|
* filled in with the remaining unparsed path*/
|
|
|
|
|
|
/* INTERNAL ONLY fields to Naming System*/
|
|
unicode_t *workBuffer; /* points to buffer optionally used to store
|
|
* pieces of the path as it is being parsed. */
|
|
struct NameSpace_s *workNameSpace;/* current namespace ptr. If !NULL it has
|
|
* a use count on the pointer. */
|
|
BYTE workNameSpaceID; /* current namespace ID */
|
|
BYTE workNameType; /* current name type */
|
|
BYTE workPathCount; /* remaining count for ASCII counted Path Strings.*/
|
|
BYTE reserved;
|
|
|
|
char *lastAsciiSrcPath; /* Saved each time before calling scan of next
|
|
* ASCII component. */
|
|
NINT lastAsciiSrcPathLen; /* Length of lastAsciiSrcPath or -1 */
|
|
|
|
ScanComponentMsg_s scanMsg;/* Is a message structure passed to a name
|
|
* space module to scan/parse the next
|
|
* path component. This maintains state for
|
|
* the parsing as it is done one component
|
|
* at a time. */
|
|
|
|
STATUS (*scanNextComponent)( /* This is a shortcut function Ptr */
|
|
struct GeneralMsg_s *genMsg, /* used to point to a function that */
|
|
struct NamingMsg_s *nameMsg);/* is tailored to know how to scan */
|
|
/* the next component based on the */
|
|
/* type of input string being scanned*/
|
|
};
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* These macros are used to unlatch/latch the beasts in the Name Message
|
|
* If the data stream and the file are the same beast, this only does one
|
|
* latch, else both are latched/unlatched. If a hardlink beast is present,
|
|
* it is also latched.
|
|
*---------------------------------------------------------------------------*/
|
|
#define COMN_LATCH_NAMEMSG_BEASTS(_nameMsg,_latchType) \
|
|
{ \
|
|
(_nameMsg)->latchType = _latchType; \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile == (_nameMsg)->curDataStream) \
|
|
{ \
|
|
COND_LATCH(&(_nameMsg)->curFile->FILEbeastLatch, (_nameMsg)->latchType); \
|
|
} \
|
|
else \
|
|
{ \
|
|
COND_LATCH(&(_nameMsg)->curFile->FILEbeastLatch, (_nameMsg)->latchType); \
|
|
COND_LATCH(&(_nameMsg)->curDataStream->NAMEDbeastLatch, (_nameMsg)->latchType); \
|
|
} \
|
|
if ((_nameMsg)->hlFile != NULL) \
|
|
COND_LATCH(&(_nameMsg)->hlFile->HARDLbeastLatch, (_nameMsg)->latchType); \
|
|
}
|
|
|
|
#define COMN_UPLATCH_NAMEMSG_BEASTS(_nameMsg) \
|
|
{ \
|
|
zASSERT((_nameMsg)->latchType == SLATCHED); \
|
|
(_nameMsg)->latchType = XLATCHED; \
|
|
if ((_nameMsg)->hlFile != NULL) \
|
|
UNS_LATCH(&(_nameMsg)->hlFile->HARDLbeastLatch); \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile == (_nameMsg)->curDataStream) \
|
|
{ \
|
|
UP_LATCH(&(_nameMsg)->curFile->FILEbeastLatch); \
|
|
} \
|
|
else \
|
|
{ \
|
|
UNS_LATCH(&(_nameMsg)->curFile->FILEbeastLatch); \
|
|
UNS_LATCH(&(_nameMsg)->curDataStream->NAMEDbeastLatch); \
|
|
X_LATCH(&(_nameMsg)->curFile->FILEbeastLatch); \
|
|
X_LATCH(&(_nameMsg)->curDataStream->NAMEDbeastLatch); \
|
|
} \
|
|
if ((_nameMsg)->hlFile != NULL) \
|
|
X_LATCH(&(_nameMsg)->hlFile->HARDLbeastLatch); \
|
|
}
|
|
|
|
#define COMN_DOWNLATCH_NAMEMSG_BEASTS(_nameMsg) \
|
|
{ \
|
|
zASSERT((_nameMsg)->latchType == XLATCHED); \
|
|
(_nameMsg)->latchType = SLATCHED; \
|
|
if ((_nameMsg)->hlFile != NULL) \
|
|
DOWN_LATCH(&(_nameMsg)->hlFile->HARDLbeastLatch); \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile == (_nameMsg)->curDataStream) \
|
|
{ \
|
|
DOWN_LATCH(&(_nameMsg)->curFile->FILEbeastLatch); \
|
|
} \
|
|
else \
|
|
{ \
|
|
DOWN_LATCH(&(_nameMsg)->curDataStream->NAMEDbeastLatch); \
|
|
DOWN_LATCH(&(_nameMsg)->curFile->FILEbeastLatch); \
|
|
} \
|
|
}
|
|
|
|
#define COMN_UNLATCH_NAMEMSG_BEASTS_KEEP_LATCHTYPE(_nameMsg) \
|
|
{ \
|
|
if ((NamedBeast_s *) (_nameMsg)->hlFile != NULL) \
|
|
COND_UNLATCH(&(_nameMsg)->hlFile->HARDLbeastLatch, (_nameMsg)->latchType); \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile == (_nameMsg)->curDataStream) \
|
|
{ \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile != NULL) \
|
|
COND_UNLATCH(&(_nameMsg)->curFile->FILEbeastLatch, (_nameMsg)->latchType); \
|
|
} \
|
|
else \
|
|
{ \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile != NULL) \
|
|
COND_UNLATCH(&(_nameMsg)->curFile->FILEbeastLatch, (_nameMsg)->latchType); \
|
|
if ((NamedBeast_s *)(_nameMsg)->curDataStream != NULL) \
|
|
COND_UNLATCH(&(_nameMsg)->curDataStream->NAMEDbeastLatch, (_nameMsg)->latchType); \
|
|
} \
|
|
}
|
|
|
|
#define COMN_UNLATCH_NAMEMSG_BEASTS(_nameMsg,_latchType) \
|
|
{ \
|
|
COMN_UNLATCH_NAMEMSG_BEASTS_KEEP_LATCHTYPE(_nameMsg); \
|
|
*(_latchType) = (_nameMsg)->latchType; \
|
|
(_nameMsg)->latchType = NOTLATCHED; \
|
|
}
|
|
|
|
#define COMN_LATCH_AND_USE_NAMEMSG_BEASTS(_nameMsg,_latchType) \
|
|
{ \
|
|
COMN_USE_BEAST(&(_nameMsg)->curFile->FILEroot); \
|
|
COMN_USE_BEAST(&(_nameMsg)->curDataStream->NAMEDroot); \
|
|
if ((_nameMsg)->hlFile != NULL) \
|
|
COMN_USE_BEAST(&(_nameMsg)->hlFile->HARDLroot); \
|
|
(_nameMsg)->latchType = (_latchType); \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile == (_nameMsg)->curDataStream) \
|
|
{ \
|
|
COND_LATCH(&(_nameMsg)->curFile->FILEbeastLatch, (_nameMsg)->latchType);\
|
|
} \
|
|
else \
|
|
{ \
|
|
COND_LATCH(&(_nameMsg)->curFile->FILEbeastLatch, (_nameMsg)->latchType); \
|
|
COND_LATCH(&(_nameMsg)->curDataStream->NAMEDbeastLatch, (_nameMsg)->latchType); \
|
|
} \
|
|
if ((_nameMsg)->hlFile != NULL) \
|
|
COND_LATCH(&(_nameMsg)->hlFile->HARDLbeastLatch, (_nameMsg)->latchType); \
|
|
}
|
|
|
|
#define COMN_UNLATCH_AND_RELEASE_NAMEMSG_BEASTS_KEEP_LATCHTYPE(_nameMsg) \
|
|
{ \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile == (_nameMsg)->curDataStream) \
|
|
{ \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile != NULL) \
|
|
COMN_UnlatchAndRelease(&(_nameMsg)->curFile, (_nameMsg)->latchType); \
|
|
COMN_Release(&(_nameMsg)->curDataStream); \
|
|
} \
|
|
else \
|
|
{ \
|
|
if ((NamedBeast_s *)(_nameMsg)->curFile != NULL) \
|
|
COMN_UnlatchAndRelease(&(_nameMsg)->curFile, (_nameMsg)->latchType); \
|
|
if ((NamedBeast_s *)(_nameMsg)->curDataStream != NULL) \
|
|
COMN_UnlatchAndRelease(&(_nameMsg)->curDataStream, (_nameMsg)->latchType); \
|
|
} \
|
|
if ((NamedBeast_s *)(_nameMsg)->hlFile != NULL) \
|
|
COMN_UnlatchAndRelease(&(_nameMsg)->hlFile, (_nameMsg)->latchType); \
|
|
}
|
|
|
|
#define COMN_UNLATCH_AND_RELEASE_NAMEMSG_BEASTS(_nameMsg,_latchType) \
|
|
{ \
|
|
COMN_UNLATCH_AND_RELEASE_NAMEMSG_BEASTS_KEEP_LATCHTYPE(_nameMsg); \
|
|
*(_latchType) = (_nameMsg)->latchType; \
|
|
(_nameMsg)->latchType = NOTLATCHED; \
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* These macros are used to initialize a NAMING structure.
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
/* This must be called before all Name Message Macros */
|
|
#define COMN_INIT_NAMING_MSG(_nameMsg) \
|
|
(LB_bzero((_nameMsg),sizeof(NamingMsg_s)))
|
|
|
|
/* For zHPT_SIMPLE - this is the most basic path option. */
|
|
#define COMN_SETUP_NAMING_MSG_SIMPLE(_nameMsg,_pathStr,_pathFmt, \
|
|
_pMode,_latchType,_nsid,_nType,_pMatch) \
|
|
((_nameMsg)->handlePathType = zHPT_SIMPLE, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch))
|
|
|
|
/* For zHPT_FULL - this is a fully qualified path supporting all path options */
|
|
#define COMN_SETUP_NAMING_MSG_FULL(_nameMsg,_pathStr,_pathFmt,\
|
|
_pMode,_latchType,_nsid,_nType,_pMatch,_retPLen,_retVolume,_retpath) \
|
|
((_nameMsg)->handlePathType = zHPT_FULL, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch), \
|
|
(_nameMsg)->retPathLen = (_retPLen), \
|
|
(_nameMsg)->retVolumeID = (_retVolume), \
|
|
(_nameMsg)->retPath = (_retpath))
|
|
|
|
/* For zHPT_CONTEXT - This is a path based on a context handle. The
|
|
* path portion supports all path options. If the path is fully qualified,
|
|
* it overrides the context handle */
|
|
#define COMN_SETUP_NAMING_MSG_CONTEXT(_nameMsg,_cxHndl,_pathStr,_pathFmt, \
|
|
_pMode,_latchType,_nsid,_nType,_pMatch,__retPLen, \
|
|
_retVolume,_retpath) \
|
|
((_nameMsg)->handlePathType = zHPT_CONTEXT, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
COMN_SET_CONTEXTHANDLE_ID(&(_nameMsg)->contextHandle,(_cxHndl)), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch), \
|
|
(_nameMsg)->retPathLen = (__retPLen), \
|
|
(_nameMsg)->retVolumeID = (_retVolume), \
|
|
(_nameMsg)->retPath = (_retpath))
|
|
|
|
/* For zHPT_VOLUME - This is a path based on a volume ID. The
|
|
* path portion supports all path options. If the path is fully qualified,
|
|
* it overrides the volume ID */
|
|
#define COMN_SETUP_NAMING_MSG_VOLUME(_nameMsg,_volumeID,_pathStr,_pathFmt, \
|
|
_pMode,_latchType,_nsid,_nType,_pMatch,_retPLen, \
|
|
_retVolume,_retpath) \
|
|
((_nameMsg)->handlePathType = zHPT_VOLUME, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->volumeID = (_volumeID), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch), \
|
|
(_nameMsg)->retPathLen = (_retPLen), \
|
|
(_nameMsg)->retVolumeID = (_retVolume), \
|
|
(_nameMsg)->retPath = (_retpath))
|
|
|
|
/* For zHPT_VOLUME_ZID - This identifies a file object via a volumeID,
|
|
* and zid. No path is allowed. */
|
|
#define COMN_SETUP_NAMING_MSG_VOLUME_ZID(_nameMsg,_volumeID, _pzid, \
|
|
_fzid,_dsZid,_latchType,_nsid,_nType,_pMatch) \
|
|
((_nameMsg)->handlePathType = zHPT_VOLUME_ZID, \
|
|
(_nameMsg)->parseMode = NAMPMODE_Undefined, \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->volumeID = (_volumeID), \
|
|
(_nameMsg)->fileParentZid = (_pzid), \
|
|
(_nameMsg)->fileZid = (_fzid), \
|
|
(_nameMsg)->dataStreamZid = (_dsZid), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch))
|
|
|
|
/* For zHPT_ADMIN_VOLUME - This is a path based on the Admin volume. The
|
|
* path portion supports all path options. If the path is fully qualified,
|
|
* it overrides the volume ID */
|
|
#define COMN_SETUP_NAMING_MSG_ADMIN_VOLUME(_nameMsg,_pathStr,_pathFmt, \
|
|
_pMode,_latchType,_nsid,_nType,_pMatch,_retPLen, \
|
|
_retVolume,_retpath) \
|
|
((_nameMsg)->handlePathType = zHPT_ADMIN_VOLUME, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch), \
|
|
(_nameMsg)->retPathLen = (_retPLen), \
|
|
(_nameMsg)->retVolumeID = (_retVolume), \
|
|
(_nameMsg)->retPath = (_retpath))
|
|
|
|
/* For zHPT_ADMIN_VOLUME_ZID - This identifies a file object within the Admin
|
|
* volume via a zid. No path is allowed. */
|
|
#define COMN_SETUP_NAMING_MSG_ADMIN_VOLUME_ZID(_nameMsg, _fzid,_dsZid, \
|
|
_latchType,_nsid,_nType,_pMatch) \
|
|
((_nameMsg)->handlePathType = zHPT_ADMIN_VOLUME_ZID, \
|
|
(_nameMsg)->parseMode = NAMPMODE_Undefined, \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->fileParentZid = zINVALID_ZID, \
|
|
(_nameMsg)->fileZid = (_fzid), \
|
|
(_nameMsg)->dataStreamZid = (_dsZid), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch))
|
|
|
|
/* For zHPT_FILEHANDLEID - This identifies a file object based on a
|
|
* fileHandleID. */
|
|
#define COMN_SETUP_NAMING_MSG_FILEHANDLEID(_nameMsg,_fhID,_latchType,_nsid, \
|
|
_nType) \
|
|
((_nameMsg)->handlePathType = zHPT_FILEHANDLEID, \
|
|
(_nameMsg)->parseMode = NAMPMODE_Undefined, \
|
|
COMN_SET_FILEHANDLE_ID(&(_nameMsg)->fileHandle,(_fhID)), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType))
|
|
|
|
/* For zHPT_VOLUME_ZID_PATH - This identifies a file object based on a starting
|
|
* volumeID, Zid, and a path string relative the the Zid. */
|
|
#define COMN_SETUP_NAMING_MSG_VOLUME_ZID_PATH(_nameMsg,_volumeID, \
|
|
_fzid,_znType,_pathStr,_pathFmt,_pMode,_latchType, \
|
|
_nsid,_nType,_pMatch,_retPLen,_retVolume,_retpath) \
|
|
((_nameMsg)->handlePathType = zHPT_VOLUME_ZID_PATH, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->volumeID = (_volumeID), \
|
|
(_nameMsg)->fileParentZid = zINVALID_ZID, \
|
|
(_nameMsg)->fileZid = (_fzid), \
|
|
(_nameMsg)->zidNameType = (_znType), \
|
|
(_nameMsg)->dataStreamZid = (_fzid), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch), \
|
|
(_nameMsg)->retPathLen = (_retPLen), \
|
|
(_nameMsg)->retVolumeID = (_retVolume), \
|
|
(_nameMsg)->retPath = (_retpath))
|
|
|
|
/* For zHPT_ADMIN_VOLUME_ZID_PATH - This identifies a file object based on the
|
|
* admin volume, Zid, and a path string relative the the Zid. */
|
|
#define COMN_SETUP_NAMING_MSG_ADMIN_VOLUME_ZID_PATH(_nameMsg,_fzid, \
|
|
_znType,_pathStr,_pathFmt,_pMode,_latchType,_nsid, \
|
|
_nType,_pMatch,_retPLen,_retVolume,_retpath) \
|
|
((_nameMsg)->handlePathType = zHPT_ADMIN_VOLUME_ZID_PATH, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->fileParentZid = zINVALID_ZID, \
|
|
(_nameMsg)->fileZid = (_fzid), \
|
|
(_nameMsg)->zidNameType = (_znType), \
|
|
(_nameMsg)->dataStreamZid = (_fzid), \
|
|
(_nameMsg)->path.voidPtr = (_pathStr), \
|
|
(_nameMsg)->pathFormat = (_pathFmt), \
|
|
(_nameMsg)->nameSpaceID = (_nsid), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch), \
|
|
(_nameMsg)->retPathLen = (_retPLen), \
|
|
(_nameMsg)->retVolumeID = (_retVolume), \
|
|
(_nameMsg)->retPath = (_retpath))
|
|
|
|
/* For zHPT_SEARCH_PATTERN - this option is used for containing a search pattern
|
|
* as in COMN_ReadDir or some calls to COMN_Rename. */
|
|
#define COMN_SETUP_NAMING_MSG_PATTERN(_nameMsg,_pattern, \
|
|
_nSpace,_nType,_patfmt,_pMatch) \
|
|
((_nameMsg)->handlePathType = zHPT_SEARCH_PATTERN, \
|
|
(_nameMsg)->parseMode = NAMPMODE_Undefined, \
|
|
(_nameMsg)->latchType = XLATCHED, \
|
|
(_nameMsg)->path.voidPtr = (_pattern), \
|
|
(_nameMsg)->pathFormat = (_patfmt), \
|
|
(_nameMsg)->nameSpaceID = (_nSpace), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->match = (_pMatch))
|
|
|
|
/* For internal use where we already have a file beast pointer.
|
|
* WARNING!!! WARNING!!! WARNING!!!
|
|
* The caller of this MACRO must call COMN_USE_BEAST
|
|
* on the following beast pointers BEFORE calling this macro:
|
|
* _volume ( both standard useCount and the keepActiveUseCount must be incremented)
|
|
* _beast (twice, once for curFile and once for curDataStream)
|
|
* _nSpace
|
|
* The caller must also latch the beast before calling this function and
|
|
* must pass in how it was latched (_latchType). */
|
|
#define COMN_SETUP_NAMING_MSG_FILE_BEAST_PTR(_nameMsg,_volume,_pZid, \
|
|
_beast,_pMode,_latchType,_nSpace,_nType,_pMatch) \
|
|
((_nameMsg)->handlePathType = zHPT_VOLUME_ZID, \
|
|
(_nameMsg)->parseFlags = NAMPFL_nameMsgFullyResolved, \
|
|
(_nameMsg)->parseMode = (_pMode), \
|
|
(_nameMsg)->latchType = (_latchType), \
|
|
(_nameMsg)->curvol = (_volume), \
|
|
(_nameMsg)->volumeID = (_volume)->VOLvolumeID, \
|
|
(_nameMsg)->fileParentZid = (_pZid), \
|
|
zASSERT(COMN_IsDerivedFrom((_beast),zFTYPE_FILE)), \
|
|
(_nameMsg)->curFile = (_beast), \
|
|
(_nameMsg)->curDataStream = ((NamedBeast_s *)(_beast)), \
|
|
(_nameMsg)->zidNameType = (_nType), \
|
|
(_nameMsg)->fileNameType = (_nType), \
|
|
(_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->workNameType = (_nType), \
|
|
(_nameMsg)->workNameSpace = (_nSpace), \
|
|
(_nameMsg)->nameSpaceID = (_nSpace)->nSpaceID, \
|
|
(_nameMsg)->workNameSpaceID = (_nSpace)->nSpaceID, \
|
|
(_nameMsg)->match = (_pMatch))
|
|
|
|
|
|
/* For internal use where we already have a beast pointer.
|
|
* WARNING!!! WARNING!!! WARNING!!!
|
|
* You must follow the same rules as "COMN_SETUP_NAMING_MSG_BEAST_PTR" plus
|
|
* the work buffer MUST be allocated by calling "COMN_GetPathNameWorkBuffer"
|
|
* The work Buffer must point to a single component in unicode format.
|
|
*/
|
|
#define COMN_SETUP_NAMING_MSG_FILE_BEAST_PTR_WITH_WORKBUF(_nameMsg,_volume, \
|
|
_pZid,_beast,_pMode,_latchType,_nSpace, \
|
|
_nType,_pMatch,_workBuf) \
|
|
(COMN_SETUP_NAMING_MSG_FILE_BEAST_PTR(_nameMsg,_volume,_pZid, \
|
|
_beast,_pMode,_latchType,_nSpace, \
|
|
_nType,_pMatch),\
|
|
(_nameMsg)->handlePathType = zHPT_VOLUME_ZID_PATH, \
|
|
(_nameMsg)->workBuffer = (_workBuf), \
|
|
NSPACE_SETUP_UNICODE_SCAN_MSG(&(_nameMsg)->scanMsg,0,NULL, \
|
|
(_workBuf)), \
|
|
(_nameMsg)->scanMsg.retUnicodeComp = (_workBuf), \
|
|
(_nameMsg)->scanMsg.retScanFlags = NSRETSFL_componentIsUnicode, \
|
|
(_nameMsg)->retParseFlags = (NAMRETPFL_haveAParsedComponent | \
|
|
NAMRETPFL_lastComponent))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* These macro are used to modify a naming structure AFTER it is setup.
|
|
*---------------------------------------------------------------------------*/
|
|
/* use this to set naming mode values*/
|
|
#define COMN_SET_NAMING_MSG_NAMETYPES(_nameMsg,_nType) \
|
|
((_nameMsg)->nameType = (_nType), \
|
|
(_nameMsg)->zidNameType = (_nType))
|
|
|
|
/* use this to set naming mode values*/
|
|
#define COMN_SET_NAMING_MSG_PARSEMODE(_nameMsg,_pMode) \
|
|
((_nameMsg)->parseMode = (_pMode))
|
|
|
|
/* add the volume pointer to the name message. NOTE -- The volume pointer
|
|
* must have both the basic useCount and the keepActiveUseCount incremented
|
|
* whenever a nameMsg points to it. */
|
|
#define COMN_SET_NAMING_MSG_VOLUME(_nameMsg,_vol) \
|
|
((_nameMsg)->curvol=(_vol))
|
|
|
|
/* add a path count to the name message */
|
|
#define COMN_SET_NAMING_MSG_PATHCOUNT(_nameMsg,_pathcnt) \
|
|
((_nameMsg)->pathCount=(_pathcnt))
|
|
|
|
/* add a path length to the name message */
|
|
#define COMN_SET_NAMING_MSG_PATHLENGTH(_nameMsg,_pathlen) \
|
|
((_nameMsg)->pathLength=(_pathlen))
|
|
|
|
/* use this to set naming flags to allow wildcarding */
|
|
#define COMN_ALLOW_WILDCARDING(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_allowWildcardChars)
|
|
|
|
/* use this to set naming flags to disallow wildcarding */
|
|
#define COMN_DISALLOW_WILDCARDING(_nameMsg) \
|
|
((_nameMsg)->parseFlags &= ~NAMPFL_allowWildcardChars)
|
|
|
|
/* use this to set an override unicode_t conversion rule table and
|
|
* and override validCharBitMap. These fields are ignored unless the
|
|
* input path in in ASCII format. */
|
|
#define COMN_SET_NAMING_MSG_ASCII_CONVERT_OVERRIDES(_nameMsg,_convType,_bMap) \
|
|
((_nameMsg)->scanMsg.uniConversionType = (_convType), \
|
|
(_nameMsg)->scanMsg.asciiValidCharBitMap = (_bMap))
|
|
|
|
/* Use this to disable uppercasing of ascii strings during the validation
|
|
* Only use this when the string is already guaranteed to be upper case */
|
|
#define COMN_SET_NAMING_MSG_DONT_UPPERCASE_ASCII(_nameMsg) \
|
|
((_nameMsg)->scanMsg.scanFlags |= NSSFL_dontUpperCaseAscii)
|
|
|
|
/* Use this to disable treatment of break characters as special characters.
|
|
* With this bit set, the second character will not be treated as part of
|
|
* a two byte sequence. */
|
|
#define COMN_SET_NAMING_MSG_BREAK_NOT_SPECIAL(_nameMsg) \
|
|
((_nameMsg)->scanMsg.scanFlags |= NSSFL_asciiBreakNotSpecial)
|
|
|
|
/* Use this to tell the parsing code to insert ascii break characters */
|
|
#define COMN_SET_NAMING_MSG_INSERT_BREAKS(_nameMsg) \
|
|
((_nameMsg)->scanMsg.scanFlags |= NSSFL_insertAsciiBreaks)
|
|
|
|
/* Use this to tell the parsing code to allow short ascii length strings */
|
|
#define COMN_SET_NAMING_MSG_ALLOW_SHORT_ASCII_LEN(_nameMsg) \
|
|
((_nameMsg)->scanMsg.scanFlags |= NSSFL_allowShortAsciiLenStrings)
|
|
|
|
/* Use this to disable rights checks on Open and create */
|
|
#define COMN_SET_NAMING_MSG_DONT_DO_RIGHTS_CHECKS(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_dontDoRightsChecks)
|
|
|
|
/* Use this to disable visibility checks on Open */
|
|
#define COMN_SET_NAMING_MSG_DONT_DO_VISIBILITY_CHECKS(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_dontDoVisibilityChecks)
|
|
|
|
/* Use this to tell the parsing code to force convert the component to unicode */
|
|
#define COMN_SET_NAMING_MSG_FORCE_CONVERT_TO_UNICODE(_nameMsg) \
|
|
((_nameMsg)->scanMsg.scanFlags |= NSSFL_forceConvertToUnicode)
|
|
|
|
/* Use this to set naming flags to allow operating on links themselves */
|
|
#define COMN_SET_NAMING_MSG_OPERATE_ON_LINK(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_operateOnLinkItself)
|
|
|
|
/* Use this to set naming flags to allow operating on links themselves */
|
|
#define COMN_SET_NAMING_MSG_FULLY_RESOLVED(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_nameMsgFullyResolved)
|
|
|
|
/* Use this to set naming flags to allow operating on links themselves */
|
|
#define COMN_SET_NAMING_MSG_DONT_LOCK_VOLUME_ACTIVE(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_dontLockVolumeActive)
|
|
|
|
/* Use this to tell the parsing code to allow short ascii length strings */
|
|
#define COMN_SET_NAMING_MSG_CONTINUE_AFTER_ILLEGAL_CHARS(_nameMsg) \
|
|
((_nameMsg)->scanMsg.scanFlags |= NSSFL_continueAfterIllegalChars)
|
|
|
|
/* Use this to set naming flags to instruct the parsing code to try a lookup
|
|
* in the DOS name space if a lookup in the LONG name space fails. */
|
|
#define COMN_SET_NAMING_MSG_TRY_DOS_IF_LONG_FAILS(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_tryDosIfLongFails)
|
|
|
|
/* Use this to set the fact that the open is from VFS layer and so
|
|
* no need to get an extra usecount on the inode */
|
|
#define COMN_SET_VFS_MODE_OPEN(_nameMsg) \
|
|
((_nameMsg)->parseFlags |= NAMPFL_noExtraInodeCount)
|
|
/*-------------------------------------------------------------------------
|
|
* These are the parseMode and parseFlag defines for naming
|
|
*-------------------------------------------------------------------------
|
|
* NamingMsg.parseMode - These modes control how the path string in
|
|
* "nameMsg->path" is processed. As the path string is parsed the
|
|
* separate name components are validated and copied into the
|
|
* "nameMsg->workName" buffer. The purpose of the name parsing routines
|
|
* is to get the address of the beast structure that is associated with
|
|
* the given name. This structure is returned in "nameMsg->curBeast".
|
|
*
|
|
* Definition of terms:
|
|
* leaf name - The last name component on a filename string
|
|
*-------------------------------------------------------------------------*/
|
|
#define NAMPMODE_Undefined 0
|
|
/* undefined mode */
|
|
|
|
#define NAMPMODE_DoNotResolveLeafName 1
|
|
/* Resolve path string down to the
|
|
* leaf name. This does NOT convert the leaf
|
|
* name to a beast pointer.
|
|
* The "nameMsg->curComponent" field is
|
|
* left pointing to the leaf name.
|
|
* You get the beast of the parent directory
|
|
* in "nameMsg->curBeast". */
|
|
|
|
#define NAMPMODE_FullyResolveAny 2
|
|
/* Fully resolve the path string
|
|
* to the final component. The final beast
|
|
* may be either a container or a
|
|
* non-container */
|
|
|
|
#define NAMPMODE_FullyResolveNonDirectory 3
|
|
/* Fully resolve the path string
|
|
* to the final component. The final beast
|
|
* must be a non-directory container. */
|
|
|
|
#define NAMPMODE_FullyResolveDirectory 4
|
|
/* Fully resolve the path string
|
|
* to the final component. The final beast
|
|
* must be a directory container. */
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* NamingMsg.parseFlags - These are additional mode bits the control different
|
|
* aspects of parsing the name.
|
|
*---------------------------------------------------------------------------*/
|
|
#define NAMPFL_dontDoVisibilityChecks 0x0001
|
|
/* If SET, the path lookup code should not
|
|
* do any visibility checking. This flag can
|
|
* only be set by internal APIs -- never
|
|
* by an external NCP */
|
|
#define NAMPFL_dontDoRightsChecks 0x0002
|
|
/* If SET, the path lookup code should not
|
|
* do any rights checking. This flag can
|
|
* only be set by internal APIs -- never
|
|
* by an external NCP */
|
|
#define NAMPFL_allowWildcardChars 0x0004
|
|
/* If SET, allow wildcard chars in the
|
|
* leaf name during name validation*/
|
|
#define NAMPFL_mustBeFullyQualified 0x0008
|
|
/* If SET, the nameMsg must contain a
|
|
* fully qualified path. */
|
|
#define NAMPFL_nameMsgValidated 0x0010
|
|
/* If SET, the NMSG_ValidateNameMsg
|
|
* function has already been called on
|
|
* this nameMsg and it does not need to
|
|
* be called again. */
|
|
#define NAMPFL_nameMsgFullyResolved 0x0020
|
|
/* This flag is set once the name message
|
|
* has been fully resolved (including
|
|
* match attribute checking). When this
|
|
* flag is set, subsequent calls to
|
|
* COMN_Lookup will return immediately */
|
|
#define NAMPFL_operateOnLinkItself 0x0040
|
|
/* If SET and the object being named is
|
|
a link, the associated operation is to
|
|
be carried out on the link itself
|
|
instead of the object to which the link
|
|
refers. */
|
|
#define NAMPFL_dontLockVolumeActive 0x0080
|
|
/* If SET, the curvol pointer in the
|
|
* nameMsg will not be required to point
|
|
* to an ACTIVE volume, and it will not
|
|
* have its keepActiveUseCount incremented */
|
|
#define NAMPFL_tryDosIfLongFails 0x0100
|
|
/* If SET, the lookup code should try the
|
|
* DOS namespace if a lookup in the LONG
|
|
* namespace fails. */
|
|
#define NAMPFL_XLatchAfterLookup 0x0200
|
|
/* If SET, the lookup will do SLATCHES
|
|
* all the way down until we consider
|
|
* the beast to be fully resolved. Then
|
|
* we will convert the latching to an
|
|
* XLatch
|
|
*/
|
|
#define NAMPFL_dontProcessHardLink 0x0400
|
|
/* If SET, do NOT return the primary beast
|
|
* when a hardlink beast is detected, rather
|
|
* just return the hardlink beast */
|
|
#define NAMPFL_noExtraInodeCount 0x0800
|
|
/* If SET the open request is from the VFS
|
|
* layer, so do not get an extra use count
|
|
* on the inode and no need for the fh to
|
|
* point to this inode. VFS layer knows the
|
|
* file is open and will keep a use count on
|
|
* the inode. The reason we need this is
|
|
* because the file lease code assumes a
|
|
* direct corelation between the i_count
|
|
* value and number of times the file is open.
|
|
*/
|
|
/*---------------------------------------------------------------------------
|
|
* NamingMsg.retParseFlags - These are options that are set by the namespace
|
|
* parsing routine "GetAndValidateNextName" they inform the upper layers
|
|
* the current status of name parsing.
|
|
*---------------------------------------------------------------------------*/
|
|
#define NAMRETPFL_haveAParsedComponent 0x01
|
|
/* If SET, we have a parsed component in
|
|
* the scanMsg */
|
|
#define NAMRETPFL_lastComponent 0x02
|
|
/* If SET, we have processed the last
|
|
* component in a path string */
|
|
#define NAMRETPFL_hasDeletedNameType 0x04
|
|
/* if SET, the deleted name type was
|
|
* encountered in the path parsing, meaning
|
|
* that the file is in the deleted
|
|
* salvage system and cannot be modified */
|
|
#define NAMRETPFL_changeNameSpace 0x08
|
|
/* If SET, the last component parsed included
|
|
* a change of name space. We save this
|
|
* flag here and don't do the actual change
|
|
* until the next scan component, because
|
|
* when dealing with ASCII name caches we
|
|
* need to keep the old name space around
|
|
* until we are done with the cur component */
|
|
#define NAMRETPFL_foundDOSNameWithLong 0x40
|
|
/* (This bit is not set by the namespace
|
|
* parsing code.) It is set by
|
|
* NAME_FindNameInDirSpecialRules if a
|
|
* lookup finds a name in the DOS namespace
|
|
* when LONG was specified. */
|
|
#define NAMRETPFL_parentIsImmCompress 0x80
|
|
/* (This bit is not set by the namespace
|
|
* parsing code.) It is set by COMN_Lookup
|
|
* if the parent directory of a file has
|
|
* the immediate compress attribute bit set */
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _MSGNAME_H_ */
|