[vbox-dev] vboxmanage patch -- Stdout vs. StdErr fixes and added ability to use optional UUID with convertfromraw

Ribhi Kamal rbhkamal at gmail.com
Tue Sep 6 15:42:05 GMT 2011


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);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.virtualbox.org/pipermail/vbox-dev/attachments/20110906/ae325e31/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vboxmanage.diff
Type: text/x-patch
Size: 7818 bytes
Desc: not available
URL: <http://www.virtualbox.org/pipermail/vbox-dev/attachments/20110906/ae325e31/attachment.bin>


More information about the vbox-dev mailing list