This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
tsmpipe/lib/dsmlist.c

221 lines
5.6 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;
int s_size = 128;
char *s;
s = "\0";
s = malloc(s_size);
if (s==NULL) {
perror("Arg, out of memory?");
exit(255);
}
memset(s,0x00,s_size);
while (size >= base && div < (int)(sizeof SIZES / sizeof *SIZES)-1) {
if (verbose > 2)
fprintf(stderr,"%s: BEFORE - 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,"%s: AFTER - 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) {
extern int verbose;
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" : "-");
if (verbose > 2)
fprintf(stderr,"%s: clientDeduplicated: %d\n",__func__,respBackup.clientDeduplicated);
#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;
}