217 lines
5.5 KiB
C
217 lines
5.5 KiB
C
/*
|
|
* This function will list the contents that we have stored with tsmpipe
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "dsmrc.h"
|
|
#include "dsmapitd.h"
|
|
#include "../tsmpipe.h"
|
|
|
|
dsBool_t headerPrinted=bFalse; // Have we rendered the heading row yet
|
|
|
|
char *units(double size) {
|
|
extern int verbose;
|
|
static const char *SIZES[] = { "B", "KiB", "MiB", "GiB" };
|
|
int div = 0;
|
|
double rem = 0;
|
|
int base = 1024;
|
|
|
|
char *s;
|
|
|
|
s = "\0";
|
|
s = malloc(128);
|
|
if (s==NULL) {
|
|
perror("Arg, out of memory?");
|
|
exit(255);
|
|
}
|
|
memset(s,0x00,(sizeof s));
|
|
|
|
while (size >= base && div < (int)(sizeof SIZES / sizeof *SIZES)-1) {
|
|
if (verbose > 2)
|
|
fprintf(stderr,"BEFORE: %s: SIZE: [%3.2f], DIV: [%d], REM: [%3.2f]\n",__func__,size,div,rem);
|
|
|
|
rem = ((int)size % base);
|
|
size /= base;
|
|
div++;
|
|
}
|
|
|
|
if (verbose > 2)
|
|
fprintf(stderr,"AFTER: %s: SIZE: [%3.2f], DIV: [%d], REM: [%3.2f]\n",__func__,size,div,rem);
|
|
|
|
sprintf(s,"%3.2f %s",size,SIZES[div]);
|
|
|
|
return s;
|
|
}
|
|
|
|
/*
|
|
* Our Callback to show what is in TSM
|
|
*/
|
|
int tsm_listfile_cb(dsmQueryType qType, DataBlk *qResp, void *userdata, dsBool_t friendly) {
|
|
char stor[2];
|
|
char state[3];
|
|
char ced[4];
|
|
char objInfo[DSM_MAX_OBJINFO_LENGTH];
|
|
char *s;
|
|
s = malloc(1024);
|
|
|
|
if (userdata != NULL ) {
|
|
debugLog(0,__func__,"ERROR: Internal error: userdata != NULL",0);
|
|
return -1;
|
|
}
|
|
|
|
if (qType == qtArchive) {
|
|
if (! headerPrinted++) {
|
|
printf("%-40s %2s %s %3s %-19s %-19s %12s %-10s %-10s",
|
|
"NAME",
|
|
"ST",
|
|
"L",
|
|
"CED",
|
|
"ARCHIVE",
|
|
"EXPIRE",
|
|
"SIZE",
|
|
"ID",
|
|
"DESC"
|
|
);
|
|
|
|
#ifdef USE_DIGEST
|
|
printf(" %s","OBJINFO");
|
|
#endif
|
|
printf("\n");
|
|
}
|
|
|
|
qryRespArchiveData respArchive;
|
|
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" : "-");
|
|
|
|
if (friendly) {
|
|
s = units((double)dsmSizeToNum(respArchive.sizeEstimate,bFalse));
|
|
} else {
|
|
sprintf(s,"%7.3f MB",dsmSizeToNum(respArchive.sizeEstimate,bTrue));
|
|
}
|
|
|
|
// The Object Status
|
|
printf("%-40s|%2s|%s|%3s|%-19s|%-19s|%12s|%u-%8u|%10s",dsmObjnameToStr(respArchive.objName),state,stor,ced,dsmDateToStr(respArchive.insDate),respArchive.expDate.year ? dsmDateToStr(respArchive.expDate) : "",s,respArchive.objId.hi,respArchive.objId.lo,respArchive.descr);
|
|
|
|
} else if (qType == qtBackup) {
|
|
if (! headerPrinted++) {
|
|
printf("%-40s %2s %s %3s %-19s %-19s %12s %-10s",
|
|
"NAME",
|
|
"ST",
|
|
"L",
|
|
"CED",
|
|
"BACKUP",
|
|
"EXPIRE",
|
|
"SIZE",
|
|
"ID"
|
|
);
|
|
|
|
#ifdef USE_DIGEST
|
|
printf(" %s","OBJINFO");
|
|
#endif
|
|
printf("\n");
|
|
}
|
|
|
|
qryRespBackupData respBackup;
|
|
|
|
memset(&respBackup,0x00,sizeof(qryRespBackupData));
|
|
qryRespBackupData *qr = (void *) qResp->bufferPtr;
|
|
respBackup = *qr;
|
|
|
|
// The Object Status
|
|
switch (respBackup.objName.objType) {
|
|
case (DSM_OBJ_FILE) : strcpy(state,"F"); break;
|
|
case (DSM_OBJ_DIRECTORY) : strcpy(state,"D"); break;
|
|
default: strcpy(state,"?");
|
|
}
|
|
|
|
switch (respBackup.objState) {
|
|
case (DSM_ACTIVE) : strcat(state,"A"); break;
|
|
case (DSM_INACTIVE) : strcat(state,"I"); break;
|
|
default: strcat(state,"?");
|
|
}
|
|
|
|
// Location
|
|
switch (respBackup.mediaClass) {
|
|
case (MEDIA_FIXED) : strcpy(stor,"D"); break;
|
|
case (MEDIA_LIBRARY) : strcpy(stor,"T"); break;
|
|
default: strcpy(stor,"?");
|
|
}
|
|
|
|
// Compression, Encryption, De-Duplication
|
|
strcpy(ced,(respBackup.compressType == DSM_OBJ_COMPRESSED_YES ? "C" :
|
|
(respBackup.compressType == DSM_OBJ_COMPRESSED_NO ? "-" : "?")));
|
|
|
|
strcat(ced,(respBackup.encryptionType & DSM_ENCRYPT_CLIENTENCRKEY ? "C" :
|
|
(respBackup.encryptionType & DSM_ENCRYPT_USER ? "U" : "-")));
|
|
|
|
strcat(ced,respBackup.clientDeduplicated ? "D" : "-");
|
|
|
|
#ifdef USE_DIGEST
|
|
// Object Info
|
|
memset(&objInfo,0x00,sizeof(objInfo));
|
|
|
|
if (respBackup.objInfolen)
|
|
strncat(objInfo,respBackup.objInfo,respBackup.objInfolen);
|
|
#endif
|
|
|
|
if (friendly) {
|
|
s = units((double)dsmSizeToNum(respBackup.sizeEstimate,bFalse));
|
|
} else {
|
|
sprintf(s,"%7.3f MB",dsmSizeToNum(respBackup.sizeEstimate,bTrue));
|
|
}
|
|
|
|
printf("%-40s|%2s|%s|%3s|%19s|%19s|%12s|%u-%8u",dsmObjnameToStr(respBackup.objName),state,stor,ced,dsmDateToStr(respBackup.insDate),respBackup.expDate.year ? dsmDateToStr(respBackup.expDate) : "",s,respBackup.objId.hi,respBackup.objId.lo);
|
|
} else {
|
|
fprintf(stderr,"%s: UNKNOWN Type %d\n",__func__,qType);
|
|
return -1;
|
|
}
|
|
|
|
#ifdef USE_DIGEST
|
|
printf("|%s",objInfo);
|
|
#endif
|
|
printf("\n");
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* List objects that are in TSM
|
|
*/
|
|
int tsm_listfile(dsUint32_t sesshandle, dsmQueryType qType, qryArchiveData qaData, qryBackupData qbData, dsBool_t friendly) {
|
|
dsInt16_t rc=0;
|
|
|
|
rc = tsm_queryfile(sesshandle,qType,tsm_listfile_cb,NULL,qaData,qbData,friendly);
|
|
|
|
if (rc != DSM_RC_OK && rc != DSM_RC_ABORT_NO_MATCH)
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|