/* * This function will list the contents that we have stored with tsmpipe */ #include #include #include #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,"%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; }