/*
 * Copyright 2000, International Business Machines Corporation and others.
 * All Rights Reserved.
 *
 * This software has been released under the terms of the IBM Public
 * License.  For details, see the LICENSE file in the top-level source
 * directory or online at http://www.openafs.org/dl/license10.html
 */

#ifndef _BSA_XBSA_H_
#define _BSA_XBSA_H_

#ifdef __cplusplus
extern "C" {
#endif

#if (SYS_V > 3) || defined(BERK4_2) || defined(SUN4)
#include <sys/time.h>
#else
#include <time.h>
#endif

#ifdef bool_t
#undef bool_t
#endif

/* include TSM Header Files. */
#include <dsmapitd.h>
#include <dsmapifp.h>
#include <dsmrc.h>

/* BSA_Boolean  */
typedef char BSA_Boolean;

/* BSA_Int16 */
typedef short BSA_Int16;

/* BSA_Int32 */
typedef long BSA_Int32;

/* BSA_Int64  */
typedef struct {    /* defined as two 32-bit integers */
    BSA_Int32   left;
    BSA_Int32   right;
} BSA_Int64;

/* BSA_UInt16  */
typedef unsigned short BSA_UInt16;

/* BSA_UInt32 */
typedef unsigned long BSA_UInt32;

/* BSA_UInt64  */
typedef struct {        /* defined as two unsigned 32-bit integers*/
    BSA_UInt32  left;
    BSA_UInt32  right;
} BSA_UInt64;

/*-------------------------------------------------------------------------+
|  ADSM specific constants and return codes                                |
+-------------------------------------------------------------------------*/
/* TSM library version, release, level
 */
#define BSA_API_VERSION     5
#define BSA_API_RELEASE     2
#define BSA_API_LEVEL       0

/* Constants used  */
#define ADSM_MAX_DESC               100     /* ADSM max Desc size             */
#define ADSM_MAX_OBJINFO            100     /* ADSM max object info size      */
#define ADSM_LOWEST_BOUND           0x0000  /* value for LowerBound min       */
#define ADSM_HIGHEST_BOUND          0xFFFF  /* value for UpperBound max       */
#define ADSM_ENV_STRS               3       /* number of env strings          */
#define ObjectDescriptorVersion     1       /* ver for ObjectDescriptor       */
#define UserDescriptorVersion       1       /* ver for UserDescriptor         */

/* Return Codes Used
 */
#define BSA_RC_OK                           0x00
#define BSA_RC_SUCCESS                      0x00

#define ADSM_RC_ERROR                       0x60 /* see ADSM error log        */
#define ADSM_RC_INVALID_NODE                0x61 /* BSAObjOwner not match Init*/
#define ADSM_RC_INVALID_COPYTYPE            0x62 /* invalid copyType          */
#define ADSM_RC_INVALID_OBJTYPE             0x63 /* invalid objectType        */
#define ADSM_RC_INVALID_STATUS              0x64 /* invalid object status     */
#define ADSM_RC_INVALID_ST_VER              0x65 /* invalid structure version */
#define ADSM_RC_OWNER_TOO_LONG              0x66 /* owner too long            */
#define ADSM_RC_PSWD_TOO_LONG               0x67 /* pswd  too long            */
#define ADSM_RC_PSWD_GEN                    0x68 /* pswd access = generate    */

/* Constants used
 *
 * Maximum string lengths (lower bound), including trailing null
 */
#define BSA_LIST_ELEMENT_DELIMITER  null    /* Element delimiter in list      */
#define BSA_MAX_ADMIN_NAME          64      /* Administrator name             */
#define BSA_MAX_APPOBJECT_OWNER     64      /* Max end-object owner length    */
#define BSA_MAX_BSAOBJECT_OWNER     64      /* Max BSA object owner length    */
#define BSA_MAX_CG_DEST             31      /* Copy group destination         */
#define BSA_MAX_CG_NAME             31      /* Max copy group name length     */
#define BSA_MAX_COPYGROUPS          16      /* Max number of copy groups      */
                                            /* which can be specified in a    */
                                            /* lifecycle group                */
#define BSA_MAX_DESC                256     /* Description field              */
#define BSA_MAX_ENCODINGMETHOD      31      /* Max encoding method length     */
#define BSA_MAX_EVENTINFO           256     /* Max event info size            */
#define BSA_MAX_FILTERRULESET       8192    /* Max filter rule set size       */
#define BSA_MAX_OSNAME              1024    /* Max Objectspace name length    */
#define BSA_MAX_LG_NAME             31      /* Life cycle group name          */
#define BSA_MAX_LIFECYCLEGROUPS     64      /* Max number of life cycle       */
                                            /* groups in a policy set         */
#define BSA_MAX_OBJINFO             512     /* Max object info size           */
#define BSA_MAX_PATHNAME            1024    /* Max path name length           */
#define BSA_MAX_POLICYDOMAINS       256     /* Max number of specific policy  */
                                            /* domains an administrator may   */
                                            /* be responsible for             */
#define BSA_MAX_POLICYDOMAIN_NAME   31      /* Policy domain name             */
#define BSA_MAX_POLICYSETS          16      /* Max number of policy sets      */
                                            /* in a domain                    */
#define BSA_MAX_POLICYSET_NAME      31      /* Policy set name                */
#define BSA_MAX_RESOURCETYPE        31      /* Max resource mgr name length   */
#define BSA_MAX_TOKEN_SIZE          64      /* Max size of a security token   */
#define BSA_PUBLIC              "BSA_ANY"   /* Default string                 */

/* Return Codes Used
 *
 * Return Code descriptions are given in Section 4.3.
 */
#define BSA_RC_ABORT_ACTIVE_NOT_FOUND       0x02
#define BSA_RC_ABORT_SYSTEM_ERROR           0x03
#define BSA_RC_AUTHENTICATION_FAILURE       0x04
#define BSA_RC_BAD_CALL_SEQUENCE            0x05
#define BSA_RC_BAD_HANDLE                   0x06
#define BSA_RC_BUFFER_TOO_SMALL             0x07
#define BSA_RC_DESC_TOO_LONG                0x08
#define BSA_RC_OBJECTSPACE_TOO_LONG         0x09
#define BSA_RC_INVALID_TOKEN                0x0a
#define BSA_RC_INVALID_VOTE                 0x0b
#define BSA_RC_INVALID_KEYWORD              0x0c
#define BSA_RC_MATCH_EXISTS                 0x0d
#define BSA_RC_MORE_DATA                    0x0e
#define BSA_RC_MORE_RULES                   0x0f
#define BSA_RC_NEWTOKEN_REQD                0x10
#define BSA_RC_NO_MATCH                     0x11
#define BSA_RC_NO_MORE_DATA                 0x12
#define BSA_RC_NO_RESOURCES                 0x13
#define BSA_RC_NULL_DATABLKPTR              0x14
#define BSA_RC_NULL_OBJNAME                 0x15
#define BSA_RC_NULL_POINTER                 0x16
#define BSA_RC_NULL_RULEID                  0x17
#define BSA_RC_OBJECT_NAME_TOO_LONG         0x18
#define BSA_RC_OBJECT_NOT_EMPTY             0x19
#define BSA_RC_OBJECT_NOT_FOUND             0x1a
#define BSA_RC_OBJINFO_TOO_LONG             0x1b
#define BSA_RC_OBJNAME_TOO_LONG             0x1c
#define BSA_RC_OPERATION_NOT_AUTHORIZED     0x1d
#define BSA_RC_OLDTOKEN_REQD                0x1e
#define BSA_RC_TOKEN_EXPIRED                0x1f
#define BSA_RC_TXN_ABORTED                  0x20
#define BSA_RC_UNMATCHED_QUOTE              0x21
#define BSA_RC_USER_OWNS_OBJECTS            0x22

/* AppObjectOwner
 */
typedef char AppObjectOwner[BSA_MAX_APPOBJECT_OWNER];

/* BSAObjectOwner
 */
typedef char BSAObjectOwner[BSA_MAX_BSAOBJECT_OWNER];

/* CopyGpDest
 */
typedef char CopyGpDest[BSA_MAX_CG_DEST];

/* CopyGpName
 */
typedef char CopyGpName[BSA_MAX_CG_NAME];

/* CopyMode
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * INCREMENTAL  1         Specifies that the Backup Services should make a
 *                        copy only if the application object has been
 *                        modified since the last time this copy group was
 *                        used to create the object's copy.
 * ABSOLUTE     2         Specifies that the Backup Services should make a
 *                        copy even if the application object has not been
 *                        modified since the last time this copy group was
 *                        used to create the object's copy.
 */
typedef enum {
    BSACopyMode_INCREMENTAL = 1,
    BSACopyMode_ABSOLUTE = 2
} CopyMode;

/* CopySerialization
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * STATIC       1         Specifies that the Backup Services must create a
 *                        consistent (unmodified during the operation) copy of
 *                        the object.  If the application is unable to create a
 *                        consistent copy then it should skip the operation
 *                        (creating backup or archive copy) for the object.
 * SHAREDSTATIC 2         Specifies that the Backup Services must create a
 *                        consistent copy of the object.  It can retry the
 *                        operation a number of times (application dependent).
 *                        If the Backup Services is unable to create a
 *                        consistent copy even after retries, then it should
 *                        skip creating a backup or archive copy of the
 *                        object.
 * SHAREDDYNAMIC 3        Specifies that the Backup Services must create a
 *                        copy of the object.  It can retry the operation a
 *                        number of times in an attempt to create a consistent
 *                        copy; however, if it fails to make a consistent
 *                        copy, a copy must still be made, ignoring the fact
 *                        that the copy may have been modified during the
 *                        operation.  Such copies are useful for log file
 *                        objects which are being continuously modified.
 * DYNAMIC      4         Specifies that the Backup Services must create a
 *                        copy of the obbject even if the source object is
 *                        modified during the operation.  No retries should be
 *                        attempted to create a consistent copy.
 */
typedef enum {
    BSACopySerialization_STATIC = 1,
    BSACopySerialization_SHAREDSTATIC = 2,
    BSACopySerialization_SHAREDDYNAMIC = 3,
    BSACopySerialization_DYNAMIC = 4
} CopySerialization;

/* CopyType
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * ANY          1         Used for matching any copy type (e.g. "backup" or
 *                        "archive" in the copy type field of structures for
 *                        selecting query results).
 * ARCHIVE      2         Specifies that the copy type should be "archive".
 *                        When used in the copy type field of the CopyGroup,
 *                        it identifies the copy data as of type
 *                        ArchiveCopyData, which is used to create archive
 *                        copies.
 * BACKUP       3         Specifies that the copy type should be "backup".
 *                        When used in the copy type field of the CopyGroup,
 *                        it identifies the copy data as of type
 *                        BackupCopyData, which is used to create backup
 *                        copies.
 */
typedef enum {
    BSACopyType_ANY = 1,
    BSACopyType_ARCHIVE = 2,
    BSACopyType_BACKUP = 3
} CopyType;

/* Description
 */
typedef char Description[BSA_MAX_DESC];

/* DomainName
 */
typedef char * DomainName[BSA_MAX_POLICYDOMAIN_NAME];

/* EventInfo
 */
typedef char EventInfo[BSA_MAX_EVENTINFO];

/* LGName
 */
typedef char LGName[BSA_MAX_LG_NAME];

/* ObjectInfo
 */
typedef char ObjectInfo[BSA_MAX_OBJINFO];

/* ObjectName
 */
typedef struct {
    char    objectSpaceName[BSA_MAX_OSNAME]; /* Highest-level name qualifier */
    char    pathName[BSA_MAX_PATHNAME];      /* Object name within           */
                                             /* objectspace                  */
} ObjectName;

/* ObjectOwner
 */
typedef struct {
    BSAObjectOwner  bsaObjectOwner;    /* BSA Owner name - this is the name  */
                                       /* that Backup Services authenticates */
    AppObjectOwner  appObjectOwner;    /* End-owner name, this is the name   */
                                       /* defined by the application         */
} ObjectOwner;

/* ObjectSize
 */
typedef BSA_UInt64 ObjectSize;         /* Unsigned 64-bit integer */

/* ObjectStatus
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * ANY          1         Provides a wild card function.  Can only be used in
 *                        queries.
 * ACTIVE       2         Indicates that this is the most recent backup copy
 *                        of an object.
 * INACTIVE     3         Indicates that this is not the most recent backup
 *                        copy, or that the object itself no longer exists.
 */
typedef enum {
    BSAObjectStatus_ANY = 1,
    BSAObjectStatus_ACTIVE = 2,
    BSAObjectStatus_INACTIVE = 3
} ObjectStatus;

/* ObjectType
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * any          1         Used for matching any object type (e.g. "file" or
 *                        "directory") value in the object type field of
 *                        structures for selecting query results.
 * file         2         Used by the application to indicate that the type of
 *                        application object is a "file" or single object.
 * directory    3         Used by the application to indicate that the type of
 *                        application object is a "directory" or container of
 *                        objects.
 */

typedef enum {
    BSAObjectType_ANY  = 1,
    BSAObjectType_FILE    = 2,
    BSAObjectType_DIRECTORY = 3,
    BSAObjectType_DATABASE = 4,
 } ObjectType;

/* Operation
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * archive      1         Used to indicate that a scheduled operation is of
 *                        type "archive".
 * backup       2         Used to indicate that a scheduled operation is of
 *                        type "backup".
 */
typedef enum {
    BSAOperation_ARCHIVE = 1,
    BSAOperation_BACKUP  = 2
} Operation;

/* Period
 *
 * Use of the Period structure in a Schedule for an event:
 * 1. The Schedule structure specifies 3 timing elements:
 *    a. "firstStartTime" - a timestamp showing the "earliest"
 *        possible time the event could take place
 *    b. "day" - the day of the week the event should occur
 *    c. "frequency" - the period between successive events
 * 2. To determine the day the event should occur (this does
 *    not change the time of the event in the day):
 *    a. Determine the requested day from "firstStartTime".
 *    b. If "day" does not equal XBSA_DAYOFWEEK_ANY
 *       i. Compare "day" to the day of the week corresponding
 *          to "firstStartTime" determined in 2a above.
 *       ii.If the days match, then use "firstStartTime" else
 *          use the first "day" *following* the day shown
 *          in "firstStartTime" as the day of the event.
 * 3. If the PeriodWhich field in the Period structure is other
 *    than XBSA_PERIOD_UNDEFINED, then successive events are
 *    determined using the value of "periodData".
 *    a. For seconds and days, the appropriate seconds or days
 *       are added to the "firstStartTime" and step 2 to correct
 *       for the day of the week (if needed) is applied again.
 *    b. If a monthly period is specified, then the appropriate
 *       number of months are added by incrementing the month index is
 *       made (for example, a one month increment from February to
 *       March).  If the monthly date is not valid (for example, January
 *       30 --> February 30) then the last day of the desired month is
 *       used (example January 30 --> February 28).  Then step 2 is
 *       followed to adjust for the requested day (which might move the
 *       event time into the following month).
 */
typedef enum {
    BSAPeriod_SECONDS = 1,
    BSAPeriod_DAYS = 2,
    BSAPeriod_MONTHS = 3,
    BSAPeriod_UNDEFINED = -9,
    BSAPeriod_DAILY = 4, BSAPeriod_WEEKLY = 5, BSAPeriod_MONTHLY = 6,
    BSAPeriod_QUARTERLY = 7, BSAPeriod_ANNUALLY = 8
} PeriodWhich;

typedef struct {
    PeriodWhich     which;
    union {
        time_t      nSeconds;
        BSA_Int16   nDays;
        BSA_Int16   nMonths;
    } periodData;
} Period;

/* ResourceType
 */
typedef char ResourceType[BSA_MAX_RESOURCETYPE];

/* RuleId
 */
typedef BSA_UInt64 RuleId;

/* Scheduleid
 */
typedef BSA_UInt64 ScheduleId;

/* AccessRight
 *
 * Constant     Value     Explanation
 * --------     -----     -----------
 * GET          1         Access right for getting an object from Backup
 *                        Services, also includes access right for querying
 *                        (getting attributes) an object from Backup Services.
 * QUERY        2         Access right for querying (getting attributes) an
 *                        object from Backup Services.
 */
typedef enum {
    BSAAccessRight_GET  = 1,
    BSAAcessRight_QUERY = 2
} AccessRight;

/* AccessRule
 */
typedef struct {
    RuleId          ruleId;         /* Provided by Backup Services            */
    ObjectName      objName;        /* Object name to be given access         */
    ObjectOwner     objectOwner;    /* BSA object owner and Applicaton object */
                                    /* owner to be given access               */
    AccessRight     rights;         /* The access rights to be given          */
} AccessRule;

/* ApiVersion
 */
typedef struct {
    BSA_UInt16      version;        /* Version of this API                    */
    BSA_UInt16      release;        /* Release of this API                    */
    BSA_UInt16      level;          /* Level of this API                      */
} ApiVersion;

/* ArchiveCopyData
 */
typedef struct {
    CopyGpName          cGName;     /* Copy group name                        */
    BSA_UInt16          freq;       /* Archive frequency                      */
    CopySerialization   copySer;    /* Copy serialization code                */
    CopyMode            copyMode;   /* Copy mode                              */
    CopyGpDest          destName;   /* Copy destination name                  */
    BSA_UInt16          retVersion; /* Retention time for the version         */
} ArchiveCopyData;

/* BackupCopyData
 */
typedef struct {
    CopyGpName          cGName;     /* Copy group name                        */
    BSA_UInt16          freq;       /* Backup frequency                       */
    CopySerialization   copySer;    /* Copy serialization code                */
    CopyMode            copyMode;   /* Copy mode: 1=modified, 2=absolute      */
    CopyGpDest          destName;   /* Copy destination name                  */
    BSA_UInt16          verDataEx;  /* Versions (number of versions           */
                                    /* retained)                              */
    BSA_UInt16          verDataDel; /* Versions (data deleted)                */
    Period              retXtraVer; /* Retain extra versions                  */
    Period              retOnlyVer; /* Retain only versions                   */
} BackupCopyData;

/* CopyGroup
 */
typedef struct {
    CopyType    copyType;       /* Type of copy group: archive, backup, etc   */
    union {
        ArchiveCopyData archive;
        BackupCopyData  backup;
    } copyData;
} CopyGroup;

/* CopyId
 */
typedef BSA_UInt64      CopyId;

/* DataBlock
 */
typedef struct {
    BSA_UInt16  bufferLen;
    BSA_UInt16  numBytes;       /* Actual number of bytes read from */
                                /* or written to the buffer, or the */
                                /* minimum number of bytes needed   */
    char *      bufferPtr;
} DataBlock;

/* DayOfWeek
 */
typedef enum {
    BSADayOfWeek_Monday = 1,    BSADayOfWeek_Tuesday = 2,
    BSADayOfWeek_Wednesday = 3, BSADayOfWeek_Thursday = 4,
    BSADayOfWeek_Friday = 5,    BSADayOfWeek_Saturday = 6,
    BSADayOfWeek_Sunday = 7
} DayOfWeek;

/* Environment
 */
typedef struct {
    char * envVariables; /* Identifies the Backup Services instance and other */
                         /* implementation-dependent variables such as        */
                         /* communication ports, etc.  Each variable is a     */
                         /* (keyword, value) pair separated by a space.       */
                         /* If a value contains spaces, it must be            */
                         /* enclosed in single or double quotes.              */
} BSAEnvironment;

/* Event
 */
typedef struct {
    BSA_UInt32      eventId;    /* This is an internal (to Backup Services) id*/
    ObjectOwner     objectOwner;/* Identifies the owner of the event          */
    struct tm       time;       /* Identifies the time the action is to start */
    Operation       action;     /* Identifies the action (backup, archive)    */
    ObjectName      objName;    /* Identifies objects to be acted on          */
    ResourceType    resourceType;/* Identifies the resource manager for the   */
                                 /* event                                     */
    EventInfo       eventInfo;  /* User- and resource-manager-specific info   */
} BSAEvent;

/* MethodName
 */
typedef char EncodingMethod[BSA_MAX_ENCODINGMETHOD];

/* ObjectDescriptor
 */
typedef struct {
    BSA_UInt32      version;        /* Version number for this structure      */
    ObjectOwner     Owner;          /* Owner of the object                    */
    ObjectName      objName;        /* Object name                            */
    struct tm       createTime;     /* Supplied by Backup Services            */
    CopyType        copyType;       /* Copy type: archive or backup           */
    CopyId          copyId;         /* Supplied by Backup Services            */
    BSA_UInt64      restoreOrder;   /* Supplied by Backup Services            */
    LGName          lGName;         /* Associated Lifecycle Group name        */
    CopyGpName      cGName;         /* Copy group within the lifecycle group  */
    ObjectSize      size;           /* Object size may be up to 63 bits       */
    ResourceType    resourceType;   /* e.g. UNIX file system                  */
    ObjectType      objectType;     /* e.g. file, directory, etc.             */
    ObjectStatus    status;         /* Active/inactive, supplied by           */
                                    /* Backup Services                        */
    EncodingMethod * encodingList;  /* List of encoding Methods used, in      */
                                    /* application-defined order,             */
                                    /* terminated with a null entry           */
    Description     desc;           /* Descriptive label for the object       */
    ObjectInfo      objectInfo;     /* Application information                */
} ObjectDescriptor;

/* QueryDescriptor
 */
typedef struct {
    ObjectOwner     owner;          /* Owner of the object                    */
    ObjectName      objName;        /* Object name                            */
    struct tm       createTimeLB;   /* Lower bound on create time             */
    struct tm       createTimeUB;   /* Upper bound on create time             */
    struct tm       expireTimeLB;   /* Lower bound on expiration time         */
    struct tm       expireTimeUB;   /* Upper bound on expiration time         */
    CopyType        copyType;       /* Copy type: archive or backup           */
    LGName          lGName;         /* Associated Lifecycle Group name        */
    CopyGpName      cGName;         /* Copy group within the lifecycle group  */
    ResourceType    resourceType;   /* e.g. UNIX file system                  */
    ObjectType      objectType;     /* e.g. file, directory, etc.             */
    ObjectStatus    status;         /* Active/inactive, supplied by Backup    */
                                    /* Services                               */
    Description     desc;           /* Descriptive label for the object       */
} QueryDescriptor;                  /* "*" is interpreted as a meta character */
                                    /* wild card.                             */
                                    /* Any undefined value is interpreted as  */
                                    /* an error.                              */

/* Schedule
 */
typedef struct {
    ScheduleId      schedId;        /* Provided by Backup Services            */
    ObjectOwner     objectOwner;    /* Specifies the owner of the schedule    */
    Operation       operation;      /* Specifies the action to be taken       */
    struct tm       firstStartTime; /* Specifies the first time the action    */
                                    /* is to take place                       */
    DayOfWeek       day;            /* Specifies the day of week for the event*/
    Period          frequency;      /* Specifies the frequency, e.g. daily    */
    ObjectName      objectName;     /* Identifies objects to be acted on      */
    ResourceType    resourceType;   /* Identifies the resource manager for the*/
                                    /* schedule                               */
    EventInfo       scheduleInfo;   /* Resource manager specific information  */
} Schedule;

/* Security Token
 */
typedef char SecurityToken[BSA_MAX_TOKEN_SIZE];

/* StreamHandle
 */
typedef int StreamHandle;

/* UserDescriptor
 */
typedef struct t_UserDescriptor {
    BSA_UInt16      version;        /* Version num of this structure          */
    BSAObjectOwner  bsaObjectOwner; /* BSA Object owner name              */
    DomainName      domainName;     /* Policy domain for the user         */
    Description     desc;           /* User information                   */
} UserDescriptor;

/* Vote
 */
typedef enum {
    BSAVote_COMMIT = 1,
    BSAVote_ABORT  = 2
} Vote;

/* Function Prototypes for Data Movement API Subset
 * Note that int and long have been replaced with typedefs
 * from custom.h.
 */

extern BSA_Int16
BSABeginTxn
(      long              bsaHandle
);

extern BSA_Int16
BSAChangeToken
(      long              bsaHandle,
       SecurityToken    *oldTokenPtr,
       SecurityToken    *newTokenPtr
);

extern BSA_Int16
BSACreateObject
(      long              bsaHandle,
       ObjectDescriptor *objectDescriptorPtr,
       DataBlock        *dataBlockPtr
);

extern BSA_Int16
BSACreateObjectF
(      long              bsaHandle,
       ObjectDescriptor *objectDescriptorPtr,
       StreamHandle     *streamPtr
);

extern BSA_Int16
BSADeleteObject
(      long              bsaHandle,
       CopyType          copyType,
       ObjectName       *objectName,
       CopyId           *copyId
);

extern BSA_Int16
BSAEndData
(      long              bsaHandle
);

extern BSA_Int16
BSAEndTxn
(      long              bsaHandle,
       Vote              vote
);

extern BSA_Int16
BSAGetData
(      long              bsaHandle,
       DataBlock        *dataBlockPtr
);

extern BSA_Int16
BSAGetEnvironment
(      long              bsaHandle,
       ObjectOwner      *objectOwnerPtr,
       char            **environmentPtr
);

extern BSA_Int16
BSAGetNextQueryObject
(      long              bsaHandle,
       ObjectDescriptor *objectDescriptorPtr
);

extern BSA_Int16
BSAGetObject
(      long              bsaHandle,
       ObjectDescriptor *objectDescriptorPtr,
       DataBlock        *dataBlockPtr
);

extern BSA_Int16
BSAGetObjectF
(      long              bsaHandle,
       ObjectDescriptor *objectDescriptorPtr,
       StreamHandle     *streamPtr
);

extern BSA_Int16
BSAInit
(      long             *bsaHandleP,
       SecurityToken    *tokenPtr,
       ObjectOwner      *objectOwnerPtr,
       char            **environmentPtr
);

extern BSA_Int16
BSAMarkObjectInactive
(      long              bsaHandle,
       ObjectName       *objectNamePtr
);

extern void
BSAQueryApiVersion
(      ApiVersion       *apiVersionPtr
);

extern BSA_Int16
BSAQueryObject
(      long              bsaHandle,
       QueryDescriptor  *queryDescriptorPtr,
       ObjectDescriptor *objectDescriptorPtr
);

extern BSA_Int16
BSASendData
(      long              bsaHandle,
       DataBlock        *dataBlockPtr
);

extern BSA_Int16
BSASetEnvironment
(      long              bsaHandle,
       char            **environmentPtr
);

extern BSA_Int16
BSATerminate
(      long              bsaHandle
);

extern BSA_Int16
BSAResolveLifecycleGroup(
    long              BSAHandle,
    ObjectDescriptor *BSAobjDescP
);

#ifdef __cplusplus
}
#endif

typedef struct
{
  ApiSessInfo      dsmSessInfo;
  BSAObjectOwner   bsaObjectOwner; /* node value on BSAInit */
  dsUint16_t       sessFlags;      /* misc flags            */
  dsUint8_t        oper;        /* send or recv operation */
  CopyType         copyType;    /* Backup or Archive type */
  char             *nextQryP;    /* ptr to respArchive or respBackup */
} xGlobal;

/*  flag masks for sessFlags    */
/*  to set on use   sessFlags = (sessFlags | FL_IN_BSA_TXN) */
/*  to set off use  sessFlags = (sessFlags ^ FL_IN_BSA_TXN) */
/*  to test on use  if (sessFlags & FL_IN_BSA_TXN) */
#define  FL_IN_BSA_TXN     0x0001  /* within a BSA type txn            */
#define  FL_IN_DSM_TXN     0x0002  /* within a actual ADSM txn         */
#define  FL_IN_BSA_QRY     0x0004  /* within a query txn               */
#define  FL_PSWD_EXPIRE    0x0008  /* pswd has expired                 */
#define  FL_RC_WILL_ABORT  0x0010  /* recvd 157 on SendObj or SendData */
#define  FL_END_DATA_DONE  0x0020  /* Get error already did EndData    */

#define OPER_NONE            0    /* values for oper field  */
#define OPER_SEND_START      1
#define OPER_SEND_ISSUED     2
#define OPER_RECV_START      3
#define OPER_RECV_ISSUED     4

/*  structure def for objInfo  - max len = 255 */
typedef struct
{
  ResourceType     resourceType;                       /*  31 bytes */
  ObjectSize       size;                               /*   8 bytes */
  char             partDesc[ADSM_MAX_DESC];            /* 100 bytes */
  char             partObjInfo[ADSM_MAX_OBJINFO];      /* 100 bytes */
} XAPIObjInfo;

/* ******* G l o b a l s  ********  */

/* xGlobal xopenGbl; */

extern BSA_Int16 xlateRC(
    long      BSAHandle,
    BSA_Int16 dsmRC,
    BSA_Int16 *bsaRCP);

extern BSA_Int16 xparsePath(
    long     BSAHandle,
    char          *pathname,
    char          *hl,
    char          *ll);

extern xGlobal        xopenGbl;
extern char           traceStr[];
extern char           traceStr1[];
extern char           traceStr2[];

#define dsMalloc(a)   malloc(a)
#define dsFree(a)     free(a)

extern void StrUpper(char *s);
/* Min() and Max() macros */
#ifndef min
#define min(a,b)  (((a) < (b)) ? (a) : (b))
#endif

#ifndef max
#define max(a,b)  (((a) > (b)) ? (a) : (b))
#endif

/* Combined file name w/ line number */
#define TrFL __FILE__, __LINE__

/*=== MACRO for exit tracing ===*/
#define XOPENRETURN(BSAHandle,functionName,bsaRC,fileName,lineNumber) {sprintf(traceStr2,"%s EXIT: rc = >%d<.",functionName, bsaRC); ourTrace(BSAHandle,fileName,lineNumber,traceStr2); return(bsaRC);}

/* Define license error log file name */
#define TSMLicLog "tsmlic.log"

#define custMin_retcode  96
#define custMax_retcode  104

/*=======================================================
 Function to places a trace message in the API tracefile,
 the message includes the xopen file name and line number.
 ======================================================*/
void ourTrace(long           BSAHandle,
              char          *fileName,
              int            lineNumber,
              char          *traceStr2);

/*================================================
 Function to log events with call to dsmLogEventEx
 ===============================================*/
void ourLogEvent_Ex(dsUint32_t handle, dsmLogType type, char* msg,
                 char *appMsg, dsmLogSeverity severity);

/*=================================================================
 Function to retrieve a message by routing to dsmRCMsg or stdXOpenMsgMap.
 ===============================================================*/
char* ourRCMsg(dsInt16_t dsmRC, char *msg);

/*====================================================
 Function to build fully qualified license file name.
 void build_lfname(char *lfname
 ========================================================*/
extern void build_lfname(char *lfname);

/*=== Function to deliver standard XOpen API message above API range. */
void stdXOpenMsgMap(dsInt16_t, char*);


#endif /* xbsa */
