static bool cmdVolWipe(vshControl *ctl, const vshCmd *cmd) { virStorageVolPtr vol; bool ret = false; const char *name; const char *algorithm_str = NULL; int algorithm = VIR_STORAGE_VOL_WIPE_ALG_ZERO; int funcRet; if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (!(vol = vshCommandOptVol(ctl, cmd, "vol", "pool", &name))) { return false; } if (vshCommandOptString(cmd, "algorithm", &algorithm_str) < 0) { vshError(ctl, "%s", _("missing argument")); goto out; } if (algorithm_str && (algorithm = virStorageVolWipeAlgorithmTypeFromString(algorithm_str)) < 0) { vshError(ctl, _("Unsupported algorithm '%s'"), algorithm_str); goto out; } if ((funcRet = virStorageVolWipePattern(vol, algorithm, 0)) < 0) { if (last_error->code == VIR_ERR_NO_SUPPORT && algorithm == VIR_STORAGE_VOL_WIPE_ALG_ZERO) funcRet = virStorageVolWipe(vol, 0); } if (funcRet < 0) { vshError(ctl, _("Failed to wipe vol %s"), name); goto out; } vshPrint(ctl, _("Vol %s wiped\n"), name); ret = true; out: virStorageVolFree(vol); return ret; }
Result StorageVolControlThread::wipeStorageVol() { Result result; result.name = QString("%1_%2").arg(task.srcConName).arg(currPoolName); QString name, algorithm; name = task.object; if (currStoragePool!=NULL) { virStoragePoolFree(currStoragePool); currStoragePool = NULL; }; currStoragePool = virStoragePoolLookupByName( *task.srcConnPtr, currPoolName.toUtf8().data()); //flags: extra flags; not used yet, so callers should always pass 0 unsigned int flags = 0; unsigned int alg = task.args.sign; bool wiped = false; virStorageVol *storageVol = virStorageVolLookupByName( currStoragePool, name.toUtf8().data()); if ( storageVol!=NULL ) { int ret = virStorageVolWipePattern(storageVol, alg, flags); if ( ret<0 ) { result.err = sendConnErrors(); } else wiped = true; virStorageVolFree(storageVol); } else result.err = sendConnErrors(); switch (alg) { case VIR_STORAGE_VOL_WIPE_ALG_ZERO: algorithm.append("ZERO"); break; case VIR_STORAGE_VOL_WIPE_ALG_NNSA: algorithm.append("NNSA"); break; case VIR_STORAGE_VOL_WIPE_ALG_DOD: algorithm.append("DOD"); break; case VIR_STORAGE_VOL_WIPE_ALG_BSI: algorithm.append("BSI"); break; case VIR_STORAGE_VOL_WIPE_ALG_GUTMANN: algorithm.append("GUTMANN"); break; case VIR_STORAGE_VOL_WIPE_ALG_PFITZNER7: algorithm.append("PFITZNER7"); break; case VIR_STORAGE_VOL_WIPE_ALG_PFITZNER33: algorithm.append("PFITZNER33"); break; case VIR_STORAGE_VOL_WIPE_ALG_RANDOM: algorithm.append("RANDOM"); break; case VIR_STORAGE_VOL_WIPE_ALG_SCHNEIER: algorithm.append("SCHNEIER"); break; default: algorithm.append("NONE"); break; }; result.msg.append( QString("'<b>%1</b>' StorageVol %2 Wiped with %3 algorithm.") .arg(name).arg((wiped)?"":"don't").arg(algorithm)); result.result = wiped; return result; }