Just wondering if this patch will get merged to the next version of vbox? Thanks, Ribhi
On Tue, Sep 6, 2011 at 11:42 AM, Ribhi Kamal <[email protected]> wrote: > I don't know if there are rules about changing UUIDs for virtual disks, but > I think there has to be some control over it. Anyway, I would like to share > the following patch with you: > > 1- Fixed places where stderr was used instead of stdout (Breaks scripts) > 2- Added the ability to specify a UUID when converting a raw image to a > virtual disk (VDI/VMDK... etc) > > The following patch is licensed under MIT, the changes were tested on all > windows platforms (32bit and 64bit): > > Index: VBoxInternalManage.cpp > =================================================================== > --- VBoxInternalManage.cpp (revision 38578) > +++ VBoxInternalManage.cpp (working copy) > @@ -1675,7 +1675,7 @@ > void *pvBuf = RTMemAlloc(cbBuf); > if (pvBuf) > { > - RTStrmPrintf(g_pStdErr, "Converting image \"%s\" with size %RU64 > bytes (%RU64MB) to raw...\n", src.c_str(), cbSize, (cbSize + _1M - 1) / > _1M); > + RTStrmPrintf(g_pStdOut, "Converting image \"%s\" with size %RU64 > bytes (%RU64MB) to raw...\n", src.c_str(), cbSize, (cbSize + _1M - 1) / > _1M); > while (offFile < cbSize) > { > size_t cb = (size_t)RT_MIN(cbSize - offFile, cbBuf); > @@ -1823,7 +1823,7 @@ > } > > uint64_t cbSize = VDGetSize(pSrcDisk, VD_LAST_IMAGE); > - RTStrmPrintf(g_pStdErr, "Converting image \"%s\" with size %RU64 > bytes (%RU64MB)...\n", src.c_str(), cbSize, (cbSize + _1M - 1) / _1M); > + RTStrmPrintf(g_pStdOut, "Converting image \"%s\" with size %RU64 > bytes (%RU64MB)...\n", src.c_str(), cbSize, (cbSize + _1M - 1) / _1M); > > /* Create the output image */ > vrc = VDCopy(pSrcDisk, VD_LAST_IMAGE, pDstDisk, dstformat.c_str(), > Index: VBoxManage.cpp > =================================================================== > --- VBoxManage.cpp (revision 38578) > +++ VBoxManage.cpp (working copy) > @@ -101,8 +101,8 @@ > > if (!g_fDetailedProgress) > { > - RTStrmPrintf(g_pStdErr, "0%%..."); > - RTStrmFlush(g_pStdErr); > + RTStrmPrintf(g_pStdOut, "0%%..."); > + RTStrmFlush(g_pStdOut); > } > > /* setup signal handling if cancelable */ > @@ -151,7 +151,7 @@ > LONG lSecsRem = 0; > progress->COMGETTER(TimeRemaining)(&lSecsRem); > > - RTStrmPrintf(g_pStdErr, "(%u/%u) %ls %02u%% => %02u%% (%d > s remaining)\n", ulOperation + 1, cOperations, > bstrOperationDescription.raw(), ulCurrentOperationPercent, ulCurrentPercent, > lSecsRem); > + RTStrmPrintf(g_pStdOut, "(%u/%u) %ls %02u%% => %02u%% (%d > s remaining)\n", ulOperation + 1, cOperations, > bstrOperationDescription.raw(), ulCurrentOperationPercent, ulCurrentPercent, > lSecsRem); > ulLastPercent = ulCurrentPercent; > ulLastOperationPercent = ulCurrentOperationPercent; > } > @@ -166,8 +166,8 @@ > { > if (curVal < 100) > { > - RTStrmPrintf(g_pStdErr, "%u%%...", curVal); > - RTStrmFlush(g_pStdErr); > + RTStrmPrintf(g_pStdOut, "%u%%...", curVal); > + RTStrmFlush(g_pStdOut); > } > } > ulLastPercent = (ulCurrentPercent / 10) * 10; > @@ -208,14 +208,14 @@ > if (SUCCEEDED(hrc)) > { > if (SUCCEEDED(iRc)) > - RTStrmPrintf(g_pStdErr, "100%%\n"); > + RTStrmPrintf(g_pStdOut, "100%%\n"); > else if (g_fCanceled) > RTStrmPrintf(g_pStdErr, "CANCELED\n"); > else > { > if (!g_fDetailedProgress) > - RTStrmPrintf(g_pStdErr, "\n"); > - RTStrmPrintf(g_pStdErr, "Progress state: %Rhrc\n", iRc); > + RTStrmPrintf(g_pStdOut, "\n"); > + RTStrmPrintf(g_pStdOut, "Progress state: %Rhrc\n", iRc); > } > hrc = iRc; > } > @@ -226,6 +226,7 @@ > RTStrmPrintf(g_pStdErr, "Progress object failure: %Rhrc\n", hrc); > } > RTStrmFlush(g_pStdErr); > + RTStrmFlush(g_pStdOut); > return hrc; > } > > Index: VBoxManageAppliance.cpp > =================================================================== > --- VBoxManageAppliance.cpp (revision 38578) > +++ VBoxManageAppliance.cpp (working copy) > @@ -309,7 +309,7 @@ > CHECK_ERROR_BREAK(pAppliance, COMGETTER(Path)(path.asOutParam())); > // call interpret(); this can yield both warnings and errors, so > we need > // to tinker with the error info a bit > - RTStrmPrintf(g_pStdErr, "Interpreting %ls...\n", path.raw()); > + RTStrmPrintf(g_pStdOut, "Interpreting %ls...\n", path.raw()); > rc = pAppliance->Interpret(); > com::ErrorInfo info0(pAppliance, COM_IIDOF(IAppliance)); > > @@ -331,7 +331,7 @@ > break; > } > > - RTStrmPrintf(g_pStdErr, "OK.\n"); > + RTStrmPrintf(g_pStdOut, "OK.\n"); > > // fetch all disks > com::SafeArray<BSTR> retDisks; > Index: VBoxManageDisk.cpp > =================================================================== > --- VBoxManageDisk.cpp (revision 38578) > +++ VBoxManageDisk.cpp (working copy) > @@ -689,6 +689,8 @@ > { "-static", 'F', RTGETOPT_REQ_NOTHING }, > { "--variant", 'm', RTGETOPT_REQ_STRING }, > { "-variant", 'm', RTGETOPT_REQ_STRING }, > + { "--uuid", 'u', RTGETOPT_REQ_STRING }, > + { "-uuid", 'u', RTGETOPT_REQ_STRING } > }; > > RTEXITCODE handleConvertFromRaw(int argc, char *argv[]) > @@ -701,6 +703,7 @@ > const char *filesize = NULL; > unsigned uImageFlags = VD_IMAGE_FLAGS_NONE; > void *pvBuf = NULL; > + RTUUID uuid; > > int c; > RTGETOPTUNION ValueUnion; > @@ -712,6 +715,13 @@ > { > switch (c) > { > + case 'u': // --uuid > + if (RTUuidFromStr(&uuid, ValueUnion.psz) != VINF_SUCCESS) > + { > + return errorSyntax(USAGE_CONVERTFROMRAW, "Invalid UUID > '%s'", ValueUnion.psz); > + } > + break; > + > case 'o': // --format > format = ValueUnion.psz; > break; > @@ -749,7 +759,7 @@ > > if (!srcfilename || !dstfilename || (fReadFromStdIn && !filesize)) > return errorSyntax(USAGE_CONVERTFROMRAW, "Incorrect number of > parameters"); > - RTStrmPrintf(g_pStdErr, "Converting from raw image file=\"%s\" to > file=\"%s\"...\n", > + RTStrmPrintf(g_pStdOut, "Converting from raw image file=\"%s\" to > file=\"%s\"...\n", > srcfilename, dstfilename); > > PVBOXHDD pDisk = NULL; > @@ -787,7 +797,7 @@ > goto out; > } > > - RTStrmPrintf(g_pStdErr, "Creating %s image with size %RU64 bytes > (%RU64MB)...\n", > + RTStrmPrintf(g_pStdOut, "Creating %s image with size %RU64 bytes > (%RU64MB)...\n", > (uImageFlags & VD_IMAGE_FLAGS_FIXED) ? "fixed" : > "dynamic", cbFile, (cbFile + _1M - 1) / _1M); > char pszComment[256]; > RTStrPrintf(pszComment, sizeof(pszComment), "Converted image from %s", > srcfilename); > @@ -808,7 +818,7 @@ > LCHS.cHeads = 0; > LCHS.cSectors = 0; > rc = VDCreateBase(pDisk, format, dstfilename, cbFile, > - uImageFlags, pszComment, &PCHS, &LCHS, NULL, > + uImageFlags, pszComment, &PCHS, &LCHS, &uuid, > VD_OPEN_FLAGS_NORMAL, NULL, NULL); > if (RT_FAILURE(rc)) > { > Index: VBoxManageHelp.cpp > =================================================================== > --- VBoxManageHelp.cpp (revision 38578) > +++ VBoxManageHelp.cpp (working copy) > @@ -542,10 +542,12 @@ > "VBoxManage convertfromraw <filename> > <outputfile>\n" > " [--format > VDI|VMDK|VHD]\n" > " [--variant > Standard,Fixed,Split2G,Stream,ESX]\n" > + " [--uuid <uuid>]\n" > #ifndef RT_OS_WINDOWS > "VBoxManage convertfromraw stdin <outputfile> > <bytes>\n" > " [--format > VDI|VMDK|VHD]\n" > " [--variant > Standard,Fixed,Split2G,Stream,ESX]\n" > + " [--uuid <uuid>]\n" > #endif > "\n"); > > @@ -759,7 +761,7 @@ > > if (rc == 'h') > { > - showLogo(g_pStdErr); > + showLogo(g_pStdOut); > #ifndef VBOX_ONLY_DOCS > if (g_fInternalMode) > printUsageInternal(fUsageCategory, g_pStdOut); > -- -- Ribhi
_______________________________________________ vbox-dev mailing list [email protected] http://vbox.innotek.de/mailman/listinfo/vbox-dev
