2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
12 #include <afsconfig.h>
13 #include <afs/param.h>
20 #if defined(AFS_AIX_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_LINUX26_ENV)
24 #include <afs/tcdata.h>
25 #include "butc_xbsa.h"
27 #include "butc_internal.h"
29 /* Global Definations */
30 #define APPLTYPE "afs-butc"
31 #define TDP_LIBNAME "libApiDS.a"
32 #define FIRST_HANDLE 1
34 #define XAPI_FSINFO "FS for XOpen API"
35 #define DIR_DELIMITER '/'
36 #define STR_DIR_DELIMITER "/"
39 char traceStr
[DSM_MAX_RC_MSG_LENGTH
+1];
40 char traceStr2
[(DSM_MAX_RC_MSG_LENGTH
+1) - 30];
41 char ourMsg
[DSM_MAX_RC_MSG_LENGTH
+ 1];
42 static int dsm_init
= 0 ;
44 /* >>> TSM function pointers. */
45 dsInt16_t (* AFSdsmBeginQuery
)( dsUint32_t dsmHandle
, dsmQueryType queryType
, dsmQueryBuff
*queryBuffer
);
46 dsInt16_t (* AFSdsmGetNextQObj
)( dsUint32_t dsmHandle
, DataBlk
*dataBlkPtr
) ;
47 dsInt16_t (* AFSdsmEndQuery
)( dsUint32_t dsmHandle
);
48 dsInt16_t (* AFSdsmRCMsg
)( dsUint32_t dsmHandle
, dsInt16_t dsmRC
, char *msg
);
49 dsInt16_t (* AFSdsmLogEventEx
)( dsUint32_t dsmHandle
, dsmLogExIn_t
*dsmLogExInP
, dsmLogExOut_t
*dsmLogExOutP
);
50 dsInt16_t (* AFSdsmTrace
)( dsUint32_t dsmHandle
, char * string
);
51 dsInt16_t (* AFSdsmTerminate
)( dsUint32_t dsmHandle
);
52 dsInt16_t (* AFSdsmSendData
)( dsUint32_t dsmHandle
, DataBlk
*dataBlkPtri
);
53 dsInt16_t (* AFSdsmBeginTxn
)( dsUint32_t dsmHandle
);
54 dsInt16_t (* AFSdsmDeleteObj
)( dsUint32_t dsmHandle
, dsmDelType delType
, dsmDelInfo delInfo
);
55 dsInt16_t (* AFSdsmEndTxn
)( dsUint32_t dsmHandle
, dsUint8_t vote
, dsUint16_t
*reason
);
56 void (* AFSdsmQueryApiVersion
)( dsmApiVersion
*apiVersionP
);
57 dsInt16_t (* AFSdsmInit
)( dsUint32_t
*dsmHandle
, dsmApiVersion
*dsmApiVersionP
, char *clientNodeNameP
, char *clientOwnerNameP
, char *clientPasswordP
, char *applicationType
, char *configfile
, char *options
);
58 dsInt16_t (* AFSdsmQuerySessInfo
)( dsUint32_t dsmHandle
, ApiSessInfo
*SessInfoP
);
59 dsInt16_t (* AFSdsmBeginGetData
)(dsUint32_t dsmHandle
, dsBool_t mountWait
, dsmGetType getType
, dsmGetList
*dsmGetObjListP
);
60 dsInt16_t (* AFSdsmGetObj
)( dsUint32_t dsmHandle
, ObjID
*objIdP
, DataBlk
*dataBlkPtr
);
61 dsInt16_t (* AFSdsmEndGetObj
)( dsUint32_t dsmHandle
);
62 dsInt16_t (* AFSdsmEndGetData
)( dsUint32_t dsmHandle
);
63 dsInt16_t (* AFSdsmGetData
)( dsUint32_t dsmHandle
, DataBlk
*dataBlkPtr
);
64 dsInt16_t (* AFSdsmEndSendObj
)( dsUint32_t dsmHandle
);
65 dsInt16_t (* AFSdsmRegisterFS
)( dsUint32_t dsmHandle
, regFSData
*regFilespaceP
);
66 dsInt16_t (* AFSdsmBindMC
)( dsUint32_t dsmHandle
, dsmObjName
*objNameP
, dsmSendType sendType
, mcBindKey
*mcBindKeyP
);
67 dsInt16_t (* AFSdsmSendObj
)( dsUint32_t dsmHandle
, dsmSendType sendType
, void *sendBuff
, dsmObjName
*objNameP
, ObjAttr
*objAttrPtr
, DataBlk
*dataBlkPtr
);
68 dsInt16_t (* AFSdsmChangePW
)( dsUint32_t dsmHandle
, char *oldPW
, char *newPW
);
70 dsInt16_t (* AFSdsmCleanUp
)( dsBool_t mtFlag
);
71 dsInt16_t (* AFSdsmDeleteAccess
)( dsUint32_t dsmHandle
, dsUint32_t ruleNum
);
72 dsInt16_t (* AFSdsmDeleteFS
)( dsUint32_t dsmHandle
, char *fsName
, dsUint8_t repository
);
73 dsInt16_t (* AFSdsmEndGetDataEx
)( dsmEndGetDataExIn_t
*dsmEndGetDataExInP
, dsmEndGetDataExOut_t
*dsmEndGetDataExOutP
);
74 dsInt16_t (* AFSdsmEndSendObjEx
)( dsmEndSendObjExIn_t
*dsmEndSendObjExInP
, dsmEndSendObjExOut_t
*dsmEndSendObjExOutP
);
75 dsInt16_t (* AFSdsmEndTxnEx
)( dsmEndTxnExIn_t
*dsmEndTxnExInP
, dsmEndTxnExOut_t
*dsmEndTxnExOutP
);
76 dsInt16_t (* AFSdsmGroupHandler
)( dsmGroupHandlerIn_t
*dsmGroupHandlerInP
, dsmGroupHandlerOut_t
*dsmGroupHandlerOutP
);
77 dsInt16_t (* AFSdsmInitEx
)( dsUint32_t
*dsmHandleP
, dsmInitExIn_t
*dsmInitExInP
, dsmInitExOut_t
*dsmInitExOutP
);
78 dsInt16_t (* AFSdsmLogEvent
)( dsUint32_t dsmHandle
, logInfo
*lopInfoP
);
79 dsInt16_t (* AFSdsmQueryAccess
)( dsUint32_t dsmHandle
, qryRespAccessData
**accessListP
, dsUint16_t
*numberOfRules
);
80 void (* AFSdsmQueryApiVersionEx
)( dsmApiVersionEx
*apiVersionP
);
81 dsInt16_t (* AFSdsmQueryCliOptions
)( optStruct
*optstructP
);
82 dsInt16_t (* AFSdsmQuerySessOptions
)( dsUint32_t dsmHandle
, optStruct
*optstructP
);
83 dsInt16_t (* AFSdsmRenameObj
)( dsmRenameIn_t
*dsmRenameInP
, dsmRenameOut_t
*dsmRenameOutP
);
84 dsInt16_t (* AFSdsmSetAccess
)( dsUint32_t dsmHandle
, dsmAccessType accessType
, dsmObjName
*objNameP
, char *node
, char *owner
);
85 dsInt16_t (* AFSdsmSetUp
)( dsBool_t mtFlag
, envSetUp
*envSetUpPi
);
86 dsInt16_t (* AFSdsmUpdateFS
)( dsUint32_t dsmHandle
, char *fs
, dsmFSUpd
*fsUpdP
, dsUint32_t fsUpdAct
);
87 dsInt16_t (* AFSdsmUpdateObj
)( dsUint32_t dsmHandle
, dsmSendType sendType
, void *sendBuff
, dsmObjName
*objNameP
, ObjAttr
*objAttrPtr
, dsUint32_t objUpdAct
);
89 /* <<< TSM function pointers. */
91 typedef struct s_delList
{
92 struct s_delList
*next
;
96 static dsInt16_t
buildList(
103 qryArchiveData queryBuffer
; /* for query Archive*/
104 qryRespArchiveData qaDataArea
;
105 DataBlk qDataBlkArea
;
106 char descrStar
[] = "*";
107 delList
*lnew
= NULL
, *ll
= NULL
;
109 queryBuffer
.stVersion
= qryArchiveDataVersion
;
110 queryBuffer
.objName
= objNameP
;
111 queryBuffer
.owner
= xopenGbl
.dsmSessInfo
.owner
;
112 queryBuffer
.insDateLowerBound
.year
= DATE_MINUS_INFINITE
;
113 queryBuffer
.insDateUpperBound
.year
= DATE_PLUS_INFINITE
;
114 queryBuffer
.expDateLowerBound
.year
= DATE_MINUS_INFINITE
;
115 queryBuffer
.expDateUpperBound
.year
= DATE_PLUS_INFINITE
;
116 queryBuffer
.descr
= descrStar
;
118 if ((rc
=AFSdsmBeginQuery(dsmHandle
, qtArchive
,
119 (void *)&queryBuffer
)) != DSM_RC_OK
)
121 XOPENRETURN(dsmHandle
,"buildList(AFSdsmBeginQuery)",rc
,__FILE__
,__LINE__
);
123 qaDataArea
.stVersion
= qryRespArchiveDataVersion
;
124 qDataBlkArea
.stVersion
= DataBlkVersion
;
125 qDataBlkArea
.bufferPtr
= (char *)&qaDataArea
;
126 qDataBlkArea
.bufferLen
= sizeof(qryRespArchiveData
);
127 while ((rc
= AFSdsmGetNextQObj(dsmHandle
, &qDataBlkArea
)) == DSM_RC_MORE_DATA
)
129 if (!(lnew
= (delList
*)dsMalloc(sizeof(delList
))))
130 XOPENRETURN(dsmHandle
,"buildList(AFSdsmGetNextQObj)",
131 DSM_RC_NO_MEMORY
,__FILE__
,__LINE__
);
146 lnew
->objId
.hi
= qaDataArea
.objId
.hi
;
147 lnew
->objId
.lo
= qaDataArea
.objId
.lo
;
150 if (rc
!= DSM_RC_FINISHED
)
152 AFSdsmEndQuery(dsmHandle
);
153 XOPENRETURN(dsmHandle
,"buildList(AFSdsmGetNextQObj)",
154 rc
,__FILE__
,__LINE__
);
157 if ((rc
= AFSdsmEndQuery(dsmHandle
)) != DSM_RC_OK
)
159 sprintf(traceStr2
, "buildList: AFSdsmEndQuery rc = %d", rc
);
160 ourTrace(dsmHandle
,TrFL
,traceStr2
);
162 XOPENRETURN(dsmHandle
,"buildList",rc
,__FILE__
,__LINE__
);
165 static dsInt16_t
freeList(
174 *llHeadPP
= ll
->next
;
180 XOPENRETURN(0,"freeList",0,__FILE__
,__LINE__
);
183 void ourTrace(long BSAHandle
,
189 sprintf(traceStr
,"%s (%d) ",fileName
, lineNumber
);
191 if (traceStr2
!= NULL
&& *traceStr2
!= '\0')
192 strcat(traceStr
, traceStr2
);
194 AFSdsmTrace(BSAHandle
, traceStr
);
198 void ourLogEvent_Ex(dsUint32_t dsmHandle
, dsmLogType type
, char *message
,
199 char *appMsg
, dsmLogSeverity severity
)
201 dsmLogExIn_t dsmLogIn
;
202 dsmLogExOut_t dsmLogOut
;
203 memset(&dsmLogOut
, '\0', sizeof(dsmLogExOut_t
));
207 dsmLogIn
.stVersion
= dsmLogExInVersion
;
208 dsmLogIn
.severity
= severity
;
209 dsmLogIn
.logType
= type
;
211 strcpy(dsmLogIn
.appMsgID
, appMsg
);
212 dsmLogIn
.message
= message
;
213 AFSdsmLogEventEx(dsmHandle
, &dsmLogIn
, &dsmLogOut
);
217 char* ourRCMsg(dsInt16_t ourRC
, char *msgPrefix
)
219 char appStr
[BSA_MAX_DESC
];
223 memset(&ourMsg
, 0x00, DSM_MAX_RC_MSG_LENGTH
+ 1);
224 if(msgPrefix
!= NULL
)
226 /*================================================================
227 call stdXOpenMsgMap if return code values are within the TSM
228 return code range (96 - 104). Reformat the message prefix
230 ================================================================*/
231 if ((ourRC
>= custMin_retcode
) && (ourRC
<= custMax_retcode
))
233 stdXOpenMsgMap(ourRC
, ourMsg
);
234 /* set standard XOpen message prefix range: 660 - 668 */
235 ourRC
= ((ourRC
* 10) / 16) + (ourRC
% 16) + 600;
236 sprintf(msgPrefix
, "ANSO%d", ourRC
);
239 /*===============================================================
240 call dsmRCMsg if return code values other then the above ranges.
241 Get message prefix from the return message of dsmRCMsg.
242 ===============================================================*/
244 AFSdsmRCMsg(NOHANDLE
, ourRC
, ourMsg
);
245 /*=========================================================
246 search for the first ' ' and copy from beginning of string
247 until before the two charecter before ' '.
248 e.g. To get the code value from the messages of
249 "ANS1038S Invalid option specified", we only want to
250 get strings "ANS1038".
251 ========================================================*/
252 chP
= (char *) strchr(ourMsg
, ' ');
253 bytesToCp
= strlen(ourMsg
) - (strlen(chP
) + 1);
254 strncpy(appStr
, ourMsg
, bytesToCp
);
255 sprintf(msgPrefix
, "%s", appStr
);
261 void StrUpper(char *s
)
265 if (isalpha((int)(unsigned char)*s
))
266 *s
= (char)toupper((int)(unsigned char)*s
);
272 BSA_Int16
xparsePath(
278 /*=== code taken from dscparse.c ParseDestOperand function ===*/
285 strcpy(hl
, pathname
); /* use hl as working area */
286 if ((opLen
= strlen(hl
)) > 0)
288 /*=== Find the ll portion of the name ===*/
292 llstart
= strrchr(hl
,DIR_DELIMITER
);
299 for (x
= opLen
-1; x
>0 && hl
[x
]!=DIR_DELIMITER
; x
--);
302 /*=== If there is no leading delimiter then add one ===*/
303 if (hl
[x
] != DIR_DELIMITER
)
304 strcpy(ll
, STR_DIR_DELIMITER
);
306 strncat(ll
, hl
+x
, opLen
-x
);
308 hl
[x
] = '\0'; /* Shorten hl by length of ll */
322 *bsaRCP
=BSA_RC_OK
; break;
324 case DSM_RC_ABORT_ACTIVE_NOT_FOUND
:
325 *bsaRCP
=BSA_RC_ABORT_ACTIVE_NOT_FOUND
; break;
327 case DSM_RC_ABORT_SYSTEM_ERROR
:
328 *bsaRCP
=BSA_RC_ABORT_SYSTEM_ERROR
; break;
330 case DSM_RC_ABORT_BAD_VERIFIER
:
331 case DSM_RC_AUTH_FAILURE
:
332 case DSM_RC_REJECT_ID_UNKNOWN
:
333 case DSM_RC_REJECT_DUPLICATE_ID
:
334 *bsaRCP
=BSA_RC_AUTHENTICATION_FAILURE
; break;
336 case DSM_RC_BAD_CALL_SEQUENCE
:
337 *bsaRCP
=BSA_RC_BAD_CALL_SEQUENCE
; break;
339 case DSM_RC_INVALID_DS_HANDLE
:
340 *bsaRCP
=BSA_RC_BAD_HANDLE
; break;
342 case DSM_RC_BUFF_TOO_SMALL
:
343 *bsaRCP
=BSA_RC_BUFFER_TOO_SMALL
; break;
345 case DSM_RC_DESC_TOOLONG
:
346 *bsaRCP
=BSA_RC_DESC_TOO_LONG
; break;
348 case DSM_RC_FILESPACE_TOOLONG
:
349 *bsaRCP
=BSA_RC_OBJECTSPACE_TOO_LONG
; break;
351 /* some other condition here ? */
352 case DSM_RC_PASSWD_TOOLONG
:
353 *bsaRCP
=BSA_RC_INVALID_TOKEN
; break;
355 case DSM_RC_INVALID_VOTE
:
356 *bsaRCP
=BSA_RC_INVALID_VOTE
; break;
358 case DSM_RC_INVALID_OPT
:
359 *bsaRCP
=BSA_RC_INVALID_KEYWORD
; break;
361 /* ? what conditions cause this - object already exists ?
363 *bsaRCP=BSA_RC_MATCH_EXISTS; break;
366 case DSM_RC_MORE_DATA
:
367 *bsaRCP
=BSA_RC_MORE_DATA
; break;
369 /* not supported - for QueryAccessRule
371 *bsaRCP=BSA_RC_MORE_RULES; break;
374 case DSM_RC_NEWPW_REQD
:
375 *bsaRCP
=BSA_RC_NEWTOKEN_REQD
; break;
377 case DSM_RC_ABORT_NO_MATCH
:
378 case DSM_RC_FILE_SPACE_NOT_FOUND
:
379 /*=== rc for query ===*/
380 *bsaRCP
=BSA_RC_NO_MATCH
; break;
381 /*=== if this return code comes on Delete, use OBJECT_NOT_FOUND
382 - see xopndel.c ===*/
384 case DSM_RC_FINISHED
:
385 *bsaRCP
=BSA_RC_NO_MORE_DATA
; break;
387 case DSM_RC_ABORT_NO_LOG_SPACE
:
388 case DSM_RC_ABORT_NO_DB_SPACE
:
389 case DSM_RC_ABORT_NO_MEMORY
:
390 case DSM_RC_ABORT_NO_REPOSIT_SPACE
:
391 case DSM_RC_REJECT_NO_RESOURCES
:
392 case DSM_RC_REJECT_NO_MEMORY
:
393 case DSM_RC_REJECT_NO_DB_SPACE
:
394 case DSM_RC_REJECT_NO_LOG_SPACE
:
395 *bsaRCP
=BSA_RC_NO_RESOURCES
; break;
397 case DSM_RC_NULL_DATABLKPTR
:
398 *bsaRCP
=BSA_RC_NULL_DATABLKPTR
; break;
400 case DSM_RC_NULL_OBJNAME
:
401 *bsaRCP
=BSA_RC_NULL_OBJNAME
; break;
403 case DSM_RC_NULL_BUFPTR
:
404 *bsaRCP
=BSA_RC_NULL_POINTER
; break;
406 /* not supported - for DeleteAccessRule
408 *bsaRCP=BSA_RC_NULL_RULEID; break;
411 case DSM_RC_HL_TOOLONG
:
412 case DSM_RC_LL_TOOLONG
:
413 *bsaRCP
=BSA_RC_OBJECT_NAME_TOO_LONG
; break;
415 /* not supported - for DeletePolicyDomain
417 *bsaRCP=BSA_RC_OBJECT_NOT_EMPTY; break;
420 /* same as NO_MATCH for DeleteObject
422 *bsaRCP=BSA_RC_OBJECT_NOT_FOUND; break;
425 case DSM_RC_OBJINFO_TOOLONG
:
426 *bsaRCP
=BSA_RC_OBJINFO_TOO_LONG
; break;
428 /* same as BSA_RC_OBJECT_NAME_TOO_LONG
430 *bsaRCP=BSA_RC_OBJNAME_TOO_LONG; break;
433 /* not supported - for CreatePolicySet, etc
435 *bsaRCP=BSA_RC_OPERATION_NOT_AUTHORIZED; break;
438 case DSM_RC_OLDPW_REQD
:
439 *bsaRCP
=BSA_RC_OLDTOKEN_REQD
; break;
441 case DSM_RC_REJECT_VERIFIER_EXPIRED
:
442 *bsaRCP
=BSA_RC_TOKEN_EXPIRED
; break;
444 case DSM_RC_WILL_ABORT
:
445 case DSM_RC_CHECK_REASON_CODE
:
446 *bsaRCP
=BSA_RC_TXN_ABORTED
; break;
448 case DSM_RC_UNMATCHED_QUOTE
:
449 *bsaRCP
=BSA_RC_UNMATCHED_QUOTE
; break;
451 /* not supported - for DeleteUser
453 *bsaRCP=BSA_RC_USER_OWNS_OBJECT; break;
458 /*=========================================================
459 No suitable match, so print message in log, if we still
460 have a handle. AFSdsmInit calls ApiCleanUp in certain error
461 situations. We lose the handle in those cases so check
463 =========================================================*/
465 char rcMsg
[DSM_MAX_RC_MSG_LENGTH
] ;
466 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
467 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
468 dsUint32_t dsmHandle
;
470 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
471 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
475 dsmHandle
= BSAHandle
;
476 AFSdsmRCMsg(dsmHandle
,dsmRC
,rcMsg
) ;
479 "xlateRC - %s", rcMsg
);
480 ourTrace(BSAHandle
,TrFL
, traceStr2
);
481 strcpy(ourMessage
, ourRCMsg(dsmRC
, errPrefix
));
482 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
485 *bsaRCP
= ADSM_RC_ERROR
;
489 /*=== trace only if we have a valid handle ===*/
490 if (dsmRC
&& BSAHandle
)
492 sprintf(traceStr2
, "xlateRC: TSM rc >%d< , BSA rc >%d<", dsmRC
, *bsaRCP
);
493 ourTrace(BSAHandle
, TrFL
, traceStr2
);
498 void stdXOpenMsgMap(dsInt16_t rc
, char *msg
)
503 strcpy(msg
, "TSM rc error, see ADSM error log.");
504 case ADSM_RC_INVALID_NODE
:
505 strcpy(msg
, "BSAObjectOwner doesn't match value session Init.");
508 case ADSM_RC_INVALID_COPYTYPE
:
509 strcpy(msg
, "Invalid copy type.");
512 case ADSM_RC_INVALID_OBJTYPE
:
513 strcpy(msg
, "Invalid object type.");
516 case ADSM_RC_INVALID_STATUS
:
517 strcpy(msg
, "Invalid Object Status.");
520 case ADSM_RC_INVALID_ST_VER
:
521 strcpy(msg
, "Invalid object descriptor structure version.");
524 case ADSM_RC_OWNER_TOO_LONG
:
525 strcpy(msg
, "Object owner name too long.");
528 case ADSM_RC_PSWD_TOO_LONG
:
529 strcpy(msg
, "Client password too long.");
532 case ADSM_RC_PSWD_GEN
:
533 strcpy(msg
, "Password input required .");
537 strcpy(msg
, "No message available");
542 BSA_Int16
fillArchiveResp(
544 ObjectDescriptor
*BSAobjDescP
,
545 qryRespArchiveData
*respArchiveP
548 XAPIObjInfo
*xapiObjInfoP
;
550 strcpy(BSAobjDescP
->Owner
.appObjectOwner
, respArchiveP
->owner
);
551 strcpy(BSAobjDescP
->objName
.objectSpaceName
, respArchiveP
->objName
.fs
);
553 /*=== concatenate hl and ll for pathName ===*/
554 strcpy(BSAobjDescP
->objName
.pathName
, respArchiveP
->objName
.hl
);
555 strcat(BSAobjDescP
->objName
.pathName
, respArchiveP
->objName
.ll
);
557 BSAobjDescP
->createTime
.tm_year
= respArchiveP
->insDate
.year
-1900;
558 BSAobjDescP
->createTime
.tm_mon
= respArchiveP
->insDate
.month
-1;
559 BSAobjDescP
->createTime
.tm_mday
= respArchiveP
->insDate
.day
;
560 BSAobjDescP
->createTime
.tm_hour
= respArchiveP
->insDate
.hour
;
561 BSAobjDescP
->createTime
.tm_min
= respArchiveP
->insDate
.minute
;
562 BSAobjDescP
->createTime
.tm_sec
= respArchiveP
->insDate
.second
;
564 BSAobjDescP
->copyId
.left
= respArchiveP
->objId
.hi
;
565 BSAobjDescP
->copyId
.right
= respArchiveP
->objId
.lo
;
567 BSAobjDescP
->restoreOrder
.left
= respArchiveP
->restoreOrderExt
.lo_hi
;
568 BSAobjDescP
->restoreOrder
.right
= respArchiveP
->restoreOrderExt
.lo_lo
;
570 strcpy(BSAobjDescP
->lGName
, respArchiveP
->mcName
) ;
572 xapiObjInfoP
= (XAPIObjInfo
*)&(respArchiveP
->objInfo
);
573 BSAobjDescP
->size
.left
= xapiObjInfoP
->size
.left
;
574 BSAobjDescP
->size
.right
= xapiObjInfoP
->size
.right
;
575 strcpy(BSAobjDescP
->resourceType
, xapiObjInfoP
->resourceType
);
576 strcpy(BSAobjDescP
->desc
, xapiObjInfoP
->partDesc
);
577 strcpy(BSAobjDescP
->objectInfo
, xapiObjInfoP
->partObjInfo
);
579 if (respArchiveP
->objName
.objType
== DSM_OBJ_DIRECTORY
)
580 BSAobjDescP
->objectType
= BSAObjectType_DIRECTORY
;
582 BSAobjDescP
->objectType
= BSAObjectType_FILE
;
583 /*=== future - type DATABASE ?? ===*/
585 BSAobjDescP
->status
= BSAObjectStatus_ACTIVE
;
586 XOPENRETURN(BSAHandle
, "fillArchiveResp",
587 BSA_RC_SUCCESS
,__FILE__
,__LINE__
);
590 BSA_Int16
fillBackupResp(
592 ObjectDescriptor
*BSAobjDescP
,
593 qryRespBackupData
*respBackupP
596 XAPIObjInfo
*xapiObjInfoP
;
598 strcpy(BSAobjDescP
->Owner
.appObjectOwner
, respBackupP
->owner
);
599 strcpy(BSAobjDescP
->objName
.objectSpaceName
, respBackupP
->objName
.fs
);
601 /*=== concatenate hl and ll for pathName ===*/
602 strcpy(BSAobjDescP
->objName
.pathName
, respBackupP
->objName
.hl
);
603 strcat(BSAobjDescP
->objName
.pathName
, respBackupP
->objName
.ll
);
605 BSAobjDescP
->createTime
.tm_year
= respBackupP
->insDate
.year
-1900;
606 BSAobjDescP
->createTime
.tm_mon
= respBackupP
->insDate
.month
-1;
607 BSAobjDescP
->createTime
.tm_mday
= respBackupP
->insDate
.day
;
608 BSAobjDescP
->createTime
.tm_hour
= respBackupP
->insDate
.hour
;
609 BSAobjDescP
->createTime
.tm_min
= respBackupP
->insDate
.minute
;
610 BSAobjDescP
->createTime
.tm_sec
= respBackupP
->insDate
.second
;
612 BSAobjDescP
->copyId
.left
= respBackupP
->objId
.hi
;
613 BSAobjDescP
->copyId
.right
= respBackupP
->objId
.lo
;
615 BSAobjDescP
->restoreOrder
.left
= respBackupP
->restoreOrderExt
.lo_hi
;
616 BSAobjDescP
->restoreOrder
.right
= respBackupP
->restoreOrderExt
.lo_lo
;
618 strcpy(BSAobjDescP
->lGName
, respBackupP
->mcName
) ;
620 xapiObjInfoP
= (XAPIObjInfo
*)&(respBackupP
->objInfo
);
621 BSAobjDescP
->size
.left
= xapiObjInfoP
->size
.left
;
622 BSAobjDescP
->size
.right
= xapiObjInfoP
->size
.right
;
623 strcpy(BSAobjDescP
->resourceType
, xapiObjInfoP
->resourceType
);
624 strcpy(BSAobjDescP
->desc
, xapiObjInfoP
->partDesc
);
625 strcpy(BSAobjDescP
->objectInfo
, xapiObjInfoP
->partObjInfo
);
627 if (respBackupP
->objName
.objType
== DSM_OBJ_DIRECTORY
)
628 BSAobjDescP
->objectType
= BSAObjectType_DIRECTORY
;
630 BSAobjDescP
->objectType
= BSAObjectType_FILE
;
631 /*=== future - type DATABASE ?? ===*/
633 if (respBackupP
->objState
== DSM_ACTIVE
)
634 BSAobjDescP
->status
= BSAObjectStatus_ACTIVE
;
636 BSAobjDescP
->status
= BSAObjectStatus_INACTIVE
;
637 /*=== ?? check for any other ===*/
639 XOPENRETURN(BSAHandle
, "fillRBackupResp",
640 BSA_RC_SUCCESS
,__FILE__
,__LINE__
);
644 afs_int32
dsm_MountLibrary(void)
646 void * dynlib
= NULL
;
649 printf("dsm_MountLibrary : inside function. \n");
651 #if defined(AFS_AIX_ENV)
652 dynlib
= dlopen("/usr/lib/libApiDS.a(dsmapish.o)", RTLD_NOW
| RTLD_LOCAL
| RTLD_MEMBER
);
653 #elif defined (AFS_AMD64_LINUX26_ENV)
654 dynlib
= dlopen("/usr/lib64/libApiTSM64.so", RTLD_NOW
| RTLD_LOCAL
);
655 #elif defined(AFS_SUN5_ENV) || defined(AFS_LINUX26_ENV)
656 dynlib
= dlopen("/usr/lib/libApiDS.so", RTLD_NOW
| RTLD_LOCAL
);
661 if (dynlib
== NULL
) {
662 ELog(0,"dsm_MountLibrary: The dlopen call to load the libApiDS shared library failed\n");
663 return(BUTX_NOLIBRARY
);
667 printf("dsm_MountLibrary : SUCCESS to Open the libApiDS shared library. \n");
669 #if defined(AFS_AIX_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_LINUX26_ENV)
670 AFSdsmBeginQuery
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsmQueryType queryType
, dsmQueryBuff
*queryBuffer
)) dlsym((void *)dynlib
, "dsmBeginQuery");
671 AFSdsmGetNextQObj
= (dsInt16_t (*)( dsUint32_t dsmHandle
, DataBlk
*dataBlkPtr
))dlsym((void *)dynlib
, "dsmGetNextQObj") ;
672 AFSdsmEndQuery
= (dsInt16_t (*)( dsUint32_t dsmHandle
))dlsym((void *)dynlib
, "dsmEndQuery");
673 AFSdsmRCMsg
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsInt16_t dsmRC
, char *msg
))dlsym((void *)dynlib
, "dsmRCMsg");
674 AFSdsmLogEventEx
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsmLogExIn_t
*dsmLogExInP
, dsmLogExOut_t
*dsmLogExOutP
))dlsym((void *)dynlib
, "dsmLogEventEx");
675 AFSdsmTrace
= (dsInt16_t (*)( dsUint32_t dsmHandle
, char * string
))dlsym((void *)dynlib
, "dsmTrace");
676 AFSdsmTerminate
= (dsInt16_t (*)( dsUint32_t dsmHandle
))dlsym((void *)dynlib
, "dsmTerminate");
677 AFSdsmSendData
= (dsInt16_t (*)( dsUint32_t dsmHandle
, DataBlk
*dataBlkPtri
))dlsym((void *)dynlib
, "dsmSendData");
678 AFSdsmBeginTxn
= (dsInt16_t (*)( dsUint32_t dsmHandle
))dlsym((void *)dynlib
, "dsmBeginTxn");
679 AFSdsmDeleteObj
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsmDelType delType
, dsmDelInfo delInfo
))dlsym((void *)dynlib
, "dsmDeleteObj");
680 AFSdsmEndTxn
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsUint8_t vote
, dsUint16_t
*reason
))dlsym((void *)dynlib
, "dsmEndTxn");
681 AFSdsmQueryApiVersion
= (void (*)( dsmApiVersion
*apiVersionP
))dlsym((void *)dynlib
, "dsmQueryApiVersion");
682 AFSdsmInit
= (dsInt16_t (*)( dsUint32_t
*dsmHandle
, dsmApiVersion
*dsmApiVersionP
, char *clientNodeNameP
, char *clientOwnerNameP
, char *clientPasswordP
, char *applicationType
, char *configfile
, char *options
))dlsym((void *)dynlib
, "dsmInit");
683 AFSdsmQuerySessInfo
= (dsInt16_t (*)( dsUint32_t dsmHandle
, ApiSessInfo
*SessInfoP
))dlsym((void *)dynlib
, "dsmQuerySessInfo");
684 AFSdsmBeginGetData
= (dsInt16_t (*)(dsUint32_t dsmHandle
, dsBool_t mountWait
, dsmGetType getType
, dsmGetList
*dsmGetObjListP
))dlsym((void *)dynlib
, "dsmBeginGetData");
685 AFSdsmGetObj
= (dsInt16_t (*)( dsUint32_t dsmHandle
, ObjID
*objIdP
, DataBlk
*dataBlkPtr
))dlsym((void *)dynlib
, "dsmGetObj");
686 AFSdsmEndGetObj
= (dsInt16_t (*)( dsUint32_t dsmHandle
))dlsym((void *)dynlib
, "dsmEndGetObj");
687 AFSdsmEndGetData
= (dsInt16_t (*)( dsUint32_t dsmHandle
))dlsym((void *)dynlib
, "dsmEndGetData");
688 AFSdsmGetData
= (dsInt16_t (*)( dsUint32_t dsmHandle
, DataBlk
*dataBlkPtr
))dlsym((void *)dynlib
, "dsmGetData");
689 AFSdsmEndSendObj
= (dsInt16_t (*)( dsUint32_t dsmHandle
))dlsym((void *)dynlib
, "dsmEndSendObj");
690 AFSdsmRegisterFS
= (dsInt16_t (*)( dsUint32_t dsmHandle
, regFSData
*regFilespaceP
))dlsym((void *)dynlib
, "dsmRegisterFS");
691 AFSdsmBindMC
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsmObjName
*objNameP
, dsmSendType sendType
, mcBindKey
*mcBindKeyP
))dlsym((void *)dynlib
, "dsmBindMC");
692 AFSdsmSendObj
= (dsInt16_t (*)( dsUint32_t dsmHandle
, dsmSendType sendType
, void *sendBuff
, dsmObjName
*objNameP
, ObjAttr
*objAttrPtr
, DataBlk
*dataBlkPtr
))dlsym((void *)dynlib
, "dsmSendObj");
693 AFSdsmChangePW
= (dsInt16_t (*)( dsUint32_t dsmHandle
, char *oldPW
, char *newPW
))dlsym((void *)dynlib
, "dsmChangePW");
696 if ( !AFSdsmBeginQuery
|| !AFSdsmGetNextQObj
|| !AFSdsmEndQuery
||
697 !AFSdsmRCMsg
|| !AFSdsmLogEventEx
|| !AFSdsmTrace
||
698 !AFSdsmTerminate
|| !AFSdsmEndGetObj
|| !AFSdsmSendData
||
699 !AFSdsmBeginTxn
|| !AFSdsmDeleteObj
|| !AFSdsmEndGetData
||
700 !AFSdsmEndTxn
|| !AFSdsmQueryApiVersion
|| !AFSdsmInit
||
701 !AFSdsmGetData
|| !AFSdsmQuerySessInfo
|| !AFSdsmBeginGetData
||
702 !AFSdsmGetObj
|| !AFSdsmEndSendObj
|| !AFSdsmRegisterFS
||
703 !AFSdsmBindMC
|| !AFSdsmSendObj
|| !AFSdsmChangePW
)
705 ELog(0,"dsm_MountLibrary: The dlopen call to load the TSM shared library failed\n");
706 return(BUTX_NOLIBRARY
);
709 printf("dsm_MountLibrary : All TSM function pointers initialized. \n");
715 printf("dsm_MountLibrary : leaving function. \n");
721 BSA_Int16
BSAInit( long *BSAHandleP
,
722 SecurityToken
*clientPasswordP
,
723 ObjectOwner
*objectOwnerP
,
727 dsInt16_t saverc
= 0;
729 dsUint32_t dsmHandle
; /* use diff field when talking to base
730 code in case either format changes */
731 dsmApiVersion xapiHdrVer
; /* Xopen API build version */
732 dsmApiVersion apiLibVer
; /* Xopen API Libary version */
734 dsUint32_t xapiVersion
, apiVersion
;
735 envSetUp dsmEnvSetUp
;
737 /*==================================================================
738 Today the BSA constants have the same values as the DSM constants.
739 If this changes, use strncpy.
740 =================================================================*/
742 char rcmsg
[DSM_MAX_RC_MSG_LENGTH
+ 1];
743 char dsmNode
[DSM_MAX_NODE_LENGTH
];
744 char dsmOwner
[DSM_MAX_OWNER_LENGTH
];
745 char dsmPswd
[DSM_MAX_VERIFIER_LENGTH
];
749 char options
[DSM_MAX_RC_MSG_LENGTH
];
750 char *optionP
= NULL
;
751 char TDPLibName
[BSA_MAX_DESC
];
752 char TDPILibName
[BSA_MAX_DESC
];
754 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
755 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
756 char rcMsg
[DSM_MAX_RC_MSG_LENGTH
+ 1];
762 printf("BSAInit : inside function. \n");
764 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
765 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
766 memset(rcMsg
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
771 printf("TSM library not mounted. \n");
773 if (dsm_MountLibrary())
775 printf("TSM Library initialisation failed. \n");
779 printf("TSM Library initialisation SUCCESS. \n");
783 /*==================================================================
784 Trace won't work before AFSdsmInit, moved to after call to AFSdsmInit
785 The XOpen library is built by statically linking with the API and
786 client common modules. So, the version checking is unnecessary.
787 We'll fill in the value anyway for consistency.
788 ==================================================================*/
789 memset(&xapiHdrVer
,0x00,sizeof(dsmApiVersion
));
790 memset(&apiLibVer
,0x00,sizeof(dsmApiVersion
));
791 memset(&dsmEnvSetUp
,0x00,sizeof(envSetUp
));
793 AFSdsmQueryApiVersion(&apiLibVer
);
795 xapiHdrVer
.version
= DSM_API_VERSION
; /* Set the applications */
796 xapiHdrVer
.release
= DSM_API_RELEASE
; /* compile time version. */
797 xapiHdrVer
.level
= DSM_API_LEVEL
; /* version */
799 xapiVersion
= (1000 * DSM_API_VERSION
) + (100 * DSM_API_RELEASE
)
802 apiVersion
= (1000 * apiLibVer
.version
) + (100 * apiLibVer
.release
)
805 /* check for compatibility problems */
806 if (apiVersion
< xapiVersion
)
807 return ADSM_RC_ERROR
;
809 /*==== Init global area ===*/
811 memset(&xopenGbl
,0x00, sizeof(xGlobal
)); /* Zero out block. */
813 memset(dsmNode
,0x00,DSM_MAX_NODE_LENGTH
);
814 memset(dsmOwner
,0x00,DSM_MAX_OWNER_LENGTH
);
815 memset(dsmPswd
,0x00,DSM_MAX_VERIFIER_LENGTH
);
816 memset(options
,0x00,DSM_MAX_RC_MSG_LENGTH
);
817 memset(TDPLibName
,0x00,BSA_MAX_DESC
);
818 memset(TDPILibName
,0x00,BSA_MAX_DESC
);
820 memset(rcmsg
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
823 /*=== Validate the inputs ===*/
827 if (strlen(objectOwnerP
->bsaObjectOwner
) > BSA_MAX_BSAOBJECT_OWNER
)
829 bsaRC
= ADSM_RC_OWNER_TOO_LONG
;
833 if (strlen(objectOwnerP
->appObjectOwner
) > BSA_MAX_APPOBJECT_OWNER
)
835 bsaRC
= ADSM_RC_OWNER_TOO_LONG
;
839 if (objectOwnerP
->bsaObjectOwner
[0] == '\0') /* empty string */
843 strcpy(dsmNode
, objectOwnerP
->bsaObjectOwner
);
847 if (objectOwnerP
->appObjectOwner
[0] == '\0') /* empty string */
851 strcpy(dsmOwner
, objectOwnerP
->appObjectOwner
);
852 dsmOwnerP
= dsmOwner
;
861 if (clientPasswordP
!= NULL
)
863 if (strlen((const char *)clientPasswordP
) > BSA_MAX_TOKEN_SIZE
)
865 bsaRC
= ADSM_RC_PSWD_TOO_LONG
;
869 strcpy(dsmPswd
, (const char *)clientPasswordP
);
875 while ((envP
[i
] != NULL
) && (envP
[i
] != '\0'))
877 strcat(options
, "-");
878 strcat(options
, envP
[i
]);
879 if ((envP
[i
+1] != NULL
) && (envP
[i
+1] != '\0'))
880 strcat(options
, " ");
884 if (options
[0] == '\0') /* empty string */
889 rc
= AFSdsmInit(&dsmHandle
, /* On return contains session handle. */
890 &xapiHdrVer
, /* Version of the API we are using. */
891 dsmNodeP
, /* node name */
892 dsmOwnerP
, /* owner name */
893 dsmPswdP
, /* password */
894 APPLTYPE
, /* Name of our node type. */
895 NULL
, /* no API config file name */
896 optionP
); /* option string */
901 /*=== now that AFSdsmInit issued, we can trace ===*/
903 "BSAInit: original bsaOwner=%s, appOwner=%s, token=%s, Appl Type=%s, options=%s.",
904 dsmNode
, dsmOwner
, dsmPswd
, APPLTYPE
, options
);
905 ourTrace(dsmHandle
, TrFL
, traceStr2
);
907 strcpy(TDPLibName
, TDP_LIBNAME
);
909 "BSAInit: Using TSM Native API library : %s", TDPLibName
);
910 ourTrace(dsmHandle
, TrFL
, traceStr2
);
915 /*=================================================================
916 If the password expired, continue initialization so the session
919 Save the 'password expired' rc away, so we can return it to the
922 The application will be responsible for issuing a BSAChangeToken()
923 to update the password.
924 =================================================================*/
925 if (rc
== DSM_RC_REJECT_VERIFIER_EXPIRED
)
927 /*=== don't return yet - init global so session can continue ===*/
933 if ((rc
== DSM_RC_NO_OWNER_REQD
) ||
934 (rc
== DSM_RC_NO_NODE_REQD
)) /* pswd=generate */
936 AFSdsmTerminate(dsmHandle
);
937 bsaRC
= ADSM_RC_PSWD_GEN
;
942 /*==================================================================
943 If we ran into any problems so far, rc will be non-zero or 'true'.
945 This is not true for password expired, since we reset rc to zero
946 in that case. We'll have to check for that later so we return
947 the 'password expired' indication to the caller.
948 ==================================================================*/
952 AFSdsmRCMsg(dsmHandle
, rc
, rcmsg
);
953 sprintf(traceStr2
, "BSAInit(AFSdsmInit): Messages - %s ", rcmsg
);
954 ourTrace(dsmHandle
, TrFL
, traceStr2
);
955 strcpy(ourMessage
, ourRCMsg(rc
, errPrefix
));
956 ourLogEvent_Ex(dsmHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
957 xlateRC(*BSAHandleP
, rc
, &bsaRC
); /* BSAHandle still 0, but not used */
958 AFSdsmTerminate(dsmHandle
); /* clean up memory blocks */
964 char msg
[256]; /* format string and watch for NULLs */
966 strcpy(msg
, "BSAInit for node=");
971 strcat(msg
, dsmNodeP
);
973 strcat(msg
, "<empty>");
976 strcat(msg
, "<NULL>");
978 strcat(msg
, ", owner=");
983 strcat(msg
, dsmOwnerP
);
985 strcat(msg
, "<empty>");
988 strcat(msg
, "<NULL>");
992 strcpy(traceStr
, msg
);
995 *BSAHandleP
= (long)dsmHandle
;
998 /*=================================================================
999 For password expired processing the application is responsible for
1000 issuing BSAChangeToken() to update the password, when they see the
1001 'expired password' return code.
1003 The BSAChangeToken() command will issue the AFSdsmQuerySessInfo()
1004 call, so don't issue it here.
1005 =================================================================*/
1007 if (!saverc
) /* don't call this if we got pswd expire */
1009 /*=== now query session info to populate the global structure ===*/
1011 xopenGbl
.dsmSessInfo
.stVersion
= ApiSessInfoVersion
;
1012 rc
= AFSdsmQuerySessInfo(dsmHandle
, /* Session handle */
1013 &xopenGbl
.dsmSessInfo
); /* Output struct */
1017 sprintf(traceStr2
, "BSAInit(AFSdsmQuerySessInfo): error rc = %d", rc
);
1018 ourTrace(dsmHandle
, TrFL
, traceStr2
);
1019 AFSdsmTerminate(dsmHandle
);
1024 sprintf(traceStr2
, "BSAInit: Actual node=%s, actual DSM owner=%s, servername=%s.",
1025 xopenGbl
.dsmSessInfo
.id
, xopenGbl
.dsmSessInfo
.owner
,
1026 xopenGbl
.dsmSessInfo
.adsmServerName
);
1027 ourTrace(dsmHandle
, TrFL
, traceStr2
);
1032 /*============================================================
1033 Indicate in the session flags that we encountered a password
1034 expiration condition. The application will know that this
1035 happened via the return code.
1036 ===========================================================*/
1038 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_PSWD_EXPIRE
);
1041 /*=== Save bsaObjectOwner (node name) value passed on Init ===*/
1044 strcpy(xopenGbl
.bsaObjectOwner
, dsmNodeP
);
1046 /*================================================================
1047 Check to see if we saved away the 'expired password' return code.
1048 if so, return it to the caller.
1049 ================================================================*/
1054 xlateRC(*BSAHandleP
, rc
, &bsaRC
);
1056 printf("BSAInit : Leaving Function. \n");
1061 BSA_Int16
BSATerminate(
1066 BSA_Int16 bsaRC
= 0;
1067 dsUint32_t dsmHandle
;
1072 printf("TSM library not mounted. \n");
1074 if (dsm_MountLibrary())
1076 printf("TSM Library initialisation failed. \n");
1080 printf("TSM Library initialisation SUCCESS. \n");
1084 dsmHandle
= BSAHandle
;
1085 sprintf(traceStr2
, "BSATerminate ENTRY: BSAHandle is %ld.",
1087 ourTrace(dsmHandle
, TrFL
, traceStr2
);
1089 rc
= AFSdsmTerminate(dsmHandle
);
1091 xlateRC(dsmHandle
, rc
, &bsaRC
);
1097 BSA_Int16
BSAChangeToken(
1099 SecurityToken
*oldTokenP
,
1100 SecurityToken
*newTokenP
1104 BSA_Int16 bsaRC
= 0;
1105 dsUint32_t dsmHandle
;
1110 printf("TSM library not mounted. \n");
1112 if (dsm_MountLibrary())
1114 printf("TSM Library initialisation failed. \n");
1118 printf("TSM Library initialisation SUCCESS. \n");
1122 dsmHandle
= BSAHandle
;
1124 sprintf(traceStr2
, "BSAChangeToken ENTRY: BSAHandle:%ld old:>%s< new:>%s<",
1125 BSAHandle
,*oldTokenP
,*newTokenP
);
1126 ourTrace(dsmHandle
, TrFL
, traceStr2
);
1128 rc
= AFSdsmChangePW(dsmHandle
, (char *)oldTokenP
, (char *)newTokenP
);
1132 xlateRC(BSAHandle
, rc
, &bsaRC
);
1133 XOPENRETURN(BSAHandle
,"BSAChangeToken(AFSdsmChangePW)",
1134 bsaRC
,__FILE__
,__LINE__
);
1137 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_PSWD_EXPIRE
); /* set off */
1139 /*=== now query session info to populate the global structure ===*/
1141 xopenGbl
.dsmSessInfo
.stVersion
= ApiSessInfoVersion
;
1142 rc
= AFSdsmQuerySessInfo(dsmHandle
, /* Our session handle */
1143 &xopenGbl
.dsmSessInfo
); /* Output structure. */
1146 /*=== appl should call Terminate ===*/
1147 sprintf(traceStr2
, "BSAChangeToken(AFSdsmQuerySessInfo): error rc = %d", rc
);
1148 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1150 xlateRC(BSAHandle
, rc
, &bsaRC
);
1151 XOPENRETURN(BSAHandle
,"BSAChangeToken",
1152 bsaRC
,__FILE__
,__LINE__
);
1155 BSA_Int16
BSASetEnvironment(
1163 printf("TSM library not mounted. \n");
1165 if (dsm_MountLibrary())
1167 printf("TSM Library initialisation failed. \n");
1171 printf("TSM Library initialisation SUCCESS. \n");
1175 sprintf(traceStr2
, "BSASetEnvironment ENTRY: BSAHandle:%ld envP:>%p< ",
1177 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1178 XOPENRETURN(BSAHandle
,"BSASetEnvironment",
1179 BSA_RC_BAD_CALL_SEQUENCE
,__FILE__
,__LINE__
);
1182 BSA_Int16
BSAGetEnvironment(
1184 ObjectOwner
*objOwnerP
,
1189 BSA_Int16 bsaRC
= 0;
1190 dsUint32_t dsmHandle
;
1191 char envString
[ADSM_ENV_STRS
][BSA_MAX_DESC
];
1192 char maxObjStr
[6]; /* conversion field. value range is 16-256 */
1193 dsUint32_t maxObjNum
;
1199 printf("TSM library not mounted. \n");
1201 if (dsm_MountLibrary())
1203 printf("TSM Library initialisation failed. \n");
1207 printf("TSM Library initialisation SUCCESS. \n");
1211 for (i
=0; i
<ADSM_ENV_STRS
; i
++)
1213 memset(envString
[i
], 0x00, BSA_MAX_DESC
);
1215 sprintf(traceStr2
, "BSAGetEnvironment ENTRY: BSAHandle:%ld ObjOwner:'%s' appOwner:'%s' envP:>%p<.",
1217 objOwnerP
->bsaObjectOwner
,
1218 objOwnerP
->appObjectOwner
,
1220 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1222 dsmHandle
= BSAHandle
;
1224 /*===============================================================
1225 check if BSAInit has been done for now we have only one possible
1226 handle value - change in future
1227 ==============================================================*/
1228 if ((dsmHandle
!= FIRST_HANDLE
) ||
1229 (xopenGbl
.dsmSessInfo
.stVersion
!= ApiSessInfoVersion
))
1230 XOPENRETURN(BSAHandle
,"BSAGetEnvironment",
1231 BSA_RC_BAD_CALL_SEQUENCE
, __FILE__
,__LINE__
);
1235 strcpy(objOwnerP
->bsaObjectOwner
, xopenGbl
.dsmSessInfo
.id
);
1236 strcpy(objOwnerP
->appObjectOwner
, xopenGbl
.dsmSessInfo
.owner
);
1239 XOPENRETURN(BSAHandle
,"BSAGetEnvironment",
1240 BSA_RC_NULL_POINTER
, __FILE__
,__LINE__
);
1242 rc
= AFSdsmQuerySessInfo(dsmHandle
, /* Session Handle */
1243 &xopenGbl
.dsmSessInfo
); /* Output struct */
1247 sprintf(traceStr2
, "BSAGetEnvironment(AFSdsmQuerySessInfo): error rc = %d", rc
);
1248 ourTrace(dsmHandle
, TrFL
, traceStr2
);
1249 AFSdsmTerminate(dsmHandle
);
1250 /* *BSAHandleP = 0; */
1254 sprintf(traceStr2
, "BSAGetEnvironment: Actual node=%s, actual DSM owner=%s, ServerName=%s.",
1255 xopenGbl
.dsmSessInfo
.id
, xopenGbl
.dsmSessInfo
.owner
, xopenGbl
.dsmSessInfo
.adsmServerName
);
1256 ourTrace(dsmHandle
, TrFL
, traceStr2
);
1259 strcpy(envString
[0],"TSMSRVR=");
1260 strcat(envString
[0],xopenGbl
.dsmSessInfo
.serverHost
);
1262 strcpy(envString
[1],"TSMMAXOBJ=");
1263 maxObjNum
= xopenGbl
.dsmSessInfo
.maxObjPerTxn
; /* convert to 32 bit */
1264 sprintf(maxObjStr
,"%u", maxObjNum
);
1265 strcat(envString
[1], maxObjStr
);
1267 strcpy(envString
[2], "TSMSRVRSTANZA=");
1268 strcat(envString
[2], xopenGbl
.dsmSessInfo
.adsmServerName
);
1270 sprintf(traceStr2
, "BSAGetEnvironment Value : TSM Server '%s', TSM Max Object '%s',TSM Server STANZA '%s'",
1271 envString
[0], envString
[1], envString
[2]);
1272 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1274 for (i
=0; i
< ADSM_ENV_STRS
; i
++) {
1275 if ( *envP
== NULL
) { /* watch for NULL pointers */
1276 /* Allocating memory for *envP.*/
1277 *envP
= malloc(sizeof(char) * BSA_MAX_DESC
+1);
1279 /* copy the content of envString[i] to *envP. */
1280 strcpy(*envP
,envString
[i
]);
1285 xlateRC(BSAHandle
, rc
, &bsaRC
);
1286 XOPENRETURN(BSAHandle
,"BSAGetEnvironment",
1287 bsaRC
,__FILE__
,__LINE__
)
1290 BSA_Int16
BSABeginTxn(
1297 printf("TSM library not mounted. \n");
1299 if (dsm_MountLibrary())
1301 printf("TSM Library initialisation failed. \n");
1305 printf("TSM Library initialisation SUCCESS. \n");
1309 sprintf(traceStr2
, "BSABeginTxn ENTRY: BSAHandle:%ld", BSAHandle
);
1310 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1311 /*========================================================
1312 don't actually issue BeginTxn yet, because we will do our
1313 own for Get and Query
1314 ========================================================*/
1316 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_IN_BSA_TXN
); /* set on */
1317 XOPENRETURN(BSAHandle
, "BSABeginTxn",
1318 BSA_RC_SUCCESS
,__FILE__
,__LINE__
);
1321 BSA_Int16
BSAEndTxn(
1327 BSA_Int16 bsaRC
= 0;
1328 dsUint32_t dsmHandle
;
1331 char rsMsg
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1332 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1333 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1338 printf("TSM library not mounted. \n");
1340 if (dsm_MountLibrary())
1342 printf("TSM Library initialisation failed. \n");
1346 printf("TSM Library initialisation SUCCESS. \n");
1350 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1351 memset(rsMsg
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1352 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1354 sprintf(traceStr2
, "BSAEndTxn ENTRY: BSAHandle:%ld Vote:>%d<", BSAHandle
, vote
);
1355 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1357 dsmHandle
= BSAHandle
;
1359 if (xopenGbl
.sessFlags
& FL_IN_DSM_TXN
)
1361 if (vote
== BSAVote_COMMIT
)
1362 dsmVote
= DSM_VOTE_COMMIT
;
1364 if (vote
== BSAVote_ABORT
)
1365 dsmVote
= DSM_VOTE_ABORT
;
1368 sprintf(traceStr2
, "BSAEndTxn: invalid vote (%d)", vote
);
1369 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1370 bsaRC
= BSA_RC_INVALID_VOTE
;
1371 XOPENRETURN(BSAHandle
, "BSAEndTxn",bsaRC
,__FILE__
,__LINE__
);
1375 sprintf(traceStr2
, "BSAEndTxn: issue AFSdsmEndTxn, vote=%s",
1376 dsmVote
== DSM_VOTE_COMMIT
? "COMMIT" : "ABORT");
1377 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1378 /*===========================================================
1379 check if this EndTxn call was proceeded by a Send call which
1380 returned WILL_ABORT. If so, make sure the vote is COMMIT
1381 so we will get the server's reason code.
1382 ===========================================================*/
1383 if (xopenGbl
.sessFlags
& FL_RC_WILL_ABORT
)
1385 dsmVote
= DSM_VOTE_COMMIT
;
1387 sprintf(traceStr2
, "BSAEndTxn: sproceeded by RC_WILL_ABORT, so use vote=COMMIT");
1388 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1389 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_RC_WILL_ABORT
); /* set off*/
1392 rc
= AFSdsmEndTxn(dsmHandle
, dsmVote
, &reason
);
1393 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_DSM_TXN
); /* set off */
1395 /*====================================================
1396 if the caller wanted to Abort, then return rc=OK, not
1397 our usual 2302 and reason 3
1398 =====================================================*/
1399 if ((dsmVote
== DSM_VOTE_ABORT
) &&
1400 (rc
== DSM_RC_CHECK_REASON_CODE
) &&
1401 (reason
== DSM_RC_ABORT_BY_CLIENT
))
1407 sprintf(traceStr2
, "BSAEndTxn(AFSdsmEndTxn) error rc = %d", rc
);
1408 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1410 AFSdsmRCMsg(BSAHandle
, reason
, rsMsg
);
1411 sprintf(traceStr2
, "BSAEndTxn: reason code = %d, Message='%s'", reason
, rsMsg
);
1412 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1414 strcpy(ourMessage
, ourRCMsg(reason
, errPrefix
));
1415 ourLogEvent_Ex(BSAHandle
,logBoth
, ourMessage
, errPrefix
, logSevError
);
1417 xlateRC(BSAHandle
, rc
, &bsaRC
);
1419 if (rc
== DSM_RC_CHECK_REASON_CODE
) /* return reason code instead */
1421 xlateRC(BSAHandle
, reason
, &bsaRC
);
1425 /*=== check if Query was terminated ===*/
1426 if (xopenGbl
.sessFlags
& FL_IN_BSA_QRY
)
1428 AFSdsmEndQuery(dsmHandle
);
1429 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_QRY
); /* set off */
1432 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_TXN
); /* set off */
1433 XOPENRETURN(BSAHandle
, "BSAEndTxn",
1434 bsaRC
,__FILE__
,__LINE__
);
1437 void BSAQueryApiVersion(
1438 ApiVersion
*BSAapiVerP
1442 /*===============================================================
1443 Don't actually call the base QueryApiVersion call.
1444 Use the defines from custom.h since this is what the application
1445 sees in the header file. The constants should be the same,
1446 but may get out of sync occasionally.
1447 ===============================================================*/
1448 BSAapiVerP
->version
= BSA_API_VERSION
;
1449 BSAapiVerP
->release
= BSA_API_RELEASE
;
1450 BSAapiVerP
->level
= BSA_API_LEVEL
;
1454 BSA_Int16
BSAQueryObject(
1456 QueryDescriptor
*BSAqryDescP
,
1457 ObjectDescriptor
*BSAobjDescP
1461 BSA_Int16 bsaRC
= 0;
1462 dsUint32_t dsmHandle
;
1464 dsUint8_t dsmObjType
;
1465 dsmQueryType query_type
;
1466 dsmQueryBuff
*query_buff
;
1468 qryArchiveData archiveData
;
1469 qryRespArchiveData respArchive
;
1470 qryBackupData backupData
;
1471 qryRespBackupData respBackup
;
1472 BSAObjectOwner upperNode
; /* upper cased node name */
1474 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1475 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1480 printf("TSM library not mounted. \n");
1482 if (dsm_MountLibrary())
1484 printf("TSM Library initialisation failed. \n");
1488 printf("TSM Library initialisation SUCCESS. \n");
1492 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1493 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1495 dsmHandle
= BSAHandle
;
1497 memset(&backupData
, 0x00, sizeof(qryBackupData
));
1499 sprintf(traceStr2
, "BSAQueryObject ENTRY: BSAHandle:%ld ObjOwner(qryDesc):'%s' appOwner(qryDesc):'%s' \n ObjName(qryDesc):'%.*s%.*s' \n copyType:%d ObjectType:%d status:%d ",
1501 BSAqryDescP
->owner
.bsaObjectOwner
,
1502 BSAqryDescP
->owner
.appObjectOwner
,
1503 100,BSAqryDescP
->objName
.objectSpaceName
,
1504 100,BSAqryDescP
->objName
.pathName
,
1505 BSAqryDescP
->copyType
,
1506 BSAqryDescP
->objectType
,
1507 BSAqryDescP
->status
);
1508 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1510 /*=====================================================
1511 init objDesc area to 0's before we start to erase any
1512 garbage that might be there.
1513 =====================================================*/
1514 memset(BSAobjDescP
, 0x00, sizeof(ObjectDescriptor
));
1516 /*=== init global look ahead pointer to NULL ===*/
1517 if (xopenGbl
.nextQryP
!= NULL
)
1519 dsFree(xopenGbl
.nextQryP
);
1520 xopenGbl
.nextQryP
= NULL
;
1523 /*=========================================================
1524 if the node name is different - we won't query it compare
1525 both the value passed on the BSAInit and the final value
1526 used for the session (which may be different for Generate).
1527 =========================================================*/
1528 strcpy(upperNode
, BSAqryDescP
->owner
.bsaObjectOwner
);
1529 StrUpper(upperNode
);
1530 if ((strcmp(upperNode
, xopenGbl
.dsmSessInfo
.id
)) &&
1531 (strcmp(BSAqryDescP
->owner
.bsaObjectOwner
, xopenGbl
.bsaObjectOwner
)))
1534 "BSAQueryObject: BSAObjectOwner(%s) doesn't match value for session(%s).", upperNode
, xopenGbl
.dsmSessInfo
.id
);
1535 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1536 bsaRC
= ADSM_RC_INVALID_NODE
;
1537 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
1538 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
1539 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1540 bsaRC
,__FILE__
,__LINE__
);
1543 /*=====================================================
1544 currently BSA_MAX_OSNAME = DSM_MAX_FSNAME_LENGTH
1545 if this changes, use strncpy
1546 ====================================================*/
1547 if (strlen(BSAqryDescP
->objName
.objectSpaceName
) > BSA_MAX_OSNAME
)
1549 sprintf(traceStr2
, "BSAQueryObject: objectSpaceName too long (%" AFS_SIZET_FMT
").",
1550 strlen(BSAqryDescP
->objName
.objectSpaceName
));
1551 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1552 bsaRC
= BSA_RC_OBJNAME_TOO_LONG
;
1553 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1554 bsaRC
,__FILE__
,__LINE__
);
1556 /*=================================================================
1557 the entire pathname gets copied into hl during parsing, so check
1558 for that max len as well. For now these are the same value.
1559 ================================================================*/
1560 if (strlen(BSAqryDescP
->objName
.pathName
) >
1561 min(DSM_MAX_HL_LENGTH
, BSA_MAX_PATHNAME
))
1563 sprintf(traceStr2
, "BSAQueryObject: pathName too long (%" AFS_SIZET_FMT
")",
1564 strlen(BSAqryDescP
->objName
.pathName
));
1565 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1566 bsaRC
= BSA_RC_OBJNAME_TOO_LONG
;
1567 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1568 bsaRC
,__FILE__
,__LINE__
);
1570 if ((BSAqryDescP
->objectType
== BSAObjectType_FILE
) ||
1571 (BSAqryDescP
->objectType
== BSAObjectType_DATABASE
))
1572 dsmObjType
= DSM_OBJ_FILE
;
1574 if (BSAqryDescP
->objectType
== BSAObjectType_DIRECTORY
)
1575 dsmObjType
= DSM_OBJ_DIRECTORY
;
1577 if (BSAqryDescP
->objectType
== BSAObjectType_ANY
)
1578 dsmObjType
= DSM_OBJ_ANY_TYPE
;
1582 "BSAQueryObject: invalid objectType (%d)", BSAqryDescP
->objectType
);
1583 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1584 bsaRC
= ADSM_RC_INVALID_OBJTYPE
;
1585 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
1586 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
1587 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1588 bsaRC
,__FILE__
,__LINE__
);
1591 if (!(xopenGbl
.sessFlags
& FL_IN_BSA_TXN
))
1593 sprintf(traceStr2
, "BSAQueryObject: issued without BSABeginTxn");
1594 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1595 bsaRC
= BSA_RC_BAD_CALL_SEQUENCE
;
1596 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1597 bsaRC
,__FILE__
,__LINE__
);
1600 /* store object name in ADSM structure */
1601 strcpy(objName
.fs
,BSAqryDescP
->objName
.objectSpaceName
) ;
1603 if (!strcmp(BSAqryDescP
->objName
.pathName
, "/*")) /* if they use a wildcard */
1604 { /* we need to use a wild card on both hl and ll since the path gets split */
1605 strcpy(objName
.hl
, "*"); /* don't include delimiter in case there is
1607 strcpy(objName
.ll
, "/*");
1610 xparsePath(BSAHandle
, BSAqryDescP
->objName
.pathName
, objName
.hl
, objName
.ll
);
1612 objName
.objType
= dsmObjType
;
1614 /*=== save copy type for GetNextQuery call later ===*/
1615 xopenGbl
.copyType
= BSAqryDescP
->copyType
;
1617 if (BSAqryDescP
->copyType
== BSACopyType_ARCHIVE
)
1619 if (strlen(BSAqryDescP
->desc
) > ADSM_MAX_DESC
)
1622 sprintf(traceStr2
, "BSAQueryObject: description longer than ADSM max (%" AFS_SIZET_FMT
"). ", strlen(BSAqryDescP
->desc
));
1623 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1624 bsaRC
= BSA_RC_DESC_TOO_LONG
;
1625 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1626 bsaRC
,__FILE__
,__LINE__
);
1629 archiveData
.stVersion
= qryArchiveDataVersion
;
1630 archiveData
.objName
= &objName
;
1631 archiveData
.owner
= (char *)&BSAqryDescP
->owner
.appObjectOwner
;
1633 /*=================================================================
1634 in the tm structure the month count starts with 0 and year is
1635 the value since 1900.
1636 Adjust the year value only if it isn't one of the boundary values
1637 =================================================================*/
1639 archiveData
.insDateLowerBound
.year
= BSAqryDescP
->createTimeLB
.tm_year
;
1640 if (archiveData
.insDateLowerBound
.year
!= ADSM_LOWEST_BOUND
)
1641 archiveData
.insDateLowerBound
.year
+= 1900;
1642 archiveData
.insDateLowerBound
.month
= BSAqryDescP
->createTimeLB
.tm_mon
+1;
1643 archiveData
.insDateLowerBound
.day
= BSAqryDescP
->createTimeLB
.tm_mday
;
1644 archiveData
.insDateLowerBound
.hour
= BSAqryDescP
->createTimeLB
.tm_hour
;
1645 archiveData
.insDateLowerBound
.minute
= BSAqryDescP
->createTimeLB
.tm_min
;
1646 archiveData
.insDateLowerBound
.second
= BSAqryDescP
->createTimeLB
.tm_sec
;
1648 archiveData
.insDateUpperBound
.year
= BSAqryDescP
->createTimeUB
.tm_year
;
1649 if (archiveData
.insDateUpperBound
.year
!= ADSM_HIGHEST_BOUND
)
1650 archiveData
.insDateUpperBound
.year
+= 1900;
1651 archiveData
.insDateUpperBound
.month
= BSAqryDescP
->createTimeUB
.tm_mon
+1;
1652 archiveData
.insDateUpperBound
.day
= BSAqryDescP
->createTimeUB
.tm_mday
;
1653 archiveData
.insDateUpperBound
.hour
= BSAqryDescP
->createTimeUB
.tm_hour
;
1654 archiveData
.insDateUpperBound
.minute
= BSAqryDescP
->createTimeUB
.tm_min
;
1655 archiveData
.insDateUpperBound
.second
= BSAqryDescP
->createTimeUB
.tm_sec
;
1657 archiveData
.expDateLowerBound
.year
= BSAqryDescP
->expireTimeLB
.tm_year
;
1658 if (archiveData
.expDateLowerBound
.year
!= ADSM_LOWEST_BOUND
)
1659 archiveData
.expDateLowerBound
.year
+= 1900;
1660 archiveData
.expDateLowerBound
.month
= BSAqryDescP
->expireTimeLB
.tm_mon
+1;
1661 archiveData
.expDateLowerBound
.day
= BSAqryDescP
->expireTimeLB
.tm_mday
;
1662 archiveData
.expDateLowerBound
.hour
= BSAqryDescP
->expireTimeLB
.tm_hour
;
1663 archiveData
.expDateLowerBound
.minute
= BSAqryDescP
->expireTimeLB
.tm_min
;
1664 archiveData
.expDateLowerBound
.second
= BSAqryDescP
->expireTimeLB
.tm_sec
;
1666 archiveData
.expDateUpperBound
.year
= BSAqryDescP
->expireTimeUB
.tm_year
;
1667 if (archiveData
.expDateUpperBound
.year
!= ADSM_HIGHEST_BOUND
)
1668 archiveData
.expDateUpperBound
.year
+= 1900;
1669 archiveData
.expDateUpperBound
.month
= BSAqryDescP
->expireTimeUB
.tm_mon
+1;
1670 archiveData
.expDateUpperBound
.day
= BSAqryDescP
->expireTimeUB
.tm_mday
;
1671 archiveData
.expDateUpperBound
.hour
= BSAqryDescP
->expireTimeUB
.tm_hour
;
1672 archiveData
.expDateUpperBound
.minute
= BSAqryDescP
->expireTimeUB
.tm_min
;
1673 archiveData
.expDateUpperBound
.second
= BSAqryDescP
->expireTimeUB
.tm_sec
;
1675 archiveData
.descr
= (char *)&BSAqryDescP
->desc
;
1676 query_type
= qtArchive
;
1677 query_buff
= (dsmQueryBuff
*)&archiveData
;
1679 qData
.stVersion
= DataBlkVersion
;
1680 qData
.bufferLen
= sizeof(qryRespArchiveData
);
1681 qData
.bufferPtr
= (char *)&respArchive
;
1682 respArchive
.stVersion
= qryRespArchiveDataVersion
;
1685 if (BSAqryDescP
->copyType
== BSACopyType_BACKUP
)
1687 if (BSAqryDescP
->status
== BSAObjectStatus_ACTIVE
)
1688 backupData
.objState
= DSM_ACTIVE
;
1690 if (BSAqryDescP
->status
== BSAObjectStatus_INACTIVE
)
1691 backupData
.objState
= DSM_INACTIVE
;
1693 if (BSAqryDescP
->status
== BSAObjectStatus_ANY
)
1694 backupData
.objState
= DSM_ANY_MATCH
;
1698 "BSAQueryObject: invalid status (%d)",
1699 BSAqryDescP
->status
);
1700 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1701 bsaRC
= ADSM_RC_INVALID_STATUS
;
1702 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
1703 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
1704 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1705 bsaRC
,__FILE__
,__LINE__
);
1708 backupData
.stVersion
= qryBackupDataVersion
;
1709 backupData
.objName
= &objName
;
1710 backupData
.owner
= (char *)&BSAqryDescP
->owner
.appObjectOwner
;
1712 query_type
= qtBackup
;
1713 query_buff
= (dsmQueryBuff
*)&backupData
;
1715 qData
.stVersion
= DataBlkVersion
;
1716 qData
.bufferLen
= sizeof(qryRespBackupData
);
1717 qData
.bufferPtr
= (char *)&respBackup
;
1718 respBackup
.stVersion
= qryRespBackupDataVersion
;;
1723 "BSAQueryObject: invalid copyType (%d)",
1724 BSAqryDescP
->copyType
);
1725 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1726 bsaRC
= ADSM_RC_INVALID_COPYTYPE
;
1727 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
1728 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
1729 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1730 bsaRC
,__FILE__
,__LINE__
);
1733 /*=== now set flag for query ===*/
1734 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_IN_BSA_QRY
); /* set on */
1736 if ((rc
= AFSdsmBeginQuery(dsmHandle
,query_type
,query_buff
)))
1739 sprintf(traceStr2
, "BSAQueryObject(AFSdsmBeginQuery) error rc = %d", rc
);
1740 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1741 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_QRY
); /* set off */
1742 xlateRC(BSAHandle
, rc
, &bsaRC
);
1743 XOPENRETURN(BSAHandle
, "BSAQueryObject(AFSdsmBeginQuery)",
1744 bsaRC
,__FILE__
,__LINE__
);
1747 rc
= AFSdsmGetNextQObj(dsmHandle
,&qData
);
1748 if (((rc
== DSM_RC_OK
) || (rc
== DSM_RC_MORE_DATA
)) && qData
.numBytes
)
1750 BSAobjDescP
->version
= ObjectDescriptorVersion
;
1751 strcpy(BSAobjDescP
->Owner
.bsaObjectOwner
, xopenGbl
.dsmSessInfo
.id
);
1752 BSAobjDescP
->copyType
= BSAqryDescP
->copyType
;
1753 strcpy(BSAobjDescP
->cGName
, "\0"); /* no copy group name returned */
1755 if (BSAqryDescP
->copyType
== BSACopyType_ARCHIVE
)
1757 fillArchiveResp(dsmHandle
, BSAobjDescP
, &respArchive
);
1761 fillBackupResp(dsmHandle
, BSAobjDescP
, &respBackup
);
1763 /*=== look ahead and see if there is more or if this is really done ===*/
1764 rc
= AFSdsmGetNextQObj(dsmHandle
,&qData
);
1765 if (( (rc
== DSM_RC_OK
) || (rc
== DSM_RC_MORE_DATA
)) && qData
.numBytes
)
1766 { /*=== save the response we just got for later call ===*/
1767 if (BSAqryDescP
->copyType
== BSACopyType_ARCHIVE
)
1769 if (!(xopenGbl
.nextQryP
= (char *)dsMalloc(sizeof(qryRespArchiveData
))))
1772 sprintf(traceStr2
, "BSAQueryObject: no memory for look ahead buffer");
1773 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1774 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_QRY
); /* set off */
1775 bsaRC
= BSA_RC_NO_RESOURCES
;
1776 XOPENRETURN(BSAHandle
, "BSAQueryObject(AFSdsmGetNextQObj)",
1777 bsaRC
,__FILE__
,__LINE__
);
1779 memcpy(xopenGbl
.nextQryP
, &respArchive
, sizeof(qryRespArchiveData
));
1783 if (!(xopenGbl
.nextQryP
= (char *)dsMalloc(sizeof(qryRespBackupData
))))
1786 sprintf(traceStr2
, "BSAQueryObject: no memory for look ahead buffer");
1787 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1788 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_QRY
); /* set off */
1789 bsaRC
= BSA_RC_NO_RESOURCES
;
1790 XOPENRETURN(BSAHandle
, "BSAQueryObject(AFSdsmGetNextQObj)",
1791 bsaRC
,__FILE__
,__LINE__
);
1794 memcpy(xopenGbl
.nextQryP
, &respBackup
, sizeof(qryRespBackupData
));
1800 sprintf(traceStr2
, "BSAQueryObject(AFSdsmGetNextQObj) rc = %d", rc
);
1801 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1802 AFSdsmEndQuery(dsmHandle
);
1803 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_QRY
); /* set off */
1807 else /* could be FINISHED or an error */
1810 sprintf(traceStr2
, "BSAQueryObject(AFSdsmGetNextQObj) rc = %d", rc
);
1811 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1812 AFSdsmEndQuery(dsmHandle
);
1813 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_BSA_QRY
); /* set off */
1816 if (rc
== DSM_RC_OK
)
1818 sprintf(traceStr2
, "BSAQueryObject(AFSdsmGetNextQObj) rc = %d, ObjOwner(objDesc):'%s' appOwner(objDesc):'%s' \n ObjName(objDesc):'%.*s%.*s' \n copyType:%d copyId:'%lu %lu' cGName:'%s'",
1820 BSAobjDescP
->Owner
.bsaObjectOwner
,
1821 BSAobjDescP
->Owner
.appObjectOwner
,
1822 100,BSAobjDescP
->objName
.objectSpaceName
,
1823 100,BSAobjDescP
->objName
.pathName
,
1824 BSAobjDescP
->copyType
,
1825 BSAobjDescP
->copyId
.left
,
1826 BSAobjDescP
->copyId
.right
,
1827 BSAobjDescP
->cGName
);
1828 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1831 xlateRC(BSAHandle
, rc
, &bsaRC
);
1832 XOPENRETURN(BSAHandle
, "BSAQueryObject",
1833 bsaRC
, __FILE__
,__LINE__
);
1836 BSA_Int16
BSAGetObject(
1838 ObjectDescriptor
*BSAobjDescP
,
1839 DataBlock
*BSAdataBlockP
1843 BSA_Int16 bsaRC
= 0;
1844 dsUint32_t dsmHandle
;
1847 dsmGetList dsmObjList
;
1848 char rcMsg
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1849 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1850 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
1855 printf("TSM library not mounted. \n");
1857 if (dsm_MountLibrary())
1859 printf("TSM Library initialisation failed. \n");
1863 printf("TSM Library initialisation SUCCESS. \n");
1867 dsmHandle
= BSAHandle
;
1869 memset(rcMsg
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1870 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1871 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
1873 sprintf(traceStr2
, "BSAGetObject ENTRY: BSAHandle:%ld version:%lu copyType:%d copyId:'%lu %lu' \n bufferLen:%d numBytes:%d ",
1875 BSAobjDescP
->version
,
1876 BSAobjDescP
->copyType
,
1877 BSAobjDescP
->copyId
.left
,
1878 BSAobjDescP
->copyId
.right
,
1879 BSAdataBlockP
->bufferLen
,
1880 BSAdataBlockP
->numBytes
);
1881 ourTrace(BSAHandle
, TrFL
, traceStr2
);
1883 xopenGbl
.oper
= OPER_RECV_START
; /* save state for EndData later */
1885 if (BSAobjDescP
->version
!= ObjectDescriptorVersion
)
1887 sprintf(traceStr2
,"Warning: BSAGetObject: objectDesc.version unexpected %lu.", BSAobjDescP
->version
);
1888 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1889 /*==================================================================
1890 don't treat this as an error now since it isn't defined in the spec
1891 bsaRC = ADSM_RC_INVALID_ST_VER;
1893 =================================================================*/
1896 if (!(xopenGbl
.sessFlags
& FL_IN_BSA_TXN
))
1898 sprintf(traceStr2
, "BSAGetObject: issued without BSABeginTxn");
1899 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1900 bsaRC
= BSA_RC_BAD_CALL_SEQUENCE
;
1901 XOPENRETURN(BSAHandle
, "BSAGetObject",
1902 bsaRC
,__FILE__
,__LINE__
);
1905 /*=== Get the data ===*/
1906 if (BSAobjDescP
->copyType
== BSACopyType_ARCHIVE
)
1907 getType
= gtArchive
;
1909 if (BSAobjDescP
->copyType
== BSACopyType_BACKUP
)
1914 "BSAGetObject: invalid copyType (%d)",
1915 BSAobjDescP
->copyType
);
1916 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1917 bsaRC
= ADSM_RC_INVALID_COPYTYPE
;
1918 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
1919 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
1920 XOPENRETURN(BSAHandle
, "BSAGetObject",
1921 bsaRC
,__FILE__
,__LINE__
);
1924 /*=== now update state since we'll issue a base API call ===*/
1925 xopenGbl
.oper
= OPER_RECV_ISSUED
; /* save state for EndData later */
1926 /*=== setup for a single object get ===*/
1928 dsmObjList
.stVersion
= dsmGetListVersion
;
1929 dsmObjList
.numObjId
= 1 ;
1930 dsmObjList
.objId
= (ObjID
*)dsMalloc(sizeof(ObjID
) * dsmObjList
.numObjId
) ;
1932 dsmObjList
.objId
[0].hi
= BSAobjDescP
->copyId
.left
;
1933 dsmObjList
.objId
[0].lo
= BSAobjDescP
->copyId
.right
;
1935 if ((rc
= AFSdsmBeginGetData(dsmHandle
,bTrue
, /* always say MountWait */
1937 &dsmObjList
)) != DSM_RC_OK
)
1939 sprintf(traceStr2
, "BSAGetObject: Call to AFSdsmBeginGetData error rc = %d", rc
);
1940 ourTrace(BSAHandle
,TrFL
, traceStr2
);
1941 xlateRC(BSAHandle
, rc
, &bsaRC
);
1942 XOPENRETURN(BSAHandle
, "BSAGetObject(AFSdsmBeginGetData)",
1943 bsaRC
,__FILE__
,__LINE__
);
1946 /*********************************************************************/
1947 getBlk
.stVersion
= DataBlkVersion
;
1948 getBlk
.bufferPtr
= BSAdataBlockP
->bufferPtr
;
1949 getBlk
.bufferLen
= BSAdataBlockP
->bufferLen
;
1950 getBlk
.numBytes
= 0;
1952 rc
= AFSdsmGetObj(dsmHandle
, &(dsmObjList
.objId
[0]), &getBlk
) ;
1954 if ((rc
== DSM_RC_FINISHED
) &&
1955 (getBlk
.numBytes
!= 0)) /* actually is data received */
1956 rc
= DSM_RC_MORE_DATA
; /* use different rc for consistency */
1957 /* with Query. No data returned */
1958 /* if rc = FINISHED. */
1959 if ((rc
== DSM_RC_FINISHED
) ||
1960 (rc
== DSM_RC_MORE_DATA
))
1962 /*=== data is already in the buffer ===*/
1963 BSAdataBlockP
->numBytes
= (BSA_UInt16
)getBlk
.numBytes
;
1967 /*=== appl may call BSAEndData to clean up trxn but don't count on it... ===*/
1968 AFSdsmEndGetObj(dsmHandle
);
1969 AFSdsmEndGetData(dsmHandle
);
1970 xopenGbl
.sessFlags
=
1971 (xopenGbl
.sessFlags
| FL_END_DATA_DONE
); /* turn flag on */
1974 xlateRC(BSAHandle
, rc
, &bsaRC
);
1975 XOPENRETURN(BSAHandle
, "BSAGetObject",
1976 bsaRC
,__FILE__
,__LINE__
);
1979 BSA_Int16
BSAGetData(
1981 DataBlock
*BSAdataBlockP
1985 BSA_Int16 bsaRC
= 0;
1986 dsUint32_t dsmHandle
;
1992 printf("TSM library not mounted. \n");
1994 if (dsm_MountLibrary())
1996 printf("TSM Library initialisation failed. \n");
2000 printf("TSM Library initialisation SUCCESS. \n");
2004 dsmHandle
= BSAHandle
;
2007 sprintf(traceStr2
, "BSAGetData ENTRY: BSAHandle:%ld, bufferLen:%d, numBytes:%d",
2009 BSAdataBlockP
->bufferLen
,
2010 BSAdataBlockP
->numBytes
);
2011 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2013 getBlk
.stVersion
= DataBlkVersion
;
2014 getBlk
.bufferPtr
= BSAdataBlockP
->bufferPtr
;
2015 getBlk
.bufferLen
= BSAdataBlockP
->bufferLen
;
2016 getBlk
.numBytes
= 0;
2018 rc
= AFSdsmGetData(dsmHandle
, &getBlk
) ;
2020 if ((rc
== DSM_RC_FINISHED
) &&
2021 (getBlk
.numBytes
!= 0)) /* actually is data received */
2022 rc
= DSM_RC_MORE_DATA
; /* use different rc for consistency */
2023 /* with Query. No data returned */
2024 /* if rc = FINISHED. */
2026 if ((rc
== DSM_RC_FINISHED
) ||
2027 (rc
== DSM_RC_MORE_DATA
))
2029 /*=== data is already in the buffer ===*/
2030 BSAdataBlockP
->numBytes
= (BSA_UInt16
)getBlk
.numBytes
;
2034 sprintf(traceStr2
, "BSAGetData: Call to AFSdsmGetData error rc = %d", rc
);
2035 ourTrace(BSAHandle
, TrFL
,traceStr2
);
2037 /*=== appl may call BSAEndData to clean up trxn but don't count on it... ===*/
2038 AFSdsmEndGetObj(dsmHandle
);
2039 AFSdsmEndGetData(dsmHandle
);
2040 xopenGbl
.sessFlags
=
2041 (xopenGbl
.sessFlags
| FL_END_DATA_DONE
); /* turn flag on */
2043 xlateRC(BSAHandle
, rc
, &bsaRC
);
2044 XOPENRETURN(BSAHandle
, "BSAGetData(AFSdsmGetData)",
2045 bsaRC
,__FILE__
,__LINE__
);
2048 BSA_Int16
BSASendData(
2050 DataBlock
*BSAdataBlockP
2054 BSA_Int16 bsaRC
= 0;
2055 dsUint32_t dsmHandle
;
2056 DataBlk dataBlkArea
;
2061 printf("TSM library not mounted. \n");
2063 if (dsm_MountLibrary())
2065 printf("TSM Library initialisation failed. \n");
2069 printf("TSM Library initialisation SUCCESS. \n");
2073 dsmHandle
= BSAHandle
;
2076 sprintf(traceStr2
, "BSASendData ENTRY: BSAHandle:%ld bufferLen: %d numBytes: %d ",
2078 BSAdataBlockP
->bufferLen
,
2079 BSAdataBlockP
->numBytes
);
2080 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2082 /*=== check for NULL dataBlock pointer ===*/
2083 if (BSAdataBlockP
== NULL
)
2084 XOPENRETURN(BSAHandle
, "BSASendData",
2085 BSA_RC_NULL_POINTER
,__FILE__
,__LINE__
);
2086 dataBlkArea
.stVersion
= DataBlkVersion
;
2087 dataBlkArea
.bufferPtr
= BSAdataBlockP
->bufferPtr
;
2088 dataBlkArea
.bufferLen
= BSAdataBlockP
->bufferLen
;
2090 rc
= AFSdsmSendData(dsmHandle
, &dataBlkArea
);
2095 sprintf(traceStr2
, "BSASendData(AFSdsmSendData) error rc = %d", rc
);
2096 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2098 if (rc
== DSM_RC_WILL_ABORT
) /* save flag */
2099 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_RC_WILL_ABORT
);
2101 BSAdataBlockP
->numBytes
= (BSA_UInt16
)dataBlkArea
.numBytes
;
2102 sprintf(traceStr2
, "BSASendData(AFSdsmSendData): BSAHandle:%ld bufferLen: %d numBytes sent: %d ",
2104 BSAdataBlockP
->bufferLen
,
2105 BSAdataBlockP
->numBytes
);
2106 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2108 xlateRC(BSAHandle
, rc
, &bsaRC
);
2109 XOPENRETURN(BSAHandle
, "BSASendData",
2110 BSA_RC_SUCCESS
,__FILE__
,__LINE__
);
2113 BSA_Int16
BSAEndData(
2118 BSA_Int16 bsaRC
= 0;
2119 dsUint32_t dsmHandle
;
2124 printf("TSM library not mounted. \n");
2126 if (dsm_MountLibrary())
2128 printf("TSM Library initialisation failed. \n");
2132 printf("TSM Library initialisation SUCCESS. \n");
2136 dsmHandle
= BSAHandle
;
2139 sprintf(traceStr2
, "BSAEndData ENTRY: BSAHandle:%ld", BSAHandle
);
2140 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2142 /*=======================================================
2143 check the state - don't issue base API call unless one
2144 was called previously, or else we get a sequence error.
2145 ======================================================*/
2147 if (xopenGbl
.oper
== OPER_SEND_ISSUED
)
2149 rc
= AFSdsmEndSendObj(dsmHandle
);
2153 sprintf(traceStr2
, "BSAEndData(AFSdsmEndSendObj) error rc = %d", rc
);
2154 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2155 xlateRC(BSAHandle
, rc
, &bsaRC
);
2159 if (xopenGbl
.oper
== OPER_RECV_ISSUED
)
2161 if (xopenGbl
.sessFlags
& FL_END_DATA_DONE
) /* EndData processing */
2162 xopenGbl
.sessFlags
= /* already done */
2163 (xopenGbl
.sessFlags
^ FL_END_DATA_DONE
); /* turn flag off */
2166 rc
= AFSdsmEndGetObj(dsmHandle
);
2169 sprintf(traceStr2
, "BSAEndData(AFSdsmEndGetObj) error rc = %d", rc
);
2170 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2172 /*==============================================================
2173 this may get 'Out of sequence error' if previous GetObject
2174 had rc=2 (no match). Don't return this to caller - too confusing
2175 ===============================================================*/
2176 if (rc
!= DSM_RC_BAD_CALL_SEQUENCE
)
2177 xlateRC(BSAHandle
, rc
, &bsaRC
);
2180 rc
= AFSdsmEndGetData(dsmHandle
);
2183 sprintf(traceStr2
, "BSAEndData(AFSdsmEndGetData) error rc = %d", rc
);
2184 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2185 xlateRC(BSAHandle
, rc
, &bsaRC
);
2189 else /* invalid state */
2190 if ((xopenGbl
.oper
!= OPER_RECV_START
) &&
2191 (xopenGbl
.oper
!= OPER_SEND_START
))
2193 sprintf(traceStr2
, "BSAEndData: BSAEndData but not Send or Recv");
2194 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2195 bsaRC
= BSA_RC_BAD_CALL_SEQUENCE
;
2198 xopenGbl
.oper
= OPER_NONE
;
2199 XOPENRETURN(BSAHandle
, "BSAEndData",bsaRC
,__FILE__
,__LINE__
);
2202 BSA_Int16
BSACreateObject(
2204 ObjectDescriptor
*BSAobjDescP
,
2205 DataBlock
*BSAdataBlockP
2209 BSA_Int16 bsaRC
= 0;
2210 dsUint32_t dsmHandle
;
2211 regFSData regFilespace
;
2212 dsmObjName objName
;
2213 ObjAttr objAttrArea
;
2214 sndArchiveData archData
;
2215 DataBlk dataBlkArea
;
2216 dsmSendType sendType
;
2217 dsUint8_t dsmObjType
;
2218 XAPIObjInfo xapiObjInfo
;
2219 mcBindKey mcBindKey
;
2220 BSAObjectOwner upperNode
; /* upper cased node name */
2221 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
2222 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
2227 printf("TSM library not mounted. \n");
2229 if (dsm_MountLibrary())
2231 printf("TSM Library initialisation failed. \n");
2235 printf("TSM Library initialisation SUCCESS. \n");
2239 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
2240 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
2242 dsmHandle
= BSAHandle
;
2244 if (BSAobjDescP
!= NULL
&& BSAdataBlockP
!= NULL
)
2246 sprintf(traceStr2
, "BSACreateObject ENTRY: BSAHandle:%ld ObjOwner:'%s' appOwner:'%s' \n ObjName:'%.*s%.*s' \n objType:%d size:'%lu %lu' resourceType:'%s' \n bufferLen:%d numBytes:%d ",
2249 BSAobjDescP
->Owner
.bsaObjectOwner
[0] != '\0' ? BSAobjDescP
->Owner
.bsaObjectOwner
: "",
2250 BSAobjDescP
->Owner
.appObjectOwner
[0] != '\0' ? BSAobjDescP
->Owner
.appObjectOwner
: "",
2251 100,BSAobjDescP
->objName
.objectSpaceName
[0] != '\0' ? BSAobjDescP
->objName
.objectSpaceName
2253 100,BSAobjDescP
->objName
.pathName
[0] != '\0' ? BSAobjDescP
->objName
.pathName
: "",
2254 BSAobjDescP
->objectType
,
2255 BSAobjDescP
->size
.left
,
2256 BSAobjDescP
->size
.right
,
2257 BSAobjDescP
->resourceType
[0] != '\0' ? BSAobjDescP
->resourceType
: "" ,
2258 BSAdataBlockP
->bufferLen
,
2259 BSAdataBlockP
->numBytes
);
2263 if (BSAobjDescP
== NULL
)
2265 bsaRC
= BSA_RC_NULL_POINTER
;
2266 XOPENRETURN(BSAHandle
, "BSACreateObject",
2267 bsaRC
,__FILE__
,__LINE__
);
2269 sprintf(traceStr2
, "BSACreateObject ENTRY: BSAHandle:%ld", BSAHandle
);
2272 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2274 xopenGbl
.oper
= OPER_SEND_START
; /* save state for EndData later */
2275 /*=================================================================
2276 if (BSAobjDescP->version != ObjectDescriptorVersion)
2277 BSA spec doesn't require this currently..
2278 =================================================================*/
2280 /*===============================================================
2281 if the node name is different - we won't create it compare both
2282 the value passed on the BSAInit and the final value used for the
2283 session (which may be different for Generate)
2284 ===============================================================*/
2285 strcpy(upperNode
, BSAobjDescP
->Owner
.bsaObjectOwner
);
2286 StrUpper(upperNode
);
2287 if ((strcmp(upperNode
, xopenGbl
.dsmSessInfo
.id
)) &&
2288 (strcmp(BSAobjDescP
->Owner
.bsaObjectOwner
, xopenGbl
.bsaObjectOwner
)))
2291 "BSACreateObject: BSAObjectOwner(%s) doesn't match value for session(%s).",
2292 upperNode
, xopenGbl
.dsmSessInfo
.id
);
2293 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2294 bsaRC
= ADSM_RC_INVALID_NODE
;
2295 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
2296 ourLogEvent_Ex(BSAHandle
,logLocal
, ourMessage
, errPrefix
, logSevError
);
2297 XOPENRETURN(BSAHandle
, "BSACreateObject",
2298 bsaRC
,__FILE__
,__LINE__
);
2301 /*=== check string lengths - if this too long, it won't fit in our objInfo ===*/
2302 if (strlen(BSAobjDescP
->desc
) > ADSM_MAX_DESC
)
2304 sprintf(traceStr2
,"BSACreateObject: description longer than TSM max (%" AFS_SIZET_FMT
"). ",
2305 strlen(BSAobjDescP
->desc
));
2306 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2307 bsaRC
= BSA_RC_DESC_TOO_LONG
;
2308 XOPENRETURN(BSAHandle
, "BSACreateObject",
2309 bsaRC
,__FILE__
,__LINE__
);
2311 if (strlen(BSAobjDescP
->objectInfo
) > ADSM_MAX_OBJINFO
)
2313 sprintf(traceStr2
,"BSACreateObject: objInfo longer than TSM max (%" AFS_SIZET_FMT
").",
2314 strlen(BSAobjDescP
->objectInfo
));
2315 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2316 bsaRC
= BSA_RC_OBJINFO_TOO_LONG
;
2317 XOPENRETURN(BSAHandle
, "BSACreateObject",
2318 bsaRC
,__FILE__
,__LINE__
);
2321 if (!(xopenGbl
.sessFlags
& FL_IN_BSA_TXN
))
2323 sprintf(traceStr2
, "BSACreateObject issued without BSABeginTxn");
2324 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2325 bsaRC
= BSA_RC_BAD_CALL_SEQUENCE
;
2326 XOPENRETURN(BSAHandle
, "BSACreateObject",
2327 bsaRC
,__FILE__
,__LINE__
);
2330 if (strlen(BSAobjDescP
->objName
.objectSpaceName
) > BSA_MAX_OSNAME
)
2332 sprintf(traceStr2
, "BSACreateObject: objectSpaceName too long (%" AFS_SIZET_FMT
")",
2333 strlen(BSAobjDescP
->objName
.objectSpaceName
));
2334 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2335 bsaRC
= BSA_RC_OBJNAME_TOO_LONG
;
2336 XOPENRETURN(BSAHandle
, "BSACreateObject:",
2337 bsaRC
,__FILE__
,__LINE__
);
2340 if (!(xopenGbl
.sessFlags
& FL_IN_DSM_TXN
)) /* first CreateObj */
2341 { /* can't issue RegisterFS if already in Txn */
2342 /*=== Register the file space ===*/
2343 regFilespace
.stVersion
= regFSDataVersion
;
2344 regFilespace
.fsName
= BSAobjDescP
->objName
.objectSpaceName
;
2346 /*=== use resource type for fsType (as it was intended) ===*/
2348 regFilespace
.fsType
= BSAobjDescP
->resourceType
;
2349 regFilespace
.capacity
.lo
= 0;
2350 regFilespace
.capacity
.hi
= 0;
2351 regFilespace
.occupancy
.lo
= 0;
2352 regFilespace
.occupancy
.hi
= 0;
2353 #if _OPSYS_TYPE == DS_AIX
2354 regFilespace
.fsAttr
.unixFSAttr
.fsInfoLength
= strlen(XAPI_FSINFO
) ;
2355 strcpy(regFilespace
.fsAttr
.unixFSAttr
.fsInfo
, XAPI_FSINFO
);
2357 regFilespace
.fsAttr
.dosFSAttr
.fsInfoLength
= strlen(XAPI_FSINFO
) ;
2358 strcpy(regFilespace
.fsAttr
.dosFSAttr
.fsInfo
, XAPI_FSINFO
);
2359 regFilespace
.fsAttr
.dosFSAttr
.driveLetter
= 'X';
2361 rc
= AFSdsmRegisterFS(dsmHandle
, ®Filespace
) ;
2362 if ((rc
!= 0) && (rc
!= DSM_RC_FS_ALREADY_REGED
))
2364 sprintf(traceStr2
, "BSACreateObject(AFSdsmRegisterFS) error rc = %d",rc
);
2365 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2367 xlateRC(BSAHandle
, rc
, &bsaRC
);
2368 XOPENRETURN(BSAHandle
, "BSACreateObject(AFSdsmRegisterFS)",
2369 bsaRC
,__FILE__
,__LINE__
);
2373 /*========================================================
2374 Check for invalid copyType before sending data. Log error
2375 to dsirror.log file.
2376 ========================================================*/
2377 if (BSAobjDescP
->copyType
== BSACopyType_ARCHIVE
)
2378 sendType
= stArchiveMountWait
;
2380 if (BSAobjDescP
->copyType
== BSACopyType_BACKUP
)
2381 sendType
= stBackupMountWait
;
2385 "BSACreateObject: invalid copyType (%d)",
2386 BSAobjDescP
->copyType
);
2387 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2388 bsaRC
= ADSM_RC_INVALID_COPYTYPE
;
2389 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
2390 ourLogEvent_Ex(BSAHandle
,logLocal
, ourMessage
, errPrefix
, logSevError
);
2391 XOPENRETURN(BSAHandle
, "BSACreateObject",
2392 bsaRC
,__FILE__
,__LINE__
);
2395 if ((BSAobjDescP
->objectType
== BSAObjectType_FILE
) ||
2396 (BSAobjDescP
->objectType
== BSAObjectType_DATABASE
) ||
2397 (BSAobjDescP
->objectType
== BSAObjectType_ANY
))
2399 dsmObjType
= DSM_OBJ_FILE
;
2401 if (BSAobjDescP
->objectType
== BSAObjectType_DIRECTORY
)
2402 dsmObjType
= DSM_OBJ_DIRECTORY
;
2406 "BSACreateObject: invalid objectType (%d)",
2407 BSAobjDescP
->objectType
);
2408 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2409 bsaRC
= ADSM_RC_INVALID_OBJTYPE
;
2410 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
2411 ourLogEvent_Ex(BSAHandle
,logLocal
, ourMessage
, errPrefix
, logSevError
);
2412 XOPENRETURN(BSAHandle
, "BSACreateObject",
2413 bsaRC
,__FILE__
,__LINE__
);
2416 /*==================================================================
2417 put in a check here - count the number of objects per txn
2418 and compare with xopenGbl.sessInfo.maxObjPerTxn
2419 If reach the limit, EndTxn and start a new one
2420 OK to do this without telling the BSA caller?
2421 Or should we exit with an error to tell them the limit is reached ?
2422 ==================================================================*/
2424 if (!(xopenGbl
.sessFlags
& FL_IN_DSM_TXN
))
2426 rc
= AFSdsmBeginTxn(dsmHandle
);
2430 sprintf(traceStr2
, "BSACreateObject(AFSdsmBeginTxn) error rc = %d", rc
);
2431 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2432 xlateRC(BSAHandle
, rc
, &bsaRC
);
2433 XOPENRETURN(BSAHandle
, "BSACreateObject(AFSdsmBeginTxn)",
2434 bsaRC
,__FILE__
,__LINE__
);
2436 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_IN_DSM_TXN
); /* set on */
2439 /*=== Backup the data ===*/
2441 /*================================================================
2442 the entire pathname gets copied into hl during parsing, so
2443 check for that max len as well. For now these are the same value.
2444 =================================================================*/
2445 if (strlen(BSAobjDescP
->objName
.pathName
) >
2446 min(DSM_MAX_HL_LENGTH
, BSA_MAX_PATHNAME
))
2448 sprintf(traceStr2
, "BSACreateObject: pathName too long (%" AFS_SIZET_FMT
")",
2449 strlen(BSAobjDescP
->objName
.pathName
));
2450 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2451 bsaRC
= BSA_RC_OBJNAME_TOO_LONG
;
2452 XOPENRETURN(BSAHandle
, "BSACreateObject",
2453 bsaRC
,__FILE__
,__LINE__
);
2456 strcpy(objName
.fs
,BSAobjDescP
->objName
.objectSpaceName
) ;
2457 /*=== previous code to use only ll field ===*/
2458 /*objName.hl[0] = '\0';
2459 strcpy(objName.ll,BSAobjDescP->objName.pathName) ;
2461 xparsePath(BSAHandle
, BSAobjDescP
->objName
.pathName
, objName
.hl
, objName
.ll
);
2462 objName
.objType
= dsmObjType
;
2464 objAttrArea
.stVersion
= ObjAttrVersion
;
2465 strcpy(objAttrArea
.owner
,BSAobjDescP
->Owner
.appObjectOwner
);
2466 objAttrArea
.sizeEstimate
.hi
= BSAobjDescP
->size
.left
;
2467 objAttrArea
.sizeEstimate
.lo
= BSAobjDescP
->size
.right
;
2468 objAttrArea
.objCompressed
= bFalse
; /* let COMPRESSION option decide */
2469 /*=== whether there's actually compression ===*/
2470 objAttrArea
.objInfoLength
= sizeof(XAPIObjInfo
);
2471 objAttrArea
.objInfo
= (char *)&xapiObjInfo
;
2473 memset(&xapiObjInfo
,0x00,sizeof(XAPIObjInfo
));
2474 strcpy(xapiObjInfo
.resourceType
, BSAobjDescP
->resourceType
);
2475 xapiObjInfo
.size
.left
= BSAobjDescP
->size
.left
;
2476 xapiObjInfo
.size
.right
= BSAobjDescP
->size
.right
;
2477 strcpy(xapiObjInfo
.partDesc
, BSAobjDescP
->desc
);
2478 strcpy(xapiObjInfo
.partObjInfo
, BSAobjDescP
->objectInfo
);
2480 /*=== check if a lifecycle group name was passed to us ===*/
2481 if (strlen(BSAobjDescP
->lGName
))
2482 objAttrArea
.mcNameP
= (char *)BSAobjDescP
->lGName
;
2484 objAttrArea
.mcNameP
= NULL
;
2486 dataBlkArea
.stVersion
= DataBlkVersion
;
2487 if (BSAdataBlockP
== NULL
)
2489 dataBlkArea
.bufferPtr
= NULL
;
2490 dataBlkArea
.bufferLen
= 0;
2494 dataBlkArea
.bufferPtr
= BSAdataBlockP
->bufferPtr
;
2495 dataBlkArea
.bufferLen
= BSAdataBlockP
->bufferLen
;
2498 /*=======================================================
2499 always issue BindMC because we don't expect applications
2500 to call ResolveLifecycleGroup since it isn't in the
2501 Data Movement subset
2502 =======================================================*/
2503 mcBindKey
.stVersion
= mcBindKeyVersion
;
2504 rc
= AFSdsmBindMC(dsmHandle
, &objName
, sendType
, &mcBindKey
);
2507 sprintf(traceStr2
, "BSACreateObject(AFSdsmBindMC): error rc = %d", rc
);
2508 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2509 xlateRC(BSAHandle
, rc
, &bsaRC
);
2510 XOPENRETURN(BSAHandle
, "BSACreateObject(dsnBindMC)",
2511 bsaRC
,__FILE__
,__LINE__
);
2514 /*=== now update state since we'll issue the base Send call ===*/
2516 xopenGbl
.oper
= OPER_SEND_ISSUED
; /* save state for EndData later */
2520 case (stBackupMountWait
) :
2521 rc
= AFSdsmSendObj(dsmHandle
,
2529 case (stArchiveMountWait
) :
2530 archData
.stVersion
= sndArchiveDataVersion
;
2531 archData
.descr
= (char *)(BSAobjDescP
->desc
);
2532 rc
= AFSdsmSendObj(dsmHandle
,
2542 if (rc
!= DSM_RC_OK
)
2544 sprintf(traceStr2
, "BSACreateObject(AFSdsmSendObj) error rc = %d", rc
);
2545 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2547 if (rc
== DSM_RC_WILL_ABORT
) /* save flag */
2548 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_RC_WILL_ABORT
);
2550 xlateRC(BSAHandle
, rc
, &bsaRC
);
2551 XOPENRETURN(BSAHandle
, "BSACreateObject(AFSdsmSendObj)",
2552 bsaRC
,__FILE__
,__LINE__
);
2554 XOPENRETURN(BSAHandle
, "BSACreateObject",
2555 BSA_RC_SUCCESS
, __FILE__
,__LINE__
);
2559 BSA_Int16
BSADeleteObject(
2562 ObjectName
*BSAobjNameP
,
2567 BSA_Int16 bsaRC
= 0;
2568 dsUint32_t dsmHandle
;
2569 dsUint16_t reason
; /* for AFSdsmEndTxn */
2570 dsmObjName dsmobjName
;
2575 delList
*llHeadP
= NULL
;
2576 delList
*llTailP
= NULL
;
2579 char errPrefix
[DSM_MAX_RC_MSG_LENGTH
+ 1];
2580 char ourMessage
[DSM_MAX_RC_MSG_LENGTH
+ 1];
2585 printf("TSM library not mounted. \n");
2587 if (dsm_MountLibrary())
2589 printf("TSM Library initialisation failed. \n");
2593 printf("TSM Library initialisation SUCCESS. \n");
2597 memset(errPrefix
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
2598 memset(ourMessage
, '\0', DSM_MAX_RC_MSG_LENGTH
+ 1);
2600 dsmHandle
= BSAHandle
;
2602 sprintf(traceStr2
, "BSADeleteObject ENTRY: BSAHandle:%ld CopyType:%d \n ObjName:'%.*s%.*s' copyidP:'%lu %lu'.",
2605 100,BSAobjNameP
->objectSpaceName
,
2606 100,BSAobjNameP
->pathName
,
2609 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2610 if (copyType
!= BSACopyType_ARCHIVE
)
2613 "BSADeleteObject: invalid copyType %d",
2615 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2616 bsaRC
= ADSM_RC_INVALID_COPYTYPE
;
2617 strcpy(ourMessage
, ourRCMsg(bsaRC
, errPrefix
));
2618 ourLogEvent_Ex(BSAHandle
, logLocal
, ourMessage
, errPrefix
, logSevError
);
2619 XOPENRETURN(BSAHandle
, "BSADeleteObject",
2620 bsaRC
,__FILE__
,__LINE__
);
2623 if (!(xopenGbl
.sessFlags
& FL_IN_BSA_TXN
))
2625 sprintf(traceStr2
, "BSADeleteObject issued without BSABeginTxn");
2626 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2628 bsaRC
= BSA_RC_BAD_CALL_SEQUENCE
;
2629 XOPENRETURN(BSAHandle
, "BSADeleteObject:",
2630 bsaRC
,__FILE__
,__LINE__
);
2633 strcpy(dsmobjName
.fs
, BSAobjNameP
->objectSpaceName
);
2634 xparsePath(BSAHandle
, BSAobjNameP
->pathName
, dsmobjName
.hl
, dsmobjName
.ll
);
2635 dsmobjName
.objType
= DSM_OBJ_FILE
;
2637 if (!copyidP
) /* NULL, so query and delete all with same name */
2639 if (xopenGbl
.sessFlags
& FL_IN_DSM_TXN
)
2640 /*=== if a trxn had been started, end it before doing Query ===*/
2642 rc
= AFSdsmEndTxn(dsmHandle
, DSM_VOTE_COMMIT
, &reason
);
2643 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_DSM_TXN
); /* set off */
2645 rc
= buildList(dsmHandle
, &dsmobjName
, &llHeadP
, &llTailP
);
2648 bsaRC
= BSA_RC_OBJECT_NOT_FOUND
;
2649 XOPENRETURN(BSAHandle
, "BSADeleteObject(buildList)",
2650 bsaRC
,__FILE__
,__LINE__
);
2654 if (!(xopenGbl
.sessFlags
& FL_IN_DSM_TXN
)) /* first call */
2656 rc
= AFSdsmBeginTxn(dsmHandle
);
2659 xlateRC(BSAHandle
, rc
, &bsaRC
);
2660 XOPENRETURN(dsmHandle
,"BSADeleteObject(AFSdsmBeginTxn)",
2661 bsaRC
,__FILE__
,__LINE__
);
2663 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_IN_DSM_TXN
); /* set on */
2666 delType
= dtArchive
;
2667 delInfo
.archInfo
.stVersion
= delArchVersion
;
2669 if (copyidP
) /* single ID to delete */
2671 delInfo
.archInfo
.objId
.hi
= copyidP
->left
;
2672 delInfo
.archInfo
.objId
.lo
= copyidP
->right
;
2674 if ((rc
= AFSdsmDeleteObj(dsmHandle
,delType
,delInfo
)) != DSM_RC_OK
)
2676 sprintf(traceStr2
, "BSADeleteObject: AFSdsmDeleteObj error rc = %d", rc
);
2677 ourTrace(dsmHandle
,TrFL
, traceStr2
);
2680 else /* multiple IDs to delete */
2685 delInfo
.archInfo
.objId
.hi
= ll
->objId
.hi
;
2686 delInfo
.archInfo
.objId
.lo
= ll
->objId
.lo
;
2687 if ((rc
= AFSdsmDeleteObj(dsmHandle
, delType
, delInfo
)) != DSM_RC_OK
)
2689 sprintf(traceStr2
, "BSADeleteObject: AFSdsmDeleteObj error rc = %d", rc
);
2690 ourTrace(dsmHandle
, TrFL
, traceStr2
);
2691 /*=== break and get out of loop, or keep going? ===*/
2693 /*=== incr to next list entry ===*/
2696 /*=== free list now that done ===*/
2697 rc
= freeList(&llHeadP
, &llTailP
);
2700 xlateRC(BSAHandle
, rc
, &bsaRC
);
2701 XOPENRETURN(BSAHandle
,"BSADeleteObject",
2702 bsaRC
,__FILE__
,__LINE__
)
2705 BSA_Int16
BSAMarkObjectInactive(
2707 ObjectName
*BSAobjNameP
2711 BSA_Int16 bsaRC
= 0;
2712 dsUint32_t dsmHandle
;
2714 dsmObjName dsmobjName
;
2716 qryBackupData queryBuffer
; /* for query Backup */
2717 qryRespBackupData qbDataArea
;
2718 DataBlk qDataBlkArea
;
2723 dsUint16_t reason
; /* for AFSdsmEndTxn */
2724 /*=== build list of all objTypes we find for this name ===*/
2727 dsUint8_t listObjType
[5]; /* only 2 objTypes defined today */
2728 dsUint32_t listCopyGroup
[5];
2733 printf("TSM library not mounted. \n");
2735 if (dsm_MountLibrary())
2737 printf("TSM Library initialisation failed. \n");
2741 printf("TSM Library initialisation SUCCESS. \n");
2745 dsmHandle
= BSAHandle
;
2746 memset(&delInfo
, 0x00, sizeof(dsmDelInfo
));
2747 memset(&queryBuffer
, 0x00, sizeof(qryBackupData
));
2749 sprintf(traceStr2
, "BSAMarkObjectInactive ENTRY: BSAHandle:%ld \n ObjName:'%.*s%.*s'.",
2751 100, BSAobjNameP
->objectSpaceName
,
2752 100, BSAobjNameP
->pathName
);
2753 ourTrace(dsmHandle
, TrFL
, traceStr2
);
2755 if (!(xopenGbl
.sessFlags
& FL_IN_BSA_TXN
))
2757 sprintf(traceStr2
, "BSAMarkObjectInactive: issued without BSABeginTxn.");
2758 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2759 bsaRC
= BSA_RC_BAD_CALL_SEQUENCE
;
2760 XOPENRETURN(BSAHandle
, "BSAMarkObjectInactive",
2761 bsaRC
,__FILE__
,__LINE__
);
2764 if (strlen(BSAobjNameP
->objectSpaceName
) > DSM_MAX_FSNAME_LENGTH
)
2766 sprintf(traceStr2
, "BSAMarkObjectInactive: objectSpaceName too long (%" AFS_SIZET_FMT
")", strlen(BSAobjNameP
->objectSpaceName
));
2767 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2769 bsaRC
= BSA_RC_OBJNAME_TOO_LONG
;
2770 XOPENRETURN(BSAHandle
, "BSAMarkObjectInactive",
2771 bsaRC
,__FILE__
,__LINE__
);
2773 /*===============================================================
2774 The entire pathname gets copied into hl during parsing, so
2775 check for that max len as well. For now these are the same value.
2776 =============================================================== */
2777 if (strlen(BSAobjNameP
->pathName
) >
2778 min(DSM_MAX_HL_LENGTH
, BSA_MAX_PATHNAME
))
2780 sprintf(traceStr2
, "BSAMarkObjectInactive: pathName too long (%" AFS_SIZET_FMT
")",
2781 strlen(BSAobjNameP
->pathName
));
2782 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2783 bsaRC
= BSA_RC_OBJNAME_TOO_LONG
;
2784 XOPENRETURN(BSAHandle
, "BSAMarkObjectInactive",
2785 bsaRC
,__FILE__
,__LINE__
);
2788 /*==============================================================
2789 we don't allow any wildcard in name because that could retrieve
2790 LOTS of objects and make list processing more complicated.
2791 XBSA spec implies a single object.
2792 ==============================================================*/
2793 if ( strchr(BSAobjNameP
->objectSpaceName
, '*') ||
2794 strchr(BSAobjNameP
->objectSpaceName
, '?') ||
2795 strchr(BSAobjNameP
->pathName
, '*') ||
2796 strchr(BSAobjNameP
->pathName
, '?'))
2799 sprintf(traceStr2
, "BSAMarkObjectInactive: objName contains a wildcard.")
2801 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2802 /*=== could have a more specific rc, use this for now ===*/
2803 bsaRC
= BSA_RC_ABORT_ACTIVE_NOT_FOUND
;
2804 XOPENRETURN(BSAHandle
, "BSAMarkObjectInactive",
2805 bsaRC
,__FILE__
,__LINE__
);
2808 strcpy(dsmobjName
.fs
, BSAobjNameP
->objectSpaceName
);
2809 xparsePath(BSAHandle
, BSAobjNameP
->pathName
, dsmobjName
.hl
, dsmobjName
.ll
);
2810 dsmobjName
.objType
= DSM_OBJ_ANY_TYPE
;
2812 /*============================================================
2813 A Backup Delete must include the copy Group and objType this
2814 wasn't passed in, so we have to do a query.
2815 ============================================================*/
2817 queryBuffer
.stVersion
= qryBackupDataVersion
;
2818 queryBuffer
.objName
= &dsmobjName
;
2819 queryBuffer
.owner
= xopenGbl
.dsmSessInfo
.owner
;
2820 queryBuffer
.objState
= DSM_ACTIVE
; /* only get active one */
2822 if ((rc
=AFSdsmBeginQuery(dsmHandle
, qtBackup
,
2823 (void *)&queryBuffer
)) != DSM_RC_OK
)
2825 sprintf(traceStr2
, "BSAMarkObjectInactive: Call to AFSdsmBeginQuery for Backup error rc = %d", rc
);
2826 ourTrace(BSAHandle
,TrFL
, traceStr2
);
2827 xlateRC(BSAHandle
, rc
, &bsaRC
);
2828 if ((rc
== DSM_RC_ABORT_NO_MATCH
) || /* special rc for MarkInact */
2829 (rc
== DSM_RC_FILE_SPACE_NOT_FOUND
))
2830 bsaRC
= BSA_RC_ABORT_ACTIVE_NOT_FOUND
;
2832 rc
= AFSdsmEndQuery(dsmHandle
);
2833 XOPENRETURN(BSAHandle
, "BSAMarkObjectInactive: AFSdsmBeginQuery",
2834 bsaRC
,__FILE__
,__LINE__
);
2837 qbDataArea
.stVersion
= qryRespBackupDataVersion
;
2838 qDataBlkArea
.stVersion
= DataBlkVersion
;
2839 qDataBlkArea
.bufferPtr
= (char *)&qbDataArea
;
2840 qDataBlkArea
.bufferLen
= sizeof(qryRespBackupData
);
2843 rc
= AFSdsmGetNextQObj(dsmHandle
, &qDataBlkArea
);
2844 while (((rc
== DSM_RC_MORE_DATA
) ||
2845 (rc
== DSM_RC_FINISHED
)) &&
2846 qDataBlkArea
.numBytes
)
2847 { /* save copy Group we got */
2848 listCopyGroup
[numTypes
] = qbDataArea
.copyGroup
;
2849 listObjType
[numTypes
] = qbDataArea
.objName
.objType
;
2851 rc
= AFSdsmGetNextQObj(dsmHandle
, &qDataBlkArea
);
2854 if (rc
!= DSM_RC_FINISHED
)
2856 xlateRC(BSAHandle
, rc
, &bsaRC
);
2857 if ((rc
== DSM_RC_ABORT_NO_MATCH
) || /* special rc for MarkInact */
2858 (rc
== DSM_RC_FILE_SPACE_NOT_FOUND
))
2859 bsaRC
= BSA_RC_ABORT_ACTIVE_NOT_FOUND
;
2860 rc
= AFSdsmEndQuery(dsmHandle
);
2861 XOPENRETURN(BSAHandle
,"BSAMarkObjectInactive: AFSdsmGetNextQObj",
2862 bsaRC
,__FILE__
,__LINE__
);
2864 rc
= AFSdsmEndQuery(dsmHandle
);
2866 /*=== now we can do the delete ===*/
2867 rc
= AFSdsmBeginTxn(dsmHandle
);
2871 xlateRC(BSAHandle
, rc
, &bsaRC
);
2872 XOPENRETURN(BSAHandle
,"BSAMarkObjectInactive: AFSdsmBeginTxn",
2873 bsaRC
,__FILE__
,__LINE__
);
2875 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
| FL_IN_DSM_TXN
); /* set on */
2877 delType
= dtBackup
; /* this only applies to Backup */
2879 delInfo
.backInfo
.stVersion
= delBackVersion
;
2880 delInfo
.backInfo
.objNameP
= &dsmobjName
;
2882 for (i
=0; i
<numTypes
; i
++)
2884 delInfo
.backInfo
.copyGroup
= listCopyGroup
[i
];
2885 dsmobjName
.objType
= listObjType
[i
];
2887 if ((rc
= AFSdsmDeleteObj(dsmHandle
, delType
, delInfo
)) != DSM_RC_OK
)
2890 sprintf(traceStr2
, "BSAMarkObjectInactive: call to AFSdsmDeleteObj error rc = %d", rc
);
2891 ourTrace(BSAHandle
, TrFL
, traceStr2
);
2895 /*=== issue EndTxn since these can't be nested because of Query sequence ===*/
2896 AFSdsmEndTxn(dsmHandle
, DSM_VOTE_COMMIT
, &reason
);
2897 xopenGbl
.sessFlags
= (xopenGbl
.sessFlags
^ FL_IN_DSM_TXN
); /* set off */
2899 xlateRC(BSAHandle
, rc
, &bsaRC
);
2900 XOPENRETURN(BSAHandle
,"BSAMarkObjectInactive",
2901 bsaRC
,__FILE__
,__LINE__
);