diff --git a/lib/dsmlist.c b/lib/dsmlist.c index a592a13..5277a19 100644 --- a/lib/dsmlist.c +++ b/lib/dsmlist.c @@ -34,25 +34,63 @@ int tsm_listfile_cb(dsmQueryType qType, DataBlk *qResp, void *userdata) { return -1; } - if (! headerPrinted++) - printf("%40s %2s %s %3s %19s %19s %10s %s\n", - "NAME", - "ST", - "L", - "CED", - "BACKUP", - "EXPIRE", - "EST SIZE", - "ID" - ); - if (qType == qtArchive) { + if (! headerPrinted++) + printf("%40s %2s %s %3s %19s %19s %10s %10s %s\n", + "NAME", + "ST", + "L", + "CED", + "BACKUP", + "EXPIRE", + "EST SIZE", + "ID", + "DESC" + ); + memset(&respArchive,0x00,sizeof(qryRespArchiveData)); qryRespArchiveData *qr = (void *) qResp->bufferPtr; respArchive = *qr; + // The Object Status + switch (respArchive.objName.objType) { + case (DSM_OBJ_FILE) : strcpy(state,"F"); break; + case (DSM_OBJ_DIRECTORY) : strcpy(state,"D"); break; + default : strcpy(state,"?"); + } + + // Location + switch (respArchive.mediaClass) { + case (MEDIA_FIXED) : strcpy(stor,"D"); break; + case (MEDIA_LIBRARY) : strcpy(stor,"T"); break; + default : strcpy(stor,"?"); + } + + // Compression, Encryption, De-Duplication + strcpy(ced,(respArchive.compressType == DSM_OBJ_COMPRESSED_YES ? "C" : + (respArchive.compressType == DSM_OBJ_COMPRESSED_NO ? "-" : "?"))); + + strcat(ced,(respArchive.encryptionType & DSM_ENCRYPT_CLIENTENCRKEY ? "C" : + (respArchive.encryptionType & DSM_ENCRYPT_USER ? "U" : "-"))); + + strcat(ced,respArchive.clientDeduplicated ? "D" : "-"); + + // The Object Status + printf("%40s|%2s|%s|%3s|%19s|%19s|%7.3f MB|%u-%u|%s\n",dsmObjnameToStr(respArchive.objName),state,stor,ced,dsmDateToStr(respArchive.insDate),respArchive.expDate.year ? dsmDateToStr(respArchive.expDate) : "",dsmSizeToNum(respArchive.sizeEstimate),respArchive.objId.hi,respArchive.objId.lo,respArchive.descr); } else if (qType ==qtBackup) { + if (! headerPrinted++) + printf("%40s %2s %s %3s %19s %19s %10s %s\n", + "NAME", + "ST", + "L", + "CED", + "BACKUP", + "EXPIRE", + "EST SIZE", + "ID" + ); + memset(&respBackup,0x00,sizeof(qryRespBackupData)); qryRespBackupData *qr = (void *) qResp->bufferPtr; respBackup = *qr; @@ -86,14 +124,14 @@ int tsm_listfile_cb(dsmQueryType qType, DataBlk *qResp, void *userdata) { strcat(ced,respBackup.clientDeduplicated ? "D" : "-"); + printf("%40s|%2s|%s|%3s|%19s|%19s|%7.3f MB|%u-%u\n",dsmObjnameToStr(respBackup.objName),state,stor,ced,dsmDateToStr(respBackup.insDate),respBackup.expDate.year ? dsmDateToStr(respBackup.expDate) : "",dsmSizeToNum(respBackup.sizeEstimate),respBackup.objId.hi,respBackup.objId.lo); + } else { fprintf(stderr,"tsm_listfile_cb: Internal error: Unknown qType %d\n",qType); return -1; } - printf("%40s|%2s|%s|%3s|%19s|%19s|%7.3f MB|%u-%u\n",dsmObjnameToStr(respBackup.objName),state,stor,ced,dsmDateToStr(respBackup.insDate),respBackup.expDate.year ? dsmDateToStr(respBackup.expDate) : "",dsmSizeToNum(respBackup.sizeEstimate),respBackup.objId.hi,respBackup.objId.lo); - return 1; } diff --git a/lib/dsmsendrecv.c b/lib/dsmsendrecv.c index 025e3b1..e9c9590 100644 --- a/lib/dsmsendrecv.c +++ b/lib/dsmsendrecv.c @@ -298,7 +298,10 @@ int tsm_restorefile(dsUint32_t dsmHandle, char *fsname, char *filename, char *de cbdata.numfound = 0; // Retrieve a list based on the PITDATE or if no PITDATE, the last ACTIVE - rc = tsm_queryfile(dsmHandle,&objName,description,sendtype,verbose,tsm_matchone_cb,&cbdata,pitdate,pitdate ? DSM_ANY_MATCH : DSM_ACTIVE); + if (sendtype == stBackupMountWait) + rc = tsm_queryfile(dsmHandle,&objName,description,sendtype,verbose,tsm_matchone_cb,&cbdata,pitdate,pitdate ? DSM_ANY_MATCH : DSM_ACTIVE); + else + rc = tsm_queryfile(dsmHandle,&objName,description,sendtype,verbose,tsm_matchone_cb,&cbdata,NULL,0); if (rc != DSM_RC_OK) return 0; diff --git a/lib/dsmsession.c b/lib/dsmsession.c index e547be3..cfdfc0d 100644 --- a/lib/dsmsession.c +++ b/lib/dsmsession.c @@ -295,10 +295,15 @@ dsInt16_t tsm_queryfile(dsUint32_t dsmHandle, dsmObjName *objName, char *descrip qaData.stVersion = qryArchiveDataVersion; qaData.objName = objName; qaData.owner = ""; - qaData.insDateLowerBound.year = DATE_MINUS_INFINITE; - qaData.insDateUpperBound.year = DATE_PLUS_INFINITE; - qaData.expDateLowerBound.year = DATE_MINUS_INFINITE; - qaData.expDateUpperBound.year = DATE_PLUS_INFINITE; + if (pitdate) { + fprintf(stderr,"tsm_queryfile: Archive Date Range Query not yet setup\n"); + exit(1); + } else { + qaData.insDateLowerBound.year = DATE_MINUS_INFINITE; + qaData.insDateUpperBound.year = DATE_PLUS_INFINITE; + qaData.expDateLowerBound.year = DATE_MINUS_INFINITE; + qaData.expDateUpperBound.year = DATE_PLUS_INFINITE; + } qaData.descr = description ? description : "*"; qDataP = &qaData; diff --git a/tsmpipe.c b/tsmpipe.c index 0058607..656a58e 100644 --- a/tsmpipe.c +++ b/tsmpipe.c @@ -85,7 +85,7 @@ void usage(void) { " -l length Length of object to store. If guesstimating too large\n" " is better than too small\n" " -D desc Description of archive object\n" - " -P pitdate PITDate (mmddYYYY)\n" + " -P pitdate PITDate (mmddYYYY) (BACKUP Objects)\n" " -O options Extra options to pass to dsmInitEx\n" " -v Verbose. More -v's gives more verbosity\n" ); @@ -135,6 +135,11 @@ int main(int argc, char *argv[]) { exit(1); } + if (pitdate && ! backup) { + fprintf(stderr, "tsmpipe: ERROR: -P can only be used with -A\n"); + exit(1); + } + if (! info) { if (create+xtract+delete+list != 1) { fprintf(stderr, "tsmpipe: ERROR: Must give one of -c, -x, -d or -t\n"); @@ -208,6 +213,7 @@ int main(int argc, char *argv[]) { // Delete an object from TSM if (delete) { + // @todo Delete Archives by date range. if (! tsm_deletefile(dsmHandle,space,filename,desc,sendtype,verbose)) { dsmTerminate(dsmHandle); exit(3); @@ -216,7 +222,8 @@ int main(int argc, char *argv[]) { // Restore from TSM if(xtract) { - if (! tsm_restorefile(dsmHandle,space,filename,desc,sendtype,verbose,pitdate)) { + // @todo Query Archives by date range. + if (! tsm_restorefile(dsmHandle,space,filename,desc,sendtype,verbose,(sendtype == stBackupMountWait ? pitdate : NULL))) { dsmTerminate(dsmHandle); exit(3); } @@ -224,7 +231,8 @@ int main(int argc, char *argv[]) { // List objects in TSM if (list) { - if (! tsm_listfile(dsmHandle,space,filename,desc,sendtype,verbose,pitdate)) { + // @todo Query Archives by date range. + if (! tsm_listfile(dsmHandle,space,filename,desc,sendtype,verbose,(sendtype == stBackupMountWait ? pitdate : NULL))) { dsmTerminate(dsmHandle); exit(3); }